1 資料卷備份恢複
- 我們一般用的最多的是把容器和本地主控端做目錄映射直接存在本地,但是還有一種就是資料卷的備份與恢複,如下就來介紹:
先來一副圖來了解一下資料卷的恢複與備份
<a href="https://s3.51cto.com/oss/201711/16/dc1d0e02ab77ac456f7a449c4d4808fa.png-wh_500x0-wm_3-wmp_4-s_3414933789.png" target="_blank"></a>
主控端也就是我們的伺服器分享一個/data/backup/ 目錄,本地的這個backup目錄和建立容器内的backup互相映射,而我們現在的建立容器挂載了資料卷容器的/data/ 也就是意味着資料卷的data目錄和容器的data目錄資料是一緻的,現在兩兩互通,下面也就是把建立容器中的data目錄中的資料copy到backup中就可以了!這樣就完成了真實的備份!
- 備份(本地建立備份目錄)
<code>mkdir</code> <code>/data/backup</code>
<code>docker run --volumes-from testvol -</code><code>v</code> <code>/data/backup/</code><code>:</code><code>/backup</code> <code>centos </code><code>tar</code> <code>cvf </code><code>/backup/data</code><code>.</code><code>tar</code> <code>/data/</code>
<code>說明:首先我們需要使用testvol資料卷新開一個容器,同時我們還需要把本地的</code><code>/data/backup/</code><code>目錄挂載到該容器的</code><code>/backup</code><code>下,這樣在容器中</code><code>/backup</code><code>目錄裡面建立的檔案,我們就可以直接在</code><code>/data/backup/</code><code>目錄中看到了。 然後再把</code><code>/data/</code><code>目錄下面的檔案打包到成data.</code><code>tar</code><code>檔案放到</code><code>/backup</code><code>目錄下面。</code>
恢複:
- 思路: 先建立一個資料卷容器,再建一個新的容器并挂載該資料卷容器,然後再把tar包解包。
<code>docker run -itd -</code><code>v</code> <code>/data/</code> <code>--name testvol2 centos </code><code>bash</code> <code>建立資料卷容器</code>
<code>docker run --volumes-from testvol2 -</code><code>v</code> <code>/data/backup/</code><code>:</code><code>/backup</code> <code>centos </code><code>tar</code> <code>xf </code><code>/backup/data</code><code>.</code><code>tar</code><code>//</code><code>挂載資料卷建立容器,并解包</code>
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,容器本身和外部是不能通信的,那我們怎麼讓容器與外界通信呢?如下來介紹怎麼通路外部
首先使用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),然後再使用新鏡像建立容器,并指定端口映射。
<code>[root@chy ~]</code><code># docker commit -m "install nginx" -a "chylinux" 08dd3d386d00 centos7 //将容器導成鏡像</code>
<code>sha256:8170b76bc6a875bebfa1860dcc3ad9bade4640e0dc73421bcd30ebe80bc1f973</code>
<code>[root@chy ~]</code><code># docker images //檢視成功</code>
<code>REPOSITORY TAG IMAGE ID CREATED SIZE</code>
<code>centos7 latest 8170b76bc6a8 About a minute ago 569MB</code>
<code>[root@chy ~]</code><code># docker run -itd -p 808:80 centos7 bash ////-p 可以指定端口映射,本例中将容器的80端口映射為本地的808端口(這裡是容器的端口映射為本地的端口,本地的端口自定義即可)</code>
<code>794b4d5ed700cfaffa0cbe6e8755cbf1b072e0b298e8ade609b6accd6430cb9e</code>
<code>[root@chy ~]</code><code># curl localhost:808 本地可以通路了</code>
測試外部機器通路内部的容器
<code>[root@chy01 ~]</code><code># curl 192.168.212.10:808 //通路成功</code>
3 配置橋接網絡
- 為了使本地網絡中的機器和Docker容器更友善的通信,我們經常會有将Docker容器配置到和主機同一網段的需求。這個需求其實很容易實作,我們隻要将Docker容器和主控端的網卡橋接起來,再給Docker容器配上IP就可以了
<code>[root@chy ~]</code><code># cd /etc/sysconfig/network-scripts/</code>
<code>[root@chy network-scripts]</code><code># cp ifcfg-ens33 ifcfg-br0</code>
<code>[root@chy network-scripts]</code><code># vi ifcfg-br0</code>
<code>TYPE=Bridge </code><code>//</code><code>将這個變為bridge </code>
<code>BOOTPROTO=static</code>
<code>DEFROUTE=</code><code>yes</code>
<code>PEERDNS=</code><code>yes</code>
<code>PEERROUTES=</code><code>yes</code>
<code>IPV4_FAILURE_FATAL=no</code>
<code>IPV6INIT=</code><code>yes</code>
<code>IPV6_AUTOCONF=</code><code>yes</code>
<code>IPV6_DEFROUTE=</code><code>yes</code>
<code>IPV6_PEERDNS=</code><code>yes</code>
<code>IPV6_PEERROUTES=</code><code>yes</code>
<code>IPV6_FAILURE_FATAL=no</code>
<code>IPV6_ADDR_GEN_MODE=stable-privacy</code>
<code>NAME=br0 </code><code>//</code><code>改為網卡的名稱</code>
<code>UUID=9921878c-a733-4564-8737-ee6af48d5015</code>
<code>DEVICE=br0 </code><code>//</code><code>改為網卡的名稱</code>
<code>ONBOOT=</code><code>yes</code>
<code>IPADDR=192.168.212.10</code>
<code>NETMASK=255.255.255.0</code>
<code>GATEWAY=192.168.212.2</code>
<code>DNS1=119.29.29.29</code>
<code>[root@chy network-scripts]</code><code># vi ifcfg-ens33 //之後在編輯ens33</code>
<code>TYPE=Ethernet</code>
<code>NAME=ens33</code>
<code>#UUID=9921878c-a733-4564-8737-ee6af48d5015 //需要注釋</code>
<code>DEVICE=ens33</code>
<code>#IPADDR=192.168.212.10 //需要注釋</code>
<code>#NETMASK=255.255.255.0 //需要注釋</code>
<code>#GATEWAY=192.168.212.2 //需要注釋</code>
<code>#DNS1=119.29.29.29 //需要注釋</code>
<code>BRIDGE=br0 增加剛修改的ifcfg-br0</code>
<code>[root@chy network-scripts]</code><code># systemctl restart network //重新開機網卡</code>
<code>[root@chy network-scripts]</code><code># ifconfig //檢視到用的是一個網卡(即ens33與bro用的一個網卡)</code>
<code>br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</code>
<code> </code><code>inet 192.168.212.10 netmask 255.255.255.0 broadcast 192.168.212.255</code>
<code> </code><code>inet6 fe80::4228:9a24:3718:ba9e prefixlen 64 scopeid 0x20<link></code>
<code> </code><code>ether 00:0c:29:70:77:62 txqueuelen 1000 (Ethernet)</code>
<code> </code><code>RX packets 36 bytes 3544 (3.4 KiB)</code>
<code> </code><code>RX errors 0 dropped 0 overruns 0 frame 0</code>
<code> </code><code>TX packets 28 bytes 2456 (2.3 KiB)</code>
<code> </code><code>TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</code>
<code> </code><code>docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</code>
<code> </code><code>inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0</code>
<code> </code><code>inet6 fe80::42:77ff:fe70:d168 prefixlen 64 scopeid 0x20<link></code>
<code> </code><code>ether 02:42:77:70:d1:68 txqueuelen 0 (Ethernet)</code>
<code> </code><code>RX packets 3 bytes 96 (96.0 B)</code>
<code> </code><code>TX packets 11 bytes 806 (806.0 B)</code>
- 安裝pipwork
pipework是由Docker的工程師Jérme Petazzoni開發的一個Docker網絡配置工具,由200多行shell實作,友善易用.
<code>[root@chy ~]</code><code># git clone https://github.com/jpetazzo/pipework</code>
<code>[root@chy ~]</code><code># cd pipework/ 進入到目錄下</code>
<code>[root@chy pipework]</code><code># cp pipework /usr/local/bin/ </code>
<code>[root@chy pipework]</code><code># docker run -itd --net=none centos7 bash //啟動一個容器</code>
<code>a9655415cca39879f21d51ca8a658aeb2d66ba3d6f9cb35cf81fa7d0cc00f308</code>
<code>[root@chy pipework]</code><code># docker exec -it a96554 bach //進入容器</code>
<code>[root@a9655415cca3 /]</code><code># ip add</code>
<code>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1</code>
<code> </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00</code>
<code> </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>
<code> </code><code>valid_lft forever preferred_lft forever</code>
<code>檢視沒有位址,現在來配置一個Ip位址</code>
pipwork配置ip位址并且測試
<code>[root@chy pipework]</code><code># pipework br0 a9655415cca3 192.168.212.18/[email protected] // br0是網卡的名稱,後面是容器的名字(id也可以)後面跟給容器設定的ip位址與子網路遮罩,@後面跟的是網關</code>
<code>[root@chy pipework]</code><code># docker exec -it a96554 bash</code>
<code>14: eth1@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000</code>
<code> </code><code>link</code><code>/ether</code> <code>46:6f:8b:5b:28:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0</code>
<code> </code><code>inet 192.168.212.18</code><code>/24</code> <code>brd 192.168.212.255 scope global eth1</code>
<code>如上已經檢視到有設定的ip位址</code>
<code>[root@a9655415cca3 /]</code><code># ping baidu.com //在容器中是可以</code>
<code>PING baidu.com (220.181.57.217) 56(84) bytes of data.</code>
<code>64 bytes from 220.181.57.217: icmp_seq=1 ttl=128 </code><code>time</code><code>=5.57 ms</code>
<code>64 bytes from 220.181.57.217: icmp_seq=2 ttl=128 </code><code>time</code><code>=5.69 ms</code>
<code>現在來進行測試,用一台chy01的機器測試</code>
<code>[root@chy01 ~]</code><code># ifconfig</code>
<code>ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500</code>
<code> </code><code>inet 192.168.212.11 netmask 255.255.255.0 broadcast 192.168.212.255</code>
<code> </code><code>inet6 fe80::243b:ddac:7a2b:a5b prefixlen 64 scopeid 0x20<link></code>
<code> </code><code>ether 00:0c:29:13:b3:3b txqueuelen 1000 (Ethernet)</code>
<code> </code><code>RX packets 96358 bytes 6128391 (5.8 MiB)</code>
<code> </code><code>TX packets 11801 bytes 742577 (725.1 KiB)</code>
<code>[root@chy01 ~]</code><code># ping 192.168.212.18</code>
<code>PING 192.168.212.18 (192.168.212.18) 56(84) bytes of data.</code>
<code>64 bytes from 192.168.212.18: icmp_seq=1 ttl=64 </code><code>time</code><code>=1.17 ms</code>
<code>64 bytes from 192.168.212.18: icmp_seq=2 ttl=64 </code><code>time</code><code>=0.452 ms</code>
<code>64 bytes from 192.168.212.18: icmp_seq=3 ttl=64 </code><code>time</code><code>=0.584 ms</code>
<code>(如上用其它的機器也可以</code><code>ping</code><code>通)</code>
這個就是咱們使用pipework軟體所搭建起來的bridge模式,當然,這種模式才是真正的網橋模式,官方的bridge模式我認為就是虛拟機下面的NAT模式!

本文轉自我不是瘦子51CTO部落格,原文連結:http://blog.51cto.com/chy940405/1982433,如需轉載請自行聯系原作者