Docker---基于registry镜像创建私有仓库、创建数据卷容器、实现容器之间的互联----超详细

本文介绍如何使用Docker搭建私有仓库并实现镜像的上传下载,创建数据卷容器以实现容器间的数据共享,以及通过互联实现容器间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:建立私有仓库

1.1:docker原生仓库的基本原理

  1. docker镜像可以托管到docker hub中,和将代码库托管到github是一样的原理。有时候我们需要在部门或者团队内部共享docker镜像,我们就可以搭建私有仓库。
  2. 仓库的原理:Docker模型的核心部分是有效的利用分层镜像的机制,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体应用的镜像。不同的Docker容器可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。由于最终镜像是以压缩包的方式静态存储在服务器端,这种存储适用于对象存储
  3. 使用docker pull 获取镜像的过程
    在这里插入图片描述
1.客户端像索引请求nginx的镜像地址。
2.索引回复:给与nginx所在仓库A、nginx镜像的校验码(Checksum)和所有层的Token
3.客户端像仓库A请求nginx的所有层(仓库A负责存储nginx,以及它所依赖的层)。
4.仓库A向索引发起请求,验证用户Token的合法性。
5.索引返回这次请求是否合法
6.客户端从仓库下载所有的层,仓库从后端存储中获取实际的文件数据,返给客户端。

1.2:搭建docker私有仓库

  1. 下载registry镜像
  • registry是docker官方提供的一个创建镜像仓库的模板
[root@docker ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               new                 3b3c137b26b3        26 hours ago        480MB
centos              latest              0d120b6ccaa8        3 months ago        215MB
registry            latest              2d4f4b5309b1        4 months ago        26.2MB   ###刚下载的镜像
  1. 创建私有仓库加速地址
[root@docker ~]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://rk1tza7i.mirror.aliyuncs.com"],   ###注意:这里两段之间用“,”隔开,否则报错
  "insecure-registries":["20.0.0.111:5000"]  ###添加本地加速地址
}
  1. 创建私有仓库
[root@docker ~]# systemctl restart docker   ###重启容器服务
[root@docker ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
53f881566e11c5c975e83afb0cdcffd79f82198d530ec0f3bda324f358a8b92e
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                    NAMES
53f881566e11        registry            "/entrypoint.sh /etc…"   14 seconds ago      Up 13 seconds                0.0.0.0:5000->5000/tcp   eloquent_grothendieck
###5000:是私有仓库的端口号
###-v:自动创建数据卷,如果没有挂载的目录-v会自动创建此目录
###-d:表示开启守护进程
###-p:表示端口映射 宿主机:容器
  1. 这里我们将本地已有的nginx:new镜像(没有的可以pull一个)上传到我们创建的仓库里面去
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               new                 3b3c137b26b3        28 hours ago        480MB
  • 在上传此镜像前一定要先将镜像的标签改一下,改成仓库的地址和对应的端口号,要不然找不到上传的地址
[root@docker ~]# docker tag nginx:new 20.0.0.111:5000/nginx_test
[root@docker ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
20.0.0.111:5000/nginx_test   latest              3b3c137b26b3        28 hours ago        480MB    ###修改过标签后的镜像
nginx                        new                 3b3c137b26b3        28 hours ago        480MB
  1. 上传此镜像到私有仓库
[root@docker ~]# docker push 20.0.0.111:5000/nginx_test
The push refers to repository [20.0.0.111:5000/nginx_test]
8437ba9d4bc4: Pushed 
7c91d18361b4: Pushed 
52360c125b76: Pushed 
30d302c7de84: Pushed 
ebd3e9f1cac2: Pushed 
66522aa70c9b: Pushed 
e3e2dd01f84d: Pushed 
4ed5e6854295: Pushed 
613be09ab3c0: Pushed 
latest: digest: sha256:283c785ae93b6323d7164e0ea698bdf23abae6fbe3443b6a0a0c37279e1c9277 size: 2204
  1. 获取私有仓库列表
[root@docker ~]# curl -XGET http://20.0.0.111:5000/v2/_catalog
{"repositories":["nginx_test"]}   ###可以看到镜像成功上传到私有仓库
  1. 尝试从私有仓库下载刚上传的镜像
  • 先删除原有的镜像,以便于观察
[root@docker ~]# docker rmi 20.0.0.111:5000/nginx_test:latest 
Untagged: 20.0.0.111:5000/nginx_test:latest
Untagged: 20.0.0.111:5000/nginx_test@sha256:283c785ae93b6323d7164e0ea698bdf23abae6fbe3443b6a0a0c37279e1c9277
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               new                 3b3c137b26b3        28 hours ago        480MB
  • 从私有仓库下载刚上传的镜像
[root@docker ~]# docker pull 20.0.0.111:5000/nginx_test
Using default tag: latest
latest: Pulling from nginx_test
Digest: sha256:283c785ae93b6323d7164e0ea698bdf23abae6fbe3443b6a0a0c37279e1c9277
Status: Downloaded newer image for 20.0.0.111:5000/nginx_test:latest
20.0.0.111:5000/nginx_test:latest
[root@docker ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
20.0.0.111:5000/nginx_test   latest              3b3c137b26b3        28 hours ago        480MB   ###下载成功(这里的下载速度是非常快的)
nginx                        new                 3b3c137b26b3        28 hours ago        480MB

二:创建数据卷容器

2.1:什么是数据卷

2.1.1:数据卷(Data Volumes)

  • 数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器,它可以提供很多有用的特性:

    1. 数据卷可以在容器之间共享和重用
    2. 对数据卷的修改会立马生效
    3. 对数据卷的更新,不会影响镜像
    4. 数据卷默认会一直存在,即使容器被删除

2.1.2:数据卷的相关操作

  • 创建数据卷
 docker volume create     名字
  • 此时,数据卷默认会放到/var/lib/docker/volumes路径下,会发现所新建的数据卷位置,查看命令如下:
ls -l /var/lib/docker/volumes

2.1.3:数据卷的注意点

  • 数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,所以要及时删除

2.2:什么是数据卷容器

2.2.1:数据卷容器

  • 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
  • 数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载

2.2.2:创建数据卷容器

  1. 创建数据卷容器
[root@docker ~]# docker run --name test100 -v /data1 -v /data2 -it centos /bin/bash
###参数解释:
--name:指定名称
-v:创建数据挂载点/-v 不可使用:-v /data1 /data2 的格式,一定要分开写###
[root@61fe96a9d352 /]# ls  
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var   
###这里默认创建好容器后自动进入到容器,可以看到data1和data2已经存在,创建成功
  1. 重新开一个节点查看容器状态
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
61fe96a9d352        centos              "/bin/bash"              4 minutes ago       Up 4 minutes                                        test100
53f881566e11        registry            "/entrypoint.sh /etc…"   3 hours ago         Up 3 hours                 0.0.0.0:5000->5000/tcp   eloquent_grothendieck
  1. 新建一个容器挂载数据卷容器test10
[root@docker ~]# docker run -it --volumes-from test100 --name test10 centos /bin/bash
###参数解释:
--volumes-from:指定挂载的数据卷容器###
[root@38b792f8de40 /]# ls  
bin  data1  data2  dev	etc  home  lib	lib64  lost+found  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
  1. 测试容器之间是否可以实现共享挂载目录
  • 先去数据卷容器的共享目录下面创建测试文件
[root@61fe96a9d352 /]# cd data1    ###进入data1目录
[root@61fe96a9d352 data1]# touch 1.txt   ###创建文件
[root@61fe96a9d352 data1]# ls
1.txt
[root@61fe96a9d352 data1]# cd /data2   ###进入data2目录
[root@61fe96a9d352 data2]# touch 2.txt   ###创建文件
[root@61fe96a9d352 data2]# ls
2.txt
  1. 再到挂载共享目录的容器下查看文件是否被共享成功
[root@38b792f8de40 /]# cd tata1
bash: cd: tata1: No such file or directory
[root@38b792f8de40 /]# cd data1
[root@38b792f8de40 data1]# ls
1.txt
[root@38b792f8de40 data1]# cd /data2
[root@38b792f8de40 data2]# ls
2.txt   ###文件成功共享,测试成功

三:实现容器间的互联

3.1:创建容器wukong10

[root@docker ~]# docker run -itd -P --name wukong10 centos /bin/bash
278cd2d3aa4a78c4a0780703798969f377b4b5047d56a098288955e6316794c4

3.2:创建容器wukong20

[root@docker ~]# docker run -itd -P --name wukong20 --link wukong10:wukong10 centos /bin/bash   
###--link:容器之间建立通讯的参数  //--link name:alias  --link 容器名:别名
fd999ba99b66d884a2fcdc1b30f4093a69f1a45e94cb52cff2ef06ac95b8553a

3.3:进入容器测试

  • 进入容器wukong20,ping:wukong10
[root@docker ~]# docker exec -it wukong20 /bin/bash
[root@fd999ba99b66 /]# ping wukong10
PING wukong10 (172.17.0.3) 56(84) bytes of data.
64 bytes from wukong10 (172.17.0.3): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from wukong10 (172.17.0.3): icmp_seq=2 ttl=64 time=0.087 ms
64 bytes from wukong10 (172.17.0.3): icmp_seq=3 ttl=64 time=0.039 ms
  • OK,容器已建立互联
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值