容器管理,仓库管理数据管理,数据卷备份与恢复

容器管理

创建容器:

创建新的容器,但没有运行

[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

猜你喜欢

转载自blog.51cto.com/11451960/2640817