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才是真正的桥接