容器管理
创建容器:
创建新的容器,但没有运行
[root@localhost src]# docker create -it centos7 bash
776422814ba2cb2ca6dfc875989100dd388ba78c4d8cb6484aad0a4f67664710
查看目前启动状态的容器
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90aae362613c centos_with_net "/bin/bash" 10 minutes ago Up 10 minutes gifted_hypatia
14ff3a80b8db centos "/bin/bash" 15 minutes ago Up 15 minutes romantic_chandrasekhar
查看所有容器,包含未启动的容器
docker ps -a
[root@localhost src]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
776422814ba2 centos7 "bash" 2 minutes ago Created //**当前状态** sharp_margulis
90aae362613c centos_with_net "/bin/bash" 10 minutes ago Up 10 minutes gifted_hypatia
14ff3a80b8db centos "/bin/bash" 16 minutes ago Up 16 minutes romantic_chandrasekhar
启动(重启,关闭)容器:
docker start/restart/stop CONTAINER ID
[root@localhost src]# docker start 77642281
77642281
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
776422814ba2 centos7 "bash" 5 minutes ago Up 13 seconds //已经启动 sharp_margulis
90aae362613c centos_with_net "/bin/bash" 14 minutes ago Up 14 minutes gifted_hypatia
14ff3a80b8db centos "/bin/bash" 19 minutes ago Up 19 minutes romantic_chandrasekhar
之前我们使用的docker run 相当于先create再start
docker run -it centos bash
这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止。
[root@localhost src]# docker run -it centos bash
[root@71c249e74843 /]#
[root@71c249e74843 /]# exit
Exit //exit退出后就不在运行
[root@localhost src]#
可以让容器在后台运行
docker run -d
比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ced877f7363 centos "bash -c 'while :; d…" 3 minutes ago Up 3 minutes gallant_villani
自定义容器名字启动:
[root@localhost src]# docker run --name web -itd centos bash
cdf0afb174a59f1f8c32a521f4d2276279e5ce2e642a6352d746555af9d26b95
--name 给容器自定义名字
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdf0afb174a5 centos "bash" 24 seconds ago Up 24 seconds web
通过容器名字进入对应的容器界面
[root@localhost src]# docker exec -it web bash
[root@cdf0afb174a5 /]#
让容器退出后删除:
--rm 让容器执行命令后退出且删除容器;-c指定执行的命令
[root@localhost src]# docker run --rm -it centos bash -c "sleep 30"
查看容器运行的历史信息:
docker logs CONTAINER ID
[root@localhost src]# docker run -itd centos bash -c "echo 123"
8918a6a6ad085e0dc16a108db87c717ff0009d93fd4572f3564e94caabaff357
[root@localhost src]# docker logs 8918a6
123
进入后台运行的容器:
docker attach CONTAINER ID
但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法
docker exec -it CONTAINER ID bash
可以临时打开一个虚拟终端,并且exit后,容器依然运行着
删除容器:
docker rm CONTAINER ID
CONTAINER ID是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f
[root@localhost src]# docker rm cdf0afb
Error response from daemon: You cannot remove a running container cdf0afb174a59f1f8c32a521f4d2276279e5ce2e642a6352d746555af9d26b95. Stop the container before attempting removal or force remove
[root@localhost src]# docker rm -f cdf0afb
cdf0afb
导出容器:
docker export container_id > file.tar
导出容器为文件,可以迁移到其他机器上,需要导入
[root@localhost src]# docker export 776422 > aaa.tar
[root@localhost src]# ls
aaa.tar
导入容器:
cat aaa.tar |docker import - jin_test
这样会生成jin_test的镜像
[root@localhost src]# cat aaa.tar |docker import - jin_test
sha256:17665006fbe6ba985a669350c261e7c952ae981503aca1de443b1df0711ed8b4
[root@localhost src]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jin_test latest 17665006fbe6 About a minute ago 435MB
仓库管理
对于公司来讲,把自己的镜像推送到docker公共仓库显得不太合适,不过我们可以建立自己本地的docker私有仓库。
下载registry镜像:
docker pull registry
registry镜像是docker官方提供的一个镜像,可用来创建本地私有仓库
[root@localhost src]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete
d550a247d74f: Pull complete
1a938458ca36: Pull complete
acd758c36fc9: Pull complete
9af6d68b484a: Pull complete
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
启动registry镜像为容器:
docker run -d -p 5000:5000 registry
-p指定映射端口到宿主机,左边是宿主机监听端口,右边是容器监听端口
[root@localhost src]# docker run -d -p 5000:5000 registry
6bce9295a140fc1218794d3a970f1548601ec9fc07309919416ede38cfe0198d
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bce9295a140 registry "/entrypoint.sh /etc…" 37 seconds ago Up 36 seconds 0.0.0.0:5000->5000/tcp quizzical_lederberg
查看私有仓库:
[root@localhost src]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}
上传镜像到私有仓库:
打上标签
docker tag centos7 192.168.111.137:5000/centos7
标记一下tag,必须要带有私有仓库的ip:port
[root@localhost src]# docker tag centos7 192.168.111.136:5000/centos7
[root@localhost src]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jin_test latest 17665006fbe6 20 hours ago 435MB
192.168.111.136:5000/centos7 latest 3f34ff44ea96 20 hours ago 435MB
centos7 latest 3f34ff44ea96 20 hours ago 435MB
centos_with_net latest ad5399f1e54b 20 hours ago 242MB
registry latest 678dfa38fcfa 5 days ago 26.2MB
centos latest 300e315adb2f 2 weeks ago 209MB
jin_centos latest 300e315adb2f 2 weeks ago 209MB
ubuntu latest f643c72bc252 3 weeks ago 72.9MB
修改配置文件
vim /etc/docker/daemon.json
更改为下面内容,不能添加,需要删除之前的加速器url
{
"insecure-registries": ["192.168.111.137:5000"]
}
修改配置文件后需要重启
systemctl restart docker
容器已经关闭,需要重新启动registry容器
[root@localhost src]# docker start 6bce92
6bce92
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bce9295a140 registry "/entrypoint.sh /etc…" 7 minutes ago Up 2 seconds 0.0.0.0:5000->5000/tcp quizzical_lederberg
上传镜像:
[root@localhost src]# docker push 192.168.111.137:5000/centos7
Using default tag: latest
The push refers to repository [192.168.111.137:5000/centos7]
788edba9eaa8: Pushed
latest: digest: sha256:d1fca36f123eb34819f65b4b52196cd4aa1304c4012dcd679a2bf1054a9d6e55 size: 529
查看私有仓库:
[root@localhost src]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7"]}
再次上传一个镜像:
[root@localhost src]# docker tag ubuntu 192.168.111.137:5000/ubuntu
[root@localhost src]# docker push 192.168.111.137:5000/ubuntu
Using default tag: latest
The push refers to repository [192.168.111.137:5000/ubuntu]
f6253634dc78: Pushed
9069f84dbbe9: Pushed
bacd3af13903: Pushed
latest: digest: sha256:4e4bc990609ed865e07afc8427c30ffdddca5153fd4e82c20d8f0783a291e241 size: 943
[root@localhost src]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["centos7","ubuntu"]}
数据管理
容器是由镜像启动的,如果容器里面产生了新的数据,那么当容器关闭或删除时,这些数据也会一并删除,对于数据是存在一定风险的。
为了避免容器中新产生的数据被删除,我们可以挂载本地的目录到容器里。
挂载本地目录到容器:
-v指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建
[root@localhost src]# touch /data/aaa
[root@localhost src]# docker run -tid -v /data/:/data centos bash
d057e4f65c55a6709a0ce033ad05d5197d448144f2bf80cc4a3d9d32255d33bf
[root@localhost src]# docker exec -it d057e4f bash
[root@d057e4f65c55 /]# ls /data/
aaa
[root@d057e4f65c55 /]# mkdir /data/abc
[root@d057e4f65c55 /]# exit
exit
[root@localhost src]# ls /data/
aaa abc
挂载数据卷:
其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为heuristic_kapitsa,这个名字可以使用命令 docker ps 看最右侧一列
[root@localhost src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d057e4f65c55 centos "bash" 3 minutes ago Up 3 minutes heuristic_kapitsa
638fb8d2921d centos "bash" 5 minutes ago Up 5 minutes upbeat_golick
6bce9295a140 registry "/entrypoint.sh /etc…" 27 minutes ago Up 13 minutes 0.0.0.0:5000->5000/tcp quizzical_lederberg
开启新的容器:
挂载数据卷,使用上面的容器作为数据卷容器打开新的容器
[root@localhost src]# docker run -itd --volumes-from heuristic_kapitsa centos bash
a86e8b942f0f44a265588d5a6d7ecd6ffd3b63e2ad5962376ede2940b6014b06
[root@localhost src]# docker exec -it a86e8b bash
[root@a86e8b942f0f /]# ls -l /data/
total 0
-rw-r--r--. 1 root root 0 Dec 23 11:36 aaa
drwxr-xr-x. 2 root root 6 Dec 23 11:37 abc
上面可以看到新容器的目录与数据卷容器的目录是相同的
定义数据卷容器:
有时候,我们需要多个容器相互共享数据,类似于linux里面的NFS,所以可以搭建一个专门的数据卷容器,然后其它容器直接挂载该数据卷。
首先建立数据卷容器:
docker run -itd -v /data/ --name testvol centos bash
注意的/data/是容器的/data目录,并非宿主机的/data目录;testvol是自定义的数据卷容器名字
然后让其它容器挂载该数据卷:
[root@localhost src]# docker run -itd --volumes-from testvol centos7 bash
c64b95f7dc9ff6e5dea6309112eed91931f929d8d652bc0154818e83a7e8f79f
这里是centos镜像的容器挂载centos镜像的容器目录
另外,如果每台机器想要挂载的数据卷不一样,可以做软链接,对想要挂载的目录做软链接,链接到同一个指定的目录即可。
数据卷备份恢复
数据卷备份:
说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面
本地新建挂载目录:mkdir /data/backup
docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data
testvol为数据卷容器名字;-v 指定挂载目录;centos 为新的容器镜像;tar打包,/data为要备份的目录
数据卷恢复:
过程与上面相反,先建立一个数据卷容器,再建立一个新的容器并挂载该数据卷容器,然后再把tar包放到挂载目录下解包。
新建数据卷容器:
[root@localhost backup]# docker run -itd -v /data/ --name testvol2 centos bash
f67099cf8ec77f22a6172a2179bb8a2cf56ddbed80046d64fbc848c970ac51ea
挂载数据卷新建容器,并解包:
[root@localhost backup]# docker run --volumes-from testvol2 -v /data/backup:/backup centos tar xvf /backup/data.tar