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