1、docker仓库管理:我们拉取一个镜像的时候,是直接从docker 官网拉取,推送时也是推送到官网公共仓库里去;
对于企业来讲不太好,好像自己做了一个项目,没必要上传上去了;
registary : docker 官网提供的一个镜像,可以用它来创建本地私有的docker仓库;可以用这个镜像运行一个容器,这个容器就是私有仓库;
下载这个镜像;docker pull registry
[root@localhost_001 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
[root@localhost_001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuanhh_test latest 56830bb9c402 11 hours ago 69.8MB
ubuntu latest 94e814e2efa8 3 days ago 88.9MB
registry latest f32a97de94e1 6 days ago 25.8MB
2、以 registry 镜像启动容器: docker run -d -p 5000:5000 registry -p 表示把容器的端口映射到宿主机,左边为宿主机监听端口,右边容器监听端口;
[root@localhost_001 ~]# docker run -d -p 5000:5000 registry
2c544fa07d69d45e897a97a0a81f479b4f08a97ed058911328bffa529a4f373b
[root@localhost_001 ~]#
[root@localhost_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c544fa07d69 registry "/entrypoint.sh /etc…" 11 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp angry_engelbart
3、访问这个私有仓库; 前提是需要传递一个镜像到私有仓库里才可以;
首先给本地镜像做一个tag 标记:docker tag fenye 192.168.149.129:5000/fenye
把标记的镜像推给私有仓库: docker push 192.168.149.129:5000/fenye
[root@localhost_001 ~]# docker tag fenye 192.168.149.129:5000/fenye #打个标记;
[root@localhost_001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 8 days ago 25.8MB
fenye latest 1e1148e4cc2c 3 months ago 202MB
192.168.149.129:5000/fenye latest 1e1148e4cc2c 3 months ago 202MB
centos latest 1e1148e4cc2c 3 months ago 202MB
[root@localhost_001 ~]# docker push 192.168.149.129:5000/fenye #推送是报错;
The push refers to repository [192.168.149.129:5000/fenye]
Get https://192.168.149.129:5000/v2/: http: server gave HTTP response to HTTPS client
然后需要修改:/etc/docker/daemon.json配置文件,指定一个私有地址,要不然不知道仓库在哪里的;不然会报错;
[root@localhost_001 ~]# cat /etc/docker/daemon.json
{ "insecure-registries":["192.168.149.129:5000"] }
重新启动docker 和registry; sysmtemctl restart docker | docker start 容器ID
[root@localhost_001 ~]# systemctl restart docker #重启docker;
[root@localhost_001 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c544fa07d69 registry "/entrypoint.sh /etc…" 12 minutes ago Exited (2) 16 seconds ago angry_engelbart
[root@localhost_001 ~]# docker start 2c544fa07d69 #重启registry容器;
2c544fa07d69
[root@localhost_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c544fa07d69 registry "/entrypoint.sh /etc…" 13 minutes ago Up 4 seconds 0.0.0.0:5000->5000/tcp angry_engelbart
注释:然会再次推送 fenye 镜像到私有仓库; docker push 192.168.149.129:5000/fenye
查看推送上来的镜像: curl 192.168.149.129:5000/v2/_catalog
[root@localhost_001 ~]# docker tag yuanhh:190312 192.168.149.129:5000/yuanhh
[root@localhost_001 ~]# docker push 192.168.149.129:5000/yuanhh
The push refers to repository [192.168.149.129:5000/yuanhh]
071d8bd76517: Mounted from fenye
latest: digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0 size: 529
[root@localhost_001 ~]# curl 127.0.0.1:5000/v2/_catalog #查看私有仓库的镜像;
{"repositories":["fenye","yuanhh"]}
[root@localhost_001 ~]# curl 192.168.149.129:5000/v2/_catalog #查看私有仓库的镜像;
{"repositories":["fenye","yuanhh"]}
4、我们建私有仓库,肯定不是只为了自己使用,当然是为其他的主机提供上传和下载的服务;
登录另一台机器:IP 192.168.149.130 安装并启动docker 服务; 并在 /etc/docker/daemon.json 指定私有仓库的地址就可以了;
[root@localhost_002 ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.149.129:5000"] }
下载: docker pull 192.168.149.129:5000/yuanhh 私有仓库的地址
注释:当然也可以直接去官网仓库下载: docker pull centos
[root@localhost_002 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo #下载docker 这个镜像;
[root@localhost_002 ~]# ls /etc/yum.repos.d/docker.repo
[root@localhost_002 ~]# yum install -y docker-ce #yum 安装这个镜像;
[root@localhost_002 ~]# systemctl start docker
[root@localhost_002 ~]# vim /etc/docker/daemon.json #编辑daemon.json,指定私有仓库地址;
{ "insecure-registries":["192.168.149.129:5000"] }
[root@localhost_002 ~]# systemctl start docker #重启docker服务;
#拉取镜像下来: docker pull 192.168.149.129:5000/yuanhh
[root@localhost_002 ~]# docker pull 192.168.149.129:5000/yuanhh
latest: Pulling from yuanhh
a02a4930cb5d: Pull complete
Digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0
Status: Downloaded newer image for 192.168.149.129:5000/yuanhh:latest
[root@localhost_002 ~]# docker pull 192.168.149.129:5000/fenye
[root@localhost_002 ~]# docker images #查看拉取的镜像;
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.149.129:5000/fenye latest 1e1148e4cc2c 3 months ago 202MB
192.168.149.129:5000/yuanhh latest 1e1148e4cc2c 3 months ago 202MB
5、docker 数据管理(容器里面产生的新的数据存在了哪里,容器删除或更改后,数据去哪里了?) ----> 要对数据进行管理--用宿主机的目录来挂载
挂载本地宿主机的目录到容器里 docker run -itd -v /data/:/data centos
有一点好处: 即使容器删除销毁了,数据还是存在的,除非手动删除宿主机的目录;
-v 用来指定目录,前面的 /data/ 表示宿主机本地目录,后面的 /data/ 表示容器里的目录, 会在容器里自动创建;
挂载数据卷 在挂载目录的时候,可以指定容器 name ,如果不指定就随机定义 relaxed_franklin;这个名称使用 docker ps 右侧一列可以看到;
[root@localhost_001 ~]# docker run -itd -v /data/:/data centos6 bash #挂载镜像 centos6
39a152c58f007d8f3ea925297b96e4c37b84e8b68066bf0536660d3c01451da5
[root@localhost_001 ~]#
[root@localhost_001 ~]# docker exec -it 39a152 bash #进入到这个容器
[root@39a152c58f00 /]# ls -l /data/ #查看,容器里/data/目录和宿主机是一样子的;
total 0
drwxr-xr-x 6 1001 1001 187 Mar 16 01:50 mysql
drwxr-xr-x 2 root root 61 Mar 11 05:10 redis_data
drwxr-xr-x 4 root root 37 Oct 16 02:35 wwwroot
[root@39a152c58f00 /]# mkdir /data/yuanhh #容器创建 /data/yuanhh/目录
[root@39a152c58f00 /]# exit
exit
[root@localhost_001 ~]# ls /data/ #退出到宿主机查看这个目录也是有 yuanhh 目录
mysql redis_data wwwroot yuanhh
注释:用 docker ps 查看时,右侧那一列 name 则表示容器的名称;默认是自定义:cranky_hawking
[root@localhost_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39a152c58f00 centos6 "bash" 3 minutes ago Up 3 minutes cranky_hawking
b99b8cb74527 registry "/entrypoint.sh /etc…" 2 hours ago Up 2 hours 0.0.0.0:5000->5000/tcp thirsty_wu
这样子,我们就可以使用新的镜像 ubuntu 来创建新的容器,并且还让使用 上面centos6的数据卷 /data/ --volumes-from cranky_hawking(容器名称)
[root@localhost_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39a152c58f00 centos6 "bash" 17 minutes ago Up 17 minutes cranky_hawking
b99b8cb74527 registry "/entrypoint.sh /etc…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp thirsty_wu
[root@localhost_001 ~]# docker run -itd --volumes-from cranky_hawking ubuntu bash
02a274f117a0e2ff5222d2b0fe78bf3c0e69803697031eddf9382333c6c501b1
[root@localhost_001 ~]# docker exec -it 02a274 bash #进入这个容器
root@02a274f117a0:/# ls /data/
mysql redis_data wwwroot yuanhh
注释:上面容器叫做数据卷容器;区别在于 -v /data/:/data/ 有两层含义;
docker run -itd -v /data/:/data/ centos6 bash #有两个目录,之间用冒号隔开,表示容器/data/目录和宿主机/data/目录之间做一个映射关系;
docker run -itd -v /data/ --name testvol centos6 bash #表示搭建一个数据卷容器,用于多个容器之间共享数据,然后其它容器直接挂载该数据卷,类似于linux的NFS服务;仅仅是容器之间,就和宿主机没关系了; --name 后面更数据卷名称;
其他容器挂载这个数据卷容器: docker run -itd --volumes-from testvol fenye bash
6、数据卷的备份和恢复: 假设:如果容器和宿主机之间做了映射关系,那就不需要备份,它的数据就保存在硬盘上面; 所有这种备份方法有点多余;如下图:
首先创建一个容器fenye并指定数据卷 testvol: docker run -itd -v /db/ --name testvol fenye bash
然后其他容器yuanhh_test来挂载这个数据卷 testvol: docker run -itd -v /db/ --volumes-from testvol yuanhh_test bash
备份:首先需要在宿主机里创建一个备份目录/home/backup,然后重启开启一个容器centos 并加入 testvol 数据卷,然后把宿主机的目录/home/backup目录挂载到容器 centos 的 backup 目录下;然后把/db/目录下的数据打包到/backup目录下,这在宿主机也可以看到了;
[root@localhost_001 ~]# docker run -itd -v /db/ --name testvol fenye bash #创建数据卷
ab541cfa4a0d22c554f4f20c8a3353a15648eb3438c0c7ac0e17af8a818dd86c
[root@localhost_001 ~]# docker exec -it ab541c bash #进入数据卷
[root@ab541cfa4a0d /]# mkdir /db/yuanhh_test
[root@ab541cfa4a0d /]# touch /db/yuanhh_txt
[root@ab541cfa4a0d /]# echo "1111" > !$
[root@ab541cfa4a0d /]# ls /db/
yuanhh_test yuanhh_txt
[root@ab541cfa4a0d /]# exit
添加 yuanhh_test容器并挂载到数据卷 testvol
[root@localhost_001 ~]# docker run -itd --volumes-from testvol yuanhh_test bash
fd210dcad79e86feb4e62e8a488783f8f2daeda8ef5ae42bb8c30895b5c16b57
[root@localhost_001 ~]# docker exec -it fd210dc bash #进入这个yuanhh_test容器
root@fd210dcad79e:/# ls /db/ #查看目录信息;
yuanhh_test yuanhh_txt
root@fd210dcad79e:/# exit
exit
[root@localhost_001 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd210dcad79e yuanhh_test "bash" 44 seconds ago Up 41 seconds sleepy_lewin
ab541cfa4a0d fenye "bash" 6 minutes ago Up 6 minutes testvol
创建备份目录:mkdir /home/backup
新建 centos 容器并加入 testvol 卷组,并把本地备份目录/home/backup映射到容器 /backup目录,然后把/db/目录打包压缩存放在/backup/db.tar下;
docker run -itd --volumes-from testvol -v /home/bakup/:/backup centos tar cvf /backup/db.tar /db/
[root@localhost_001 ~]# mkdir /home/backup/
root@localhost_001 ~]# docker run --volumes-from testvol -v /home/backup/:/backup/ centos tar cvf /backup/db.tar /db/
/db/
/db/yuanhh_test/
/db/yuanhh_txt
[root@localhost_001 ~]# ls -ld /home/backup/db.tar
-rw-r--r-- 1 root root 10240 3月 16 17:37 /home/backup/db.tar
恢复:先用镜像centos新建一个数据卷容器testvol2, 目录为/data/ docker run -itd -v /data/ --name testvol2 centos bash
用镜像centos_with_net再新建一个容器挂载数据卷testvol2,并把宿主机备份目录/home/backup和新建容器centos的/backup/目录映射,然后解压并解压:
docker run --volumes-from testvol2 -v /home/backup:/backup centos_with_net tar xf /backup/db.tar
[root@localhost_001 ~]# docker run -itd -v /data/ --name testvol2 centos bash #创建一个容器
8f7e903f38577c1f2c048af69f892fb3e84435dbc4083fbcf0d001edd66487f3
[root@localhost_001 ~]# docker exec -it 8f7e90 bash
[root@8f7e903f3857 /]# ls /data/
[root@8f7e903f3857 /]# exit
exit
恢复这个容器的内容;
[root@localhost_001 ~]# docker run --volumes-from testvol2 -v /home/backup:/backup centos_with_net tar xf /backup/db.tar -C /data/
[root@localhost_001 ~]# docker exec -it 8f7e90 bash
[root@8f7e903f3857 /]# ls /data/
db
注释:其实应该解压到当前目录的,也就是说压缩和解压的目录是需要一致,要不然就需要用tar -C 选项来指定要解压的目录了;
下图加深理解: