设为首页 收藏本站
查看: 1142|回复: 0

[经验分享] Docker容器管理、仓库管理、数据管理、数据卷备份与恢复

[复制链接]

尚未签到

发表于 2019-2-21 10:00:00 | 显示全部楼层 |阅读模式
  [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  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

恢复也就是按照刚刚的思路反着来就可以了。实用性不高,因为多数情况下我们还是用宿主机映射的比较广泛。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675194-1-1.html 上篇帖子: Docker 基础配置安装 下篇帖子: Docker 网络模式、配置桥接网络
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表