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

[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工具

mark

让容器在后台运行: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 /]# 

mark

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

mark

第二步,更改配置文件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]

mark

排障过程:

通过curl进行验证:curl https://dhq9bx4f.mirror.aliyuncs.com/v2/_catalog 是可以正常返回结果,说明服务没有问题

mark

通过谷歌×××(百度不行,解决不了这个问题),一共大概有两种方式

1、设置dns,在/etc/resolv.conf,以及/etc/docker/daemon.json中增加dns。例如dns地址:8.8.8.8

mark

mark

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"]}

总结:今天换了电脑上的虚拟机俩做实验,一次成功
mark

[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目录下面。

mark

mark

根据图示理解:宿主机(服务器)分享了一个/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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值