docker学习笔记(三):仓库管理及数据管理

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 选项来指定要解压的目录了;

下图加深理解:

972fa09fedb63a6db6b8184aa44d6fa1f37.jpg

转载于:https://my.oschina.net/yuanhaohao/blog/3022750

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值