Docker 容器管理
启动一个容器:
[root@study ~]# docker run -it centos-7-x86_64-minimal /bin/bash
创建一个容器但不启动:
[root@study ~]# docker create -it centos
##在此只能使用docker自带镜像
查看容器内核版本:
[root@5bfbfae5c6a6 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
激活一个已经存在的容器:
[root@study ~]# docker start 5bfbfae5c6a6
##有start 就有stop,和restart
让镜像在后台启动:
[root@study ~]# docker run -itd centos-7-x86_64-minimal /bin/bash
进入运行中的docker容器:
[root@study ~]# docker exec -it 2f35054abd5e /bin/bash
或:
[root@study ~]# docker attach 2f35054abd5e
##注:使用attach进入终端再退出后会终止当前镜像,而使用则exec不会。
启动容器的同时运行命令:
[root@study ~]# docker run -d adai:part2 bash -c "while :; do echo "123";sleep 1 ;done"
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2804754d7fcb adai:part2 "bash -c 'while :; do" About a minute ago Up About a minute reverent_babbage
查看某容器的日志:
[root@study ~]# docker logs 2804754d7fcb
停止一个镜像:
[root@study ~]# docker stop 2804754d7fcb
指定docker容器运行时的名称:
[root@study ~]# docker run -itd --name test adai:part2 bash
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48097e8bfd93 adai:part2 "bash" 32 seconds ago Up 29 seconds test
删除docker容器:
[root@study ~]# docker rm 48097e8bfd93
Error response from daemon: You cannot remove a running container 48097e8bfd93ec6bb0a69632be332f1a61bd2aaeb8180f113182a2c452a51828. Stop the container before attempting removal or use -f
[root@study ~]# docker stop 48097e8bfd93
48097e8bfd93
[root@study ~]# docker rm 48097e8bfd93
48097e8bfd93
##即,删除一个容器前需要先停止该容器运行;如果要强行删除一个正在运行的容器需要加-f选项。
使容器退出时直接从容器执行列表删除:
[root@study ~]# docker run --rm -it adai:part2 bash -c "sleep 30"
##--rm和-d不能同时使用
[root@study ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e523a18c4268 centos "/bin/bash" 15 hours ago Up 3 hours hopeful_galileo
##无运行记录
容器迁移
导出容器:
[root@study ~]# docker export e523a18c4268 > adai_centos.tar
[root@study ~]# du -sh adai_centos.tar
248M adai_centos.tar
导入容器:
[root@study ~]# cat adai_centos.tar |docker import - adai_test
[root@study ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
adai_test latest f89ac65eb9b3 57 seconds ago 250.6 MB
##恢复后会生成一个新的镜像
[root@study ~]# docker run -itd adai_test:latest bash
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6d0bf2ceea2 adai_test:latest "bash" 5 seconds ago Up 3 seconds lonely_kare
Docker仓库管理
下载registry镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。
[root@study ~]# docker pull registry
[root@study ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-7-x86_64-minimal latest e21aadc0e309 2 hours ago 434.5 MB
docker.io/registry latest 28525f9a6e46 3 weeks ago 33.19 MB
docker.io/centos latest 196e0ce0c9fb 3 weeks ago 196.6 MB
[root@study ~]# docker run -d -p 5000:5000 registry
##以registry进行启动容器,监听5000端口
##-p:表示做一个端口映射,左边是母机端口,右边是容器端口
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab90f97da4fc registry "/entrypoint.sh /etc/" 5 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp jovial_keller
可以使用curl访问:
[root@study ~]# curl 127.0.0.1:5000 -I
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Thu, 12 Oct 2017 07:32:16 GMT
Content-Type: text/plain; charset=utf-8
登录容器时报错:
[root@study ~]# docker exec -it ab9 /bin/bash
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"/entrypoint.sh/etc/\\\": stat /entrypoint.sh/etc/: not a directory\"\n"
经排查得知原因:容器中没有bash,所以执行sh就可以了,如下:
[root@study ~]# docker exec -it ab9 /bin/sh
/ #
登录成功!然后看一下该容器根目录下的文件:
/ # ls
bin entrypoint.sh home linuxrc mnt root sbin sys usr
dev etc lib media proc run srv tmp var
发现启动脚本—entrypoint.sh:
/ # vi entrypoint.sh
#!/bin/sh set -e case "$1" in
*.yaml|*.yml) set -- registry serve "$@" ;;
serve|garbage-collect|help|-*) set -- registry "$@" ;;
esac
exec "$@"
即,“#!/bin/sh”!
上传镜像到私有仓库
registry库的IP:172.17.0.2
准备一个镜像(实验用):
[root@study ~]# docker pull busybox
[root@study ~]# docker images
docker.io/busybox latest 54511612f1c4 4 weeks ago 1.129 MB
上传之前需要对镜像打上标记:
[root@study ~]# docker tag busybox 192.168.8.139:5000/busybox
##标记内容必须带有私有仓库的ip:port(母机的IP和port)
上传镜像:
[root@study ~]# docker push 192.168.8.139:5000/busybox
提示:
The push refers to a repository [192.168.8.139:5000/busybox]
Get https://192.168.8.139:5000/v1/_ping: http: server gave HTTP response to HTTPS client
这个问题可能是由于客户端采用https,docker registry未采用https服务所致。但发现docker1.12.3版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。解决方法如下:
编辑”/etc/docker/“目录下”daemon.json“文件:
[root@study ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.8.139:5000"] }
##宿主机IP和对应端口
保存退出后,重启docker。
重启docker服务:
[root@study ~]# systemctl restart docker.service
启动registry容器:
[root@study ~]# docker start ab90f97da4fc
推送:
[root@study ~]# docker push 192.168.8.139:5000/busybox
The push refers to a repository [192.168.8.139:5000/busybox]
6a749002dd6a: Pushed
查看私有仓库有哪些文件:
[root@study ~]# curl http://192.168.8.139:5000/v2/_catalog
{"repositories":["busybox"]}
docker数据管理
如果只把数据存储到docker容器中,只有保存镜像的时候才能将数据保存起来,否则数据会随着容器的停止/删除而丢失,为了防止容器中的数据丢失使用如下方法:将母机中的目录挂载到容器中,这样一来,容器中的数据就会保存在母机对应的目录中,不会因为你容器的关闭和删除而丢失。
挂载本地目录到容器
挂载本地目录到容器:
[root@study ~]# mkdir /data/docker
[root@study ~]# docker run -itd -v /data/docker/:/data1/ centos bash
##-v:指定挂载目录
##/data/docker/:为母机中的目录
##/data1/:为docker容器中的目录
准备一个测试文件:
[root@study ~]# touch /data/docker/1.txt
[root@study ~]# echo "test.test.test">/data/docker/1.txt
进入容器:
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e76358f5a80a centos "bash" 4 minutes ago Up 4 minutes amazing_hypatia
ab90f97da4fc registry "/entrypoint.sh /etc/" 19 hours ago Up 15 minutes 0.0.0.0:5000->5000/tcp jovial_keller
[root@study ~]# docker exec -it e76358f5a80a bash
[root@e76358f5a80a /]# ls data1/
1.txt
[root@e76358f5a80a /]# cat data1/1.txt
test.test.test
[root@e76358f5a80a /]# touch /data1/2.txt
[root@e76358f5a80a /]# exit
[root@study ~]# ls /data/docker/
1.txt 2.txt
##挂载成功,此时再停止或删除该容器相应的数据不会丢失。
挂载数据卷
挂载目录的时候,可以指定容器name,如果不指定就随机定义了。可以使用命令docker ps查看最右侧一列,使用该name实现数据卷的挂载。
启动容器并挂载目录:
[root@study ~]# docker run -itd -v /data/docker/:/data1/ centos bash
f73da2b9f4bbf010310f17c9d702b33225dc8caaf213ac483c52bef6f6d3a14e
[root@study ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f73da2b9f4bb centos "bash" 5 seconds ago Up 3 seconds condescending_dijkstra
再启动一个容器,同时挂载数据卷:
[root@study ~]# docker run -itd --volumes-from condescending_dijkstra centos-7-x86_64-minimal bash
##--volumes-from:挂载目录的来源
[root@study ~]# docker exec -it 9c5 bash
[root@9c572d68135c /]# ls data1/
1.txt 2.txt
[root@9c572d68135c /]# touch data1/3.txt
[root@9c572d68135c /]# exit
[root@study ~]# ls /data/docker/
1.txt 2.txt 3.txt
[root@study ~]# docker exec -it f73 bash
[root@f73da2b9f4bb /]# ls data1/
1.txt 2.txt 3.txt
所谓挂载数据卷,即多个docker容器使用同一个母机中的挂载目录,该方法便于web容器的数据共享,实现web容器的负载均衡。
定义数据卷容器
定义数据卷容器,顾名思义把容器作为数据卷来使用(即,使一个容器扮演母机中“/data/docker/"目录的角色)。有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
建立数据卷容器:
[root@study ~]# docker run -itd -v /data/docker/ --name centos_testv centos bash
##-v:指定挂载目录(/data/docker/为本地目录)
##--name:指定容器名称
查看容器信息:
[root@study ~]# docker exec -it centos_testv bash
[root@906c82f62c28 /]# ls data/
docker
[root@906c82f62c28 /]# ls /data/docker/
##该容器中的/data/docker/和母机中的/data/docker/没关系
该数据卷容器的作用是使其他容器来共享数据,数据卷容器中的数据无法直接存储到母机。
挂载数据卷
[root@study ~]# docker run -itd --volumes-from centos_testv centos bash
70e19ec88a71……
[root@study ~]# docker exec -it 70e bash
[root@70e19ec88a71 /]# ls /data/
docker
[root@70e19ec88a71 /]# ls /data/docker/
[root@70e19ec88a71 /]# touch /data/docker/test.txt
切换至数据卷容器:
[root@study ~]# docker exec -it centos_testv bash
[root@906c82f62c28 /]# ls /data/docker/
test.txt
[root@study ~]# docker run -itd --volumes-from centos_testv --name=test centos bash
[root@study ~]# docker exec -it test bash
[root@d32900e0f13b /]# ls /data/docker/
test.txt
即,挂载成功。
数据卷的备份与恢复
备份
[root@study ~]# mkdir /data/vol_data_backup
新建容器并挂载数据卷和本地目录:
[root@study ~]# docker run -itd --volumes-from centos_testv -v /data/vol_data_backup/:/backup centos bash
b75ef953654be82f8eabbfde3d218f57f537d21fe51655a14f6b5f650cac6363
[root@study ~]# docker exec -it b75e bash
本地挂载:
[root@b75ef953654b /]# ls /backup/
数据卷挂载:
[root@b75ef953654b /]# ls /data/docker/
test.txt test1.txt
打包数据卷目录/data/docker/:
[root@b75ef953654b /]# tar cvf /backup/docker.tar /data/docker/
tar: Removing leading `/' from member names
/data/docker/
/data/docker/test.txt
/data/docker/test1.txt
退出容器,查看本地挂载目录:
[root@study ~]# ls /data/vol_data_backup/
docker.tar
说明: 在此新建的该容器功能类似于“跳板机”,即,将该容器同时挂载到数据卷容器和本地目录,然后在该“跳板机”容器中打包数据卷容器中的数据放到本地目录中,以达到备份的目的。
恢复
新建数据卷容器:
[root@study ~]# docker run -itd -v /data/docker2 --name centos_testv2 centos bash
挂载数据卷,新建容器并解包:
[root@study ~]# docker run -itd --volumes-from centos_testv2 --name=newdocker -v /data/vol_data_backup/:/backup centos tar xvf /backup/docker.tar
[root@06a271b128bb /]# ls /data/
docker docker2
[root@06a271b128bb /]# ls /data/docker/
test.txt test1.txt
至此,恢复工作完成,之后只需要把其他容器挂载到这个新的物理卷就可以了。