101.數據卷備份恢復 docker網絡模式、報錯處理、配置橋接

25.9 數據卷備份恢復html

25.10 docker網絡模式linux

25.11 opration not permitted(新建容器啓動nginx報錯)nginx

25.12 配置橋接網絡(pipework)git

 

 

 

25.9 數據卷備份恢復github

 

 

 

備份docker

mkdir /data/backupshell

docker run --volumes-from testvol -v  /data/backup/:/backup centos tar cvf  /backup/data.tar /data/vim

說明:首先咱們須要使用testvol數據卷新開一個容器,同時咱們還須要把本地的/vol_data_backup/目錄掛載到該容器的/backup下,這樣在容器中/backup目錄裏面新建的文件,咱們就能夠直接在/data/backup/目錄中看到了。 而後再把/data/目錄下面的文件打包到成data.tar文件放到/backup目錄下面。centos

恢復bash

思路: 先新建一個數據卷容器,再建一個新的容器並掛載該數據卷容器,而後再把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

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

25.10 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網絡模式。同一個宿主機上的全部容器會在同一個網段下,相互之間是能夠通訊的。

#還有一種網絡模式,橋接(使用第三方) 下面有講到

 

1.首先使用centos鏡像新建一個容器,而後在該容器中安裝httpd服務,並啓動

2.再把該容器導成一個新的鏡像(centos-httpd),而後再使用新鏡像建立容器,並指定端口映射

docker run -itd -p 5123:80 centos-httpd bash  //-p 能夠指定端口映射,本例中將容器的80端口映射爲本地(宿主機)的5123端口

3.docker exec -it container_id  bash 

啓動httpd: httpd -k start 

編輯1.html: vi /var/www/html/1.html 隨便寫點東西

退出該容器:exit

4.測試: curl 127.0.0.1:5123/1.html 

-p後面也支持IP:port:ip:port 的格式,好比

-p 127.0.0.1:8080:80 

也能夠不寫本地的端口,只寫ip,這樣會隨意分配一個端口

-p 127.0.0.1::80 //注意這裏是兩個冒號

 

 

 

實例:

[root@axinlinux-01 ~]# docker start 9cf09cd1eec8

[root@axinlinux-01 ~]# docker exec -it 9cf09cd1eec8 bash

[root@9cf09cd1eec8 /]# yum install -y nginx

[root@9cf09cd1eec8 /]# yum install -y epel-release

[root@9cf09cd1eec8 /]# yum install -y nginx

[root@4362a48548da /]# systemctl start nginx

Failed to get D-Bus connection: Operation not permitted #報錯。下一節會講

[root@9cf09cd1eec8 /]# rpm -qa nginx

nginx-1.12.2-2.el7.x86_64

[root@9cf09cd1eec8 /]# exit

[root@axinlinux-01 ~]# docker commit -m "install nginx" -a "axin" 9cf09cd1eec8 centos_with_nginx #將這個容器導出爲鏡像

sha256:4d45adc3a30f7cadfbe3776e57c96581326caf4c34727c4d39ffafb8b1732c33

[root@axinlinux-01 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos_with_nginx latest 4d45adc3a30f 50 seconds ago 464MB

[root@axinlinux-01 ~]# docker run -itd -p 8088:80 centos_with_nginx bash #端口映射。就是這個鏡像的80端口映射到宿主機的8088端口。在宿主機直接訪問8088就能夠了

4362a48548da0a47c1717a3a658c65595f97aedc397c84558177671e4eab1d7c

[root@axinlinux-01 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

4362a48548da centos_with_nginx "bash" About a minute ago Up About a minute 0.0.0.0:8088->80/tcp confident_pare

測試(curl)在下一節

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

25.11 opration not permitted

 

 

 

新建的容器,啓動nginx或者httpd服務的時候會報錯

Failed to get D-Bus connection: Operation not permitted

這是由於dbus-daemon沒有啓動,解決該問題能夠這樣作

啓動容器時,要加上--privileged -e "container=docker" ,而且最後面的命令改成/usr/sbin/init

docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init

 

 

實例:

[root@axinlinux-01 ~]# docker run -itd --privileged -e "container=docker" -p 8088:80 centos_with_nginx /usr/sbin/init #以這種方式啓動,而且端口映射

f43b441bac6b9e9826a474526de1d46fd6a518f2bb3c69a4a503c66b11028692

docker: Error response from daemon: driver failed programming external connectivity on endpoint confident_shirley (9a00b8a427b07c1a14a9cbbe78a0546c3adbf2bc01360f6f6b015d3948b36ca0): Bind for 0.0.0.0:8088 failed: port is already allocated. #報錯是由於,上一節,咱們作過端口映射了,要刪掉以前作過的

[root@axinlinux-01 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

db9f3c18942e centos_with_nginx "bash" 5 minutes ago Up 5 minutes 0.0.0.0:8088->80/tcp musing_lehmann

[root@axinlinux-01 ~]# docker rm -f db9f3c18942e

db9f3c18942e

[root@axinlinux-01 ~]# docker run -itd --privileged -e "container=docker" -p 8088:80 centos_with_nginx /usr/sbin/init

487b3c6cf5959ff75543d4bf039730640d86fbc7ff90350a6668522729045cd7

[root@axinlinux-01 ~]# docker exec -it 487b3c6cf595 bash #進去

[root@487b3c6cf595 /]# systemctl start nginx

[root@487b3c6cf595 /]# curl localhost #開啓nginx是能夠的

[root@487b3c6cf595 /]# exit

[root@axinlinux-01 ~]# curl localhost:8088 #在外面crul指定8088端口

[root@axinlinux-02 ~]# curl 192.168.208.128:8088 #在另外一臺機器,curl這臺機器的8088

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

25.12 配置橋接網絡

 

 

 

咱們把它叫作pipework,他可以實現讓你的docker容器和你的宿主機使用同一個交換機。他們在同一個網段下。這樣就能和外面的其餘機器進行通訊。那也能夠把這個docker容器當作是一個獨立的服務器。

好比咱們安裝lnmp,可讓外面的用戶直接訪問。咱們甚至能夠給他安裝sshd的服務,讓遠程用戶直接去登陸

爲了使本地網絡中的機器和Docker容器更方便的通訊,咱們常常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,咱們只要將Docker容器和宿主機的網卡橋接起來,再給Docker容器配上IP就能夠了。

1.cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0

2.vi ifcfg-eth0 //增長BRIDGE=br0,刪除IPADDR,NETMASK,GATEWAY,DNS1

3.vi ifcfg-br0//修改DEVICE爲br0,Type爲Bridge,把eth0的網絡設置設置到這裏來

4.systemctl restart network

5.安裝pipework

git clone https://github.com/jpetazzo/pipework

6.cp pipework/pipework /usr/local/bin/

7.開啓一個容器 #指定他的網絡模式爲none(就是沒有ip)

docker run -itd --net=none --name aming123 centos_with_nettool bash

8.pipework br0 aming123 192.168.208.135/24@192.168.208.2 #201爲容器的ip,@後面的ip爲網關ip #配置ip

docker exec -it aming123 bash #進去後ifconfig查看就能夠看到新添加的ip

 

 

 

 

實例:

[root@axinlinux-01 ~]# cd /etc/sysconfig/network-scripts/

[root@axinlinux-01 network-scripts]# ls #操做的網卡是ens33,針對ens33作橋接

[root@axinlinux-01 network-scripts]# cp ifcfg-ens33 ifcfg-br0

[root@axinlinux-01 network-scripts]# vim ifcfg-br0

TYPE=Ethernet #改成Bridge

BOOTPROTO=static

DEFROUTE=yes

NAME=ens33 #改成br0

UUID=d116f724-9bfb-4573-9f5b-7dace5640272 #註釋掉

DEVICE=ens33 #改成br0

ONBOOT=yes

IPADDR=192.168.208.128

NETMASK=255.255.255.0

GATEWAY=192.168.208.2

DNS1=119.29.29.29

 

PROXY_METHOD=none

BROWSER_ONLY=no

PREFIX=24

IPV4_FAILURE_FATAL=no

IPV6INIT=no

[root@axinlinux-01 network-scripts]# vim ifcfg-ens33

TYPE=Ethernet

BOOTPROTO=static

DEFROUTE=yes

NAME=ens33

#UUID=d116f724-9bfb-4573-9f5b-7dace5640272 #註釋掉

DEVICE=ens33

ONBOOT=yes

#IPADDR=192.168.208.128 #註釋掉

NETMASK=255.255.255.0

#GATEWAY=192.168.208.2 #註釋掉

#DNS1=119.29.29.29 #註釋掉

 

PROXY_METHOD=none

BROWSER_ONLY=no

#PREFIX=24 #註釋掉

IPV4_FAILURE_FATAL=no

IPV6INIT=no

BRIDGE=br0 #加入這一行(大寫)

以上至關於把ens33的ip配置到了br0上。而後ens33又把br0做爲一個橋接的對象

[root@axinlinux-01 network-scripts]# systemctl restart network #重啓一下網絡。若是配置不對xshell會斷掉

[root@axinlinux-01 network-scripts]# ifconfig #檢查一下。成功後,br0會有ip,ens33沒有ip

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.208.128 netmask 255.255.255.0 broadcast 192.168.208.255 #有ip地址

inet6 fe80::cc49:3eff:fe44:44e5 prefixlen 64 scopeid 0x20<link>

ether 00:0c:29:87:42:24 txqueuelen 1000 (Ethernet)

RX packets 102 bytes 9686 (9.4 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 115 bytes 16675 (16.2 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ether 00:0c:29:87:42:24 txqueuelen 1000 (Ethernet) #沒有ip

RX packets 129 bytes 15011 (14.6 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 141 bytes 21075 (20.5 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

若是有複製的ens33:0相似的,要刪掉

[root@axinlinux-01 network-scripts]# cd

[root@axinlinux-01 ~]# git clone https://github.com/jpetazzo/pipework #克隆pipework

[root@axinlinux-01 ~]# ls

aming.txt centos7_with_nettool.tar log pipework sed

[root@axinlinux-01 ~]# cd pipework/ #cd進去

[root@axinlinux-01 pipework]# ls

docker-compose.yml doctoc LICENSE pipework pipework.spec README.md

[root@axinlinux-01 pipework]# cp pipework /usr/local/bin/ #把pipework複製到path路徑下。目的是直接執行他

[root@axinlinux-01 pipework]# docker run -itd --net=none centos_with_nginx bash #開啓一個鏡像,指定他爲none,就是沒有ip

7d77d8f2eaef783cd62e75d87274cfd7909c7fe5a02aae86f0c62cbab7c5b73d

[root@axinlinux-01 pipework]# docker exec -it 7d77d8f2eae bash #進去

[root@7d77d8f2eaef /]# ifconfig #沒有網卡,只有lo

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

loop txqueuelen 1 (Local Loopback)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@7d77d8f2eaef /]# exit

[root@axinlinux-01 pipework]# pipework br0 7d77d8f2ea 192.168.208.135/24@192.168.208.2 #給這個容器設置192.168.208.135ip 24位 192.168.208.2網關

[root@axinlinux-01 pipework]# docker exec -it 7d77d8f2ea bash #進去查看

[root@7d77d8f2eaef /]# ifconfig

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.208.135 netmask 255.255.255.0 broadcast 192.168.208.255

ether d2:d1:1d:03:ec:90 txqueuelen 1000 (Ethernet)

RX packets 8 bytes 648 (648.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 1 bytes 42 (42.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

loop txqueuelen 1 (Local Loopback)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@axinlinux-02 ~]# ping 192.168.208.135 #在另外一臺機器上看可否ping同

[root@7d77d8f2eaef /]# ping www.baidu.com #看他是否能連外網。網關設定對了就能夠連外網

這個時候開啓一些服務,lnmp、ssh等等。在02機器上就能夠直接用了

這個就是用第三方pipework實現的橋接網絡。跟docker官網的那個bridge模式是不一樣的。官方自帶的bridge其實就是NAT。這個bridge纔是真正的橋接

相關文章
相關標籤/搜索