101.数据卷备份恢复 docker网络模式、报错处理、配置桥接

25.9 数据卷备份恢复

25.10 docker网络模式

25.11 opration not permitted(新建容器启动nginx报错)

25.12 配置桥接网络(pipework)

 

 

 

25.9 数据卷备份恢复

 

 

 

备份

mkdir /data/backup

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

说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。

恢复

思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把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才是真正的桥接

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3866149/blog/3054544

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值