docker 基本操作Ⅲ

1 数据卷备份恢复 

- 我们一般用的最多的是把容器和本地宿主机做目录映射直接存在本地,但是还有一种就是数据卷的备份与恢复,如下就来介绍:

先来一副图来了解一下数据卷的恢复与备份


dc1d0e02ab77ac456f7a449c4d4808fa.png-wh_

宿主机也就是我们的服务器分享一个/data/backup/ 目录,本地的这个backup目录和新建容器内的backup相互映射,而我们现在的新建容器挂载了数据卷容器的/data/ 也就是意味着数据卷的data目录和容器的data目录数据是一致的,现在两两互通,下面也就是把新建容器中的data目录中的数据copy到backup中就可以了!这样就完成了真实的备份!

- 备份(本地创建备份目录)

1
2
3
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 目录下面。

恢复:

- 思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。

1
2
docker run -itd - v  /data/  --name testvol2 centos  bash  新建数据卷容器
docker run --volumes-from testvol2 - v  /data/backup/ : /backup  centos  tar  xf  /backup/data . tar // 挂载数据卷新建容器,并解包

2 Docker网络模式

- host模式,使用docker run时使用--net=host指定docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip

- container模式,使用--net=container:container_id/container_name多个容器使用共同的网络,看到的ip是一样的

- none模式,使用--net=none指定这种模式下,不会配置任何网络

- bridge模式,使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

- 现在我们默认使用的是bridge,容器本身和外部是不能通信的,那我们怎么让容器与外界通信呢?如下来介绍怎么访问外部

  1. 首先使用centos镜像新建一个容器,然后在该容器中安装nginx服务,并启动

[root@chy ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

08dd3d386d00        centos7             "bash"              3 seconds ago       Up 3 seconds                            pensive_brattain

[root@chy ~]# docker exec -it 08dd3d386d00 bash //进入容器

[root@08dd3d386d00 /]# yum install -y epel-release

//需要先安装epel扩展源

[root@08dd3d386d00 /]# yum install -y nginx //开始安装nginx

[root@08dd3d386d00 /]# systemctl start nginx //启动nginx,启动是出现了一个报错

Failed to get D-Bus connection: Operation not permitted

这个是这是因为dbus-daemon没有启动,解决该问题可以这样做

[root@chy ~]# docker rm -f 794b4d5ed700

794b4d5ed700

先删除这个容器之后在启动容器

[root@chy ~]# docker run -itd --privileged -e "container=docker" -p 808:80 centos7 /usr/sbin/init //启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init

5896f605586a5697f5bd8e8ae16e207f6716a70adf1c422c2da8909a2496c8df

[root@5896f605586a /]# systemctl start nginx //启动nginx时就没有问题了

[root@08dd3d386d00 /]# rpm -qa nginx //查看nginx的rpm包

nginx-1.10.2-2.el7.x86_64


2 再把该容器导成一个新的镜像(centos_nginx),然后再使用新镜像创建容器,并指定端口映射。

1
2
3
4
5
6
7
8
[root@chy ~] # docker commit -m "install nginx" -a "chylinux" 08dd3d386d00 centos7 //将容器导成镜像
sha256:8170b76bc6a875bebfa1860dcc3ad9bade4640e0dc73421bcd30ebe80bc1f973
[root@chy ~] # docker images //查看成功
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
centos7                       latest              8170b76bc6a8        About a minute ago   569MB
[root@chy ~] # docker run -itd -p 808:80 centos7 bash ////-p 可以指定端口映射,本例中将容器的80端口映射为本地的808端口(这里是容器的端口映射为本地的端口,本地的端口自定义即可)
794b4d5ed700cfaffa0cbe6e8755cbf1b072e0b298e8ade609b6accd6430cb9e
[root@chy ~] # curl localhost:808 本地可以访问了

测试外部机器访问内部的容器

1
[root@chy01 ~] # curl 192.168.212.10:808 //访问成功

3 配置桥接网络

- 为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[root@chy ~] # cd /etc/sysconfig/network-scripts/
[root@chy network-scripts] # cp ifcfg-ens33 ifcfg-br0
[root@chy network-scripts] # vi ifcfg-br0
TYPE=Bridge  // 将这个变为bridge 
BOOTPROTO=static
DEFROUTE= yes
PEERDNS= yes
PEERROUTES= yes
IPV4_FAILURE_FATAL=no
IPV6INIT= yes
IPV6_AUTOCONF= yes
IPV6_DEFROUTE= yes
IPV6_PEERDNS= yes
IPV6_PEERROUTES= yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0  // 改为网卡的名称
UUID=9921878c-a733-4564-8737-ee6af48d5015
DEVICE=br0  // 改为网卡的名称
ONBOOT= yes
IPADDR=192.168.212.10
NETMASK=255.255.255.0
GATEWAY=192.168.212.2
DNS1=119.29.29.29
[root@chy network-scripts] # vi ifcfg-ens33 //之后在编辑ens33
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE= yes
PEERDNS= yes
PEERROUTES= yes
IPV4_FAILURE_FATAL=no
IPV6INIT= yes
IPV6_AUTOCONF= yes
IPV6_DEFROUTE= yes
IPV6_PEERDNS= yes
IPV6_PEERROUTES= yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
#UUID=9921878c-a733-4564-8737-ee6af48d5015 //需要注释
DEVICE=ens33
ONBOOT= yes
#IPADDR=192.168.212.10 //需要注释
#NETMASK=255.255.255.0 //需要注释
#GATEWAY=192.168.212.2 //需要注释
#DNS1=119.29.29.29 //需要注释
BRIDGE=br0 增加刚修改的ifcfg-br0
[root@chy network-scripts] # systemctl restart network //重启网卡
[root@chy network-scripts] # ifconfig //查看到用的是一个网卡(即ens33与bro用的一个网卡)
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 192.168.212.10  netmask 255.255.255.0  broadcast 192.168.212.255
         inet6 fe80::4228:9a24:3718:ba9e  prefixlen 64  scopeid 0x20<link>
         ether 00:0c:29:70:77:62  txqueuelen 1000  (Ethernet)
         RX packets 36  bytes 3544 (3.4 KiB)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 28  bytes 2456 (2.3 KiB)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
         docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
         inet6 fe80::42:77ff:fe70:d168  prefixlen 64  scopeid 0x20<link>
         ether 02:42:77:70:d1:68  txqueuelen 0  (Ethernet)
         RX packets 3  bytes 96 (96.0 B)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 11  bytes 806 (806.0 B)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

- 安装pipwork

pipework是由Docker的工程师Jérme Petazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用.

1
2
3
4
5
6
7
8
9
10
11
12
[root@chy ~] # git clone https://github.com/jpetazzo/pipework
[root@chy ~] # cd pipework/ 进入到目录下
[root@chy pipework] # cp pipework /usr/local/bin/ 
[root@chy pipework] # docker run -itd --net=none centos7 bash  //启动一个容器
a9655415cca39879f21d51ca8a658aeb2d66ba3d6f9cb35cf81fa7d0cc00f308
[root@chy pipework] # docker exec -it a96554 bach //进入容器
[root@a9655415cca3 /] # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
     link /loopback  00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1 /8  scope host lo
        valid_lft forever preferred_lft forever
查看没有地址,现在来配置一个Ip地址

pipwork配置ip地址并且测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@chy pipework] # pipework br0 a9655415cca3 192.168.212.18/24@192.168.212.2 // br0是网卡的名称,后面是容器的名字(id也可以)后面跟给容器设置的ip地址与子网掩码,@后面跟的是网关
[root@chy pipework] # docker exec -it a96554 bash
[root@a9655415cca3 /] # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
     link /loopback  00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1 /8  scope host lo
        valid_lft forever preferred_lft forever
14: eth1@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
     link /ether  46:6f:8b:5b:28:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0
     inet 192.168.212.18 /24  brd 192.168.212.255 scope global eth1
        valid_lft forever preferred_lft forever
如上已经查看到有设置的ip地址
[root@a9655415cca3 /] # ping baidu.com //在容器中是可以
PING baidu.com (220.181.57.217) 56(84) bytes of data.
64 bytes from 220.181.57.217: icmp_seq=1 ttl=128  time =5.57 ms
64 bytes from 220.181.57.217: icmp_seq=2 ttl=128  time =5.69 ms
现在来进行测试,用一台chy01的机器测试
[root@chy01 ~] # ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 192.168.212.11  netmask 255.255.255.0  broadcast 192.168.212.255
         inet6 fe80::243b:ddac:7a2b:a5b  prefixlen 64  scopeid 0x20<link>
         ether 00:0c:29:13:b3:3b  txqueuelen 1000  (Ethernet)
         RX packets 96358  bytes 6128391 (5.8 MiB)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 11801  bytes 742577 (725.1 KiB)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@chy01 ~] # ping 192.168.212.18
PING 192.168.212.18 (192.168.212.18) 56(84) bytes of data.
64 bytes from 192.168.212.18: icmp_seq=1 ttl=64  time =1.17 ms
64 bytes from 192.168.212.18: icmp_seq=2 ttl=64  time =0.452 ms
64 bytes from 192.168.212.18: icmp_seq=3 ttl=64  time =0.584 ms
(如上用其它的机器也可以 ping 通)

这个就是咱们使用pipework软件所搭建起来的bridge模式,当然,这种模式才是真正的网桥模式,官方的bridge模式我认为就是虚拟机下面的NAT模式!

希望看过的童鞋多多指教,谢谢!j_0063.gifj_0063.gif




     本文转自我不是瘦子51CTO博客,原文链接:http://blog.51cto.com/chy940405/1982433,如需转载请自行联系原作者




优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/508407

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。