[toc]
Docker容器管理、仓库管理、数据管理、数据卷备份与恢复
一、容器管理
创建一个容器:docker create -it centos7 bash,注意centos7是必须是已经存在的
[root@xaviyunserver ~]# docker create -it centos7 bash
5ab8830ee5d2cb4da2df86912275fc14806cad1f44bb24e0e54ddefa11a60532
[root@xaviyunserver ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ab8830ee5d2 centos7 "bash" 10 seconds ago Created //创建 goofy_knuth
410e90b34976 centos7 "bash" 2 hours ago Up 2 hours dreamy_chatterjee
83a4c32c03ca centos "/bin/bash" 4 hours ago Up 4 hours nostalgic_lamport
启动容器:docker start CONTAINERID,启动容器后,可以使用 docker ps 查看到,有start 就有stop,和restart
之前我们使用的docker run 相当于先create再start
[root@xaviyunserver ~]# docker start 5ab8830ee5d2
5ab8830ee5d2
[root@xaviyunserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ab8830ee5d2 centos7 "bash" 2 minutes ago Up 5 seconds goofy_knuth
410e90b34976 centos7 "bash" 2 hours ago Up 2 hours dreamy_chatterjee
83a4c32c03ca centos "/bin/bash" 4 hours ago Up 4 hours nostalgic_lamport
当执行如下(不带 -d 参数):docker run -it centos bash //当你退出时,这个容器也会显示退出的状态!
[root@xaviyunserver ~]# docker run -it centos bash
[root@27096b136e00 /]# ls
bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@27096b136e00 /]# ifconfig
bash: ifconfig: command not found //这里没有安装net-tool工具
让容器在后台运行:docker run -d
比如:
shell脚本:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
–name 给容器自定义名字:docker run -itd --name centos7_1 centos7 bash
[root@xaviyunserver ~]# docker run -itd --name centos7_1 centos7 bash
1a93298ed9db13673049b2d8d82013aa2b8e98caaa36c4d771337fc3f9bc2cea
[root@xaviyunserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a93298ed9db centos7 "bash" 4 seconds ago Up 4 seconds centos7_1
5ab8830ee5d2 centos7 "bash" 10 minutes ago Up 8 minutes goofy_knuth
410e90b34976 centos7 "bash" 2 hours ago Up 2 hours dreamy_chatterjee
83a4c32c03ca centos "/bin/bash" 4 hours ago Up 4 hours nostalgic_lamport
下次我们就可以直接使用名称进入:docker exec -it centos7_1 bash
[root@xaviyunserver ~]# docker exec -it centos7_1 bash
[root@1a93298ed9db /]#
docker run --rm -it centos7 bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出
docker logs 可以获取到容器的运行历史信息,用法如下:docker logs container_id
[root@xaviyunserver ~]# docker run -itd centos bash -c "echo 123"
5ea2041ac3d24f6e44a6347b8d94328ddff02b26fa7c12f538389bc72ad9d5d4
[root@xaviyunserver ~]# docker logs 5ea2041a
123
docker exec -it container_id bash //可以临时打开一个虚拟终端,并且exit后,容器依然运行着
docker rm container_id //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f.
docker export container_id > file.tar // 导出容器,可以迁移到其他机器上,需要导入
cat file.tar |docker import - xavi_test //这样会生成xavi_test的镜像
二、Docker 仓库管理
当我们pull一个镜像,一般都是从官网直接拉取的,一般的都是比较纯净的,但是在公司内一般这种镜像没有任何作用,我们需要的是基础环境都配置好的,可以直接在此基础上面运行服务的系统。
综上所述,我们需要搭建一个在我们服务器内部的一个镜像仓库,需要哪个直接拉取即可!(类似于gitlab),我们需要在本地创建一个仓库:
下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。docker pull registry
[root@xaviyunserver ~]# docker pull registry
Using default tag: latest
docker run -d -p 5000:5000 registry// 以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口。
[root@xaviyunserver ~]# docker run -d -p 5000:5000 registry
87517b62936d5ad893c078c790c4bbaebc38056052a85f2cdc14ac921c1b4677
[root@xaviyunserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87517b62936d registry "/entrypoint.sh /etc…" 6 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp friendly_davinci
1a93298ed9db centos7 "bash" 11 hours ago Up 11 hours centos7_1
5ab8830ee5d2 centos7 "bash" 11 hours ago Up 11 hours goofy_knuth
410e90b34976 centos7 "bash" 13 hours ago Up 13 hours dreamy_chatterjee
83a4c32c03ca centos "/bin/bash" 14 hours ago Up 14 hours nostalgic_lamport
有什么办法能在开机时启动所以的dokcer??systemctl restart docker && docker start $(docker ps -a -q)
假如有这么一种情况,咱们的容器需要对外进行提供服务,虚拟机内的IP地址肯定不可以直接作为访问地址的,但是我们ens33的地址可以配置成对外的公网IP 然后通过端口映射,是不是我们的docker容器也可以跑web服务了?
[root@xaviyunserver ~]# docker exec -it 410e90b34976c bash //任意进入一个容器
[root@410e90b34976 /]# ifconfig
bash: ifconfig: command not found
[root@410e90b34976 /]# yum install -y net-tools //安装net-tools
[root@410e90b34976 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)
RX packets 4008 bytes 10832918 (10.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3346 bytes 231130 (225.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@410e90b34976 /]# exit
exit
[root@xaviyunserver ~]# ping 172.17.0.4 //可以ping通这个容器
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.055 ms
curl 127.0.0.1:5000/v2/_catalog//可以访问它
[root@xaviyunserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87517b62936d registry "/entrypoint.sh /etc…" 18 minutes ago Up 18 minutes 0.0.0.0:5000->5000/tcp friendly_davinci
1a93298ed9db centos7 "bash" 11 hours ago Up 11 hours centos7_1
5ab8830ee5d2 centos7 "bash" 11 hours ago Up 11 hours goofy_knuth
410e90b34976 centos7 "bash" 13 hours ago Up 13 hours dreamy_chatterjee
83a4c32c03ca centos "/bin/bash" 15 hours ago Up 15 hours nostalgic_lamport
- 访问:
[root@xaviyunserver ~]# telnet 127.0.0.1 5000 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. [root@xaviyunserver ~]# curl 127.0.0.1:5000/v2/_catalog {"repositories":[]}
上传一个镜像到私有库的步骤:
第一步:打标签:docker tag centos7 116.62.212.186:5000/centos7 //标记一下tag,必须要带有私有仓库的ip:port
[root@xaviyunserver ~]# docker tag centos7 116.62.212.186:5000/centos7
[root@xaviyunserver ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 latest 1513b3b29ff7 14 hours ago 435MB
116.62.212.186:5000/centos7 latest 1513b3b29ff7 14 hours ago 435MB
centos_with_net latest 097367cfbba8 15 hours ago 282MB
ubuntu latest 113a43faa138 4 weeks ago 81.2MB
xavilinux_centos latest 49f7960eb7e4 4 weeks ago 200MB
centos latest 49f7960eb7e4 4 weeks ago 200MB
registry latest d1fd7d86a825 5 months ago 33.3MB
第二步,更改配置文件vi /etc/docker/daemon.json //更改为
[root@xaviyunserver ~]# vi /etc/docker/daemon.json
{
"insecure-registries": ["116.62.212.186:5000"]
}
[root@xaviyunserver ~]# systemctl restart docker //重启服务
[root@xaviyunserver ~]# docker ps -a //查看容器已经关闭,还需要启动
[root@xaviyunserver ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87517b62936d registry "/entrypoint.sh /etc…" About an hour ago Exited (2) 3 minutes ago friendly_davinci
再次开启容器:docker start id //这里的id为 registry 容器id
[root@xaviyunserver ~]# docker start 87517b62936d
87517b62936d
[root@xaviyunserver ~]# docker push 116.62.212.186:5000/centos7
The push refers to repository [116.62.212.186:5000/centos7]
排障过程:
通过curl进行验证:curl https://dhq9bx4f.mirror.aliyuncs.com/v2/_catalog 是可以正常返回结果,说明服务没有问题
通过谷歌×××(百度不行,解决不了这个问题),一共大概有两种方式
1、设置dns,在/etc/resolv.conf,以及/etc/docker/daemon.json中增加dns。例如dns地址:8.8.8.8
2、设置docker代理(centos和ubuntu同样设置)
参考文献:
https://blog.csdn.net/xxb249/article/details/79469534
[root@xaviyunserver ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
Digest: sha256:43ed4f8c9d1695e97a39cdfe9475af9096e3723cfb79d820d8da00d61a277a85
Status: Image is up to date for mysql:latest
第四步、检查:
[root@zhdy01 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7","centvim"]}
总结:今天换了电脑上的虚拟机俩做实验,一次成功
[root@xavi ~]# docker push 192.168.72.130:5000/centos7
The push refers to repository [192.168.72.130:5000/centos7]
788edba9eaa8: Pushed
latest: digest: sha256:cfc19e79d4010d16b86660c37dbf1f1e881e974dd06c3c6ab05477db2a43444a size: 529
[root@xavi ~]# docker run -d -p 2000:2000 registry
9c2b897587c22d9f1d6977b8c2c87b4f33dd98dc0c63003e361b60864520c70b
[root@xavi ~]#
[root@xavi ~]# docker tag ubuntu 192.168.72.130:5000/ubuntu
[root@xavi ~]# docker push 192.168.72.130:5000/ubuntu
The push refers to repository [192.168.72.130:5000/ubuntu]
b6f13d447e00: Pushed
a20a262b87bd: Pushed
904d60939c36: Pushed
3a89e0d8654e: Pushed
db9476e6d963: Pushed
latest: digest: sha256:e7def0d56013d50204d73bb588d99e0baa7d69ea1bc1157549b898eb67287612 size: 1357
[root@xavi ~]# curl 127.0.0.1:5000/v2_catalog
404 page not found
[root@xavi ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7","ubuntu"]}
三、Docker 数据管理
背景:假如我们的某个容器跑了一个线上的业务,不可抵抗的情况发生了,数据呢?数据具体在什么位置呢?他会一并删除,如何保证数据不删除呢?
把我们宿主机的目录挂载到容器内,让容器的数据全部写到咱们指定的宿主机目录。
3.1 挂载本地的目录到容器里:docker run -tid -v /data/:/data centos bash //-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建
[root@xavi ~]# docker run -tid -v /data/:/data centos7 bash
43e7d37d1adcf10abca55aeeed565ddb5fcded2777ae4e96193332529029dff5
[root@xavi ~]# ls /data/
ftp mariadb mysql nginx redis wwwroot
[root@xavi ~]# docker exec -it 43e7d37d1adcf bash
[root@43e7d37d1adc /]# ls -l /data/
total 0
drwxr-xr-x 2 1010 1010 21 Mar 29 22:20 ftp
drwx------ 5 1004 root 222 Mar 1 11:56 mariadb
drwx------ 9 1004 1005 194 Apr 18 05:37 mysql
drwxr-xr-x 4 root root 42 Mar 15 11:47 nginx
drwxr-xr-x 2 root root 44 Jun 13 08:38 redis
drwxr-xr-x 8 root root 116 May 27 09:04 wwwroot
上述两处/data/文件下的目录是相同的
[root@43e7d37d1adc /]# mkdir /data/xavi
[root@43e7d37d1adc /]# exit
exit
[root@xavi ~]# ls /data/
ftp mariadb mysql nginx redis wwwroot xavi
// 看来已经自动的存储到了宿主机的硬盘上!
3.2 挂载数据卷
其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为friendly_visvesvaraya,这个名字可以使用命令 docker ps 看最右侧一列
[root@xavi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43e7d37d1adc centos7 "bash" 13 minutes ago Up 13 minutes friendly_visvesvaraya
9c2b897587c2 registry "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:2000->2000/tcp, 5000/tcp epic_saha
d0b81c693cc5 registry "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp objective_chebyshev
docker run -itd --volumes-from friendly_visvesvaraya centos7 bash//这样,我们使用centos7镜像创建了新的容器,并且使用了friendly_visvesvaraya 容器的数据卷
[root@xavi ~]# docker run -itd --volumes-from friendly_visvesvaraya centos7 bash
97331ffb05d10701d2a9c488a8a4716313d8336cedafe66e5a9c7364d7be4985
[root@xavi ~]#
[root@xavi ~]# docker exec -it 97331ffb05d10701 bash
[root@97331ffb05d1 /]# ls /data/
ftp mariadb mysql nginx redis wwwroot xavi
这里很类似于NFS的共享功能?
3.3 定义数据卷容器
有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
首先建立数据卷容器docker run -itd -v /data/ --name testvol centos bash //注意这里的/data/是容器的/data目录,并非本地的/data/目录。
然后让其他容器挂载该数据卷:docker run -itd --volumes-from testvol centos7 bash
四、数据卷备份与恢复
应用背景:
日常工作中:把容器和本地宿主机做了目录映射直接存在本地,那我们只需对本地的硬盘定期备份,但如果没有做这个映射,没有做映射情况下的备份和恢复该如何来处理
4.1 本地创建备份目录
mkdir /data/backup
docker run --volumes-from testvol -v /data/backup/:/backup centos
tar cvf /backup/data.tar /data/
说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/data/backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。
根据图示理解:宿主机(服务器)分享了一个/data/backup/ 目录,本地的这个backup目录和新建容器内的backup相互映射,而我们现在的新建容器挂载了数据卷容器的/data/ 也就是意味着数据卷的data目录和容器的data目录数据是一致的,现在两两互通,这样只要把新建容器中的data目录中的数据copy到backup中就可以了!这样就完成了真实的备份!
4.2 恢复
思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。
新建数据卷容器:docker run -itd -v /data/ --name testvol2 centos bash
挂载数据卷新建容器,并解包:docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar
恢复也就是按照刚刚的思路反着来就可以了。实用性不高,因为多数情况下我们还是用宿主机映射的比较广泛。
转载于:https://blog.51cto.com/12995218/2140166