linux 学习笔记-102-docker-数据卷备份恢复,docker 网络模式,opration not permitted 问题,pipework 配置桥接网络

发布于 2018-06-04  205 次阅读


数据卷备份恢复

这种情况一般用在只做了共享,没做映射的情况下

共享:-v 容器目录

映射和共享:-v 本机目录:容器目录

备份

环境:数据卷容器有个/data 共享目录,在新建容器的时候,除了指定数据卷外,还用-v 参数创建宿主机和新建容器的映射目录,同时把共享目录/data 打包为 tar 并传输到映射目录中

看图:

linux 学习笔记-102-docker-数据卷备份恢复,docker 网络模式,opration not permitted 问题,pipework 配置桥接网络

简单命令:

mkdir /data/backup  //宿主机创建映射目录

docker run --volumes-from 数据卷容器名字 -v  /data/backup/:/backup 需要启动的新容器 tar

恢复

思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把 tar 包解包

新建数据卷容器:docker run -itd -v /data/ --name 指定这个数据卷容器的名字 镜像名 bash

挂载数据卷新建容器,并解包:docker run --volumes-from 数据卷容器的名字  -v /data/backup/:/backup centos tar xf /backup/data.tar

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 网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的

如何外部访问容器

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

ae6b89440dc1        am-centos           "bash"                   About an hour ago   Up About an hour                             inspiring_hypatia

[root@am-01:~#] docker exec -it ae6b89440dc1 bash

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

[root@ae6b89440dc1 /]# yum -y install nginx

[root@ae6b89440dc1 /]# rpm -qa nginx

nginx-1.12.2-2.el7.x86_64

[root@ae6b89440dc1 /]# exit

exit

#在容器中安装 nginx,记得安装 nginx 要先安装 epel 包
[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

ae6b89440dc1        am-centos           "bash"                   About an hour ago   Up About an hour                             inspiring_hypatia

[root@am-01:~#] docker commit -m "install_nginx" -a "am" ae6b89440dc1 centos-nginx

sha256:3bcd921141250cb47ca663583182fa9d51987fe7f7d9b5040136478190f43f59

[root@am-01:~#] docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

centos-nginx                latest              3bcd92114125        22 seconds ago      419MB

[root@am-01:~#] docker run -itd -p 8088:80 centos-nginx bash

2dbcf68d1ccdc056d8fdc7b495188df4c3c4dc0315310cdfffa72e9143b80afc

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

2dbcf68d1ccd        centos-nginx        "bash"                   26 seconds ago      Up 8 seconds        0.0.0.0:8088->80/tcp     hardcore_saha

#把安装好 nginx 的容器导出来为镜像,并使用这个新的镜像创建一个做了端口映射的容器

#容器导出为景象,-m 指定备注信息,-a 指定作者,紧跟着容器 ID 和新镜像的名称

解决 operation not permitted 问题

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

2dbcf68d1ccd        centos-nginx        "bash"                   26 seconds ago      Up 8 seconds        0.0.0.0:8088->80/tcp     hardcore_saha

[root@2dbcf68d1ccd /]# systemctl start nginx

Failed to get D-Bus connection: Operation not permitted

[root@2dbcf68d1ccd /]# exit

exit

#可以见到,按正常方式下启动容器,执行启动 nginx 命令的时候会有错误提示
[root@am-01:~#] docker rm -f 2dbcf68d1ccd

2dbcf68d1ccd

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

d69b5942ebd1cfffb26334e7d3edf84ef1ce0afb8976d01c82bc168076bc1ff8

[root@am-01:~#] docker exec -it d69b5942eb bash

[root@d69b5942ebd1 /]# systemctl start nginx

[root@d69b5942ebd1 /]# ps aux | grep nginx

root         84  0.0  0.1 120772  2088 ?        Ss   16:06   0:00 nginx: master process /usr/sbin/nginx

nginx        85  0.0  0.1 121236  3108 ?        S    16:06   0:00 nginx: worker process

nginx        86  0.0  0.1 121236  3108 ?        S    16:06   0:00 nginx: worker process

#先把刚创建的容器删除,重新创建容器,加上"--privileged -e "container=docker""参数,同时把 bash 改为/usr/sbin/init

#进入容器,启动 nginx,可以正常启动了

测试外部访问容器(am-02)

[root@am-02:~#] curl 172.17.1.240:8088

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">



<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

    <head>

        <title>Test Page for the Nginx HTTP Server on Fedora</title>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

………………省略部分输出信息………………

            <div class="logos">

                <a href="http://nginx.net/"><img

                    src="nginx-logo.png"

                    alt="[ Powered by nginx ]"

                    width="121" height="32" /></a>



                <a href="http://fedoraproject.org/"><img

                    src="poweredby.png"

                    alt="[ Powered by Fedora ]"

                    width="88" height="31" /></a>

            </div>

        </div>

    </body>

</html>

#在 am-02 上测试,可以正常访问容器中的 nginx

配置桥接网络

为了使本地网络中的机器和 Docker 容器更方便的通信,我们经常会有将 Docker 容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将 Docker 容器和宿主机的网卡桥接起来,再给 Docker 容器配上 IP 就可以了

配置虚拟网卡

[root@am-01:/etc/sysconfig/network-scripts#] yum -y install bridge-utils

#先安装必要的组件
[root@am-01:~#] cd /etc/sysconfig/network-scripts/

[root@am-01:/etc/sysconfig/network-scripts#] cp ifcfg-eno16777736 ifcfg-br0

[root@am-01:/etc/sysconfig/network-scripts#] vim ifcfg-br0

TYPE=Bridge

BOOTPROTO=static

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=no

NAME=br0

DEVICE=br0

#UUID=80fa5bbb-afca-4f28-b51b-e44c4af82938DEVICE=eno16777736

ONBOOT=yes

IPADDR=172.17.1.240

NETMASK=255.255.255.0

GATEWAY=172.17.1.1

DNS1=172.17.1.1

DNS2=114.114.114.114

HWADDR=00:0c:29:08:ac:45

#编辑新的网卡配置文件,修改 TYPE 为 Bridge,UUID 也注释掉,NAME 改为 br0,增加"DEVICE=br0"
[root@am-01:/etc/sysconfig/network-scripts#] vim ifcfg-eno16777736

TYPE=Ethernet

BOOTPROTO=static

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=no

NAME=eno16777736

DEVICE=eno16777736

#UUID=80fa5bbb-afca-4f28-b51b-e44c4af82938DEVICE=eno16777736

ONBOOT=yes

#IPADDR=172.17.1.240

#NETMASK=255.255.255.0

#GATEWAY=172.17.1.1

#DNS1=172.17.1.1

#DNS2=114.114.114.114

#HWADDR=00:0c:29:08:ac:45

BRIDGE=br0

#编辑旧的网卡配置文件,把一些参数注释掉,添加"Bridge=br0"和"DEVICE=eno16777736"
[root@am-01:/etc/sysconfig/network-scripts#] systemctl restart network

[root@am-01:/etc/sysconfig/network-scripts#] ifconfig

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

        inet 172.17.1.240  netmask 255.255.255.0  broadcast 172.17.1.255

        inet6 fe80::6848:d6ff:fe82:acbe  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:08:ac:45  txqueuelen 0  (Ethernet)

        RX packets 512  bytes 107354 (104.8 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 86  bytes 5260 (5.1 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



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

        ether 00:0c:29:08:ac:45  txqueuelen 1000  (Ethernet)

        RX packets 12726  bytes 1041836 (1017.4 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 2570  bytes 249009 (243.1 KiB)

        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

        inet6 ::1  prefixlen 128  scopeid 0x10<host>

        loop  txqueuelen 0  (Local Loopback)

        RX packets 12253  bytes 11104355 (10.5 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 12253  bytes 11104355 (10.5 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#虚拟网卡配置完成

#因每个环境都不一样,所以具体怎么设置还得自行研究,此处仅供参考

安装 pipework

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

Cloning into 'pipework'...

fatal: unable to access 'https://github.com/jpetazzo/pipework/': Peer reports incompatible or unsupported protocol version.

[root@am-01:~#] yum update -y nss curl libcurl

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

Cloning into 'pipework'...

remote: Counting objects: 501, done.

remote: Total 501 (delta 0), reused 0 (delta 0), pack-reused 501

Receiving objects: 100% (501/501), 172.97 KiB | 90.00 KiB/s, done.

Resolving deltas: 100% (264/264), done.

[root@am-01:~#] cp pipework/pipework /usr/local/bin/

#git 拉取 pipework 库,这里使用 https 拉取的时候提示错误,这时更新一下 nss、curl、libcurl 三个包,再使用 https 拉取即可

#把 pipework 目录的可执行文件 pipework 复制到 PATH 目录下,这样就可以直接运行这个命令了

开启容器

[root@am-01:~#] docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

centos-nginx                latest              3bcd92114125        2 hours ago         419MB

[root@am-01:~#] docker run -itd --net=none centos-nginx bash

af8288c36319e8fd3b64bd061c0a1176afef685d5bab403b3e6dc7e64fb71201

[root@am-01:~#] docker exec -it af8288c363 bash

[root@af8288c36319 /]# ifconfig

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

        inet 127.0.0.1  netmask 255.0.0.0

        loop  txqueuelen 0  (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@af8288c36319 /]# exit

exit

#创建并运行一个容器,设置网卡地址为 none,检查一下可以见到,没 IP 地址
[root@am-01:~#] pipework br0 af8288c 172.17.1.244/24@172.17.1.1

[root@am-01:~#] docker exec -it af8288c363 bash

[root@af8288c36319 /]# ifconfig

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

        inet 172.17.1.244  netmask 255.255.255.0  broadcast 172.17.1.255

        ether 1a:1e:20:09:3b:d1  txqueuelen 1000  (Ethernet)

        RX packets 506  bytes 98394 (96.0 KiB)

        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

[root@af8288c36319 /]# exit

exit

#使用 pipework 给这个容器设置跟宿主机同网段的 IP 地址

测试这个 IP 地址是否可用

[root@am-02:~#] ping 172.17.1.244

PING 172.17.1.244 (172.17.1.244) 56(84) bytes of data.

64 bytes from 172.17.1.244: icmp_seq=1 ttl=64 time=0.892 ms

64 bytes from 172.17.1.244: icmp_seq=2 ttl=64 time=1.28 ms

64 bytes from 172.17.1.244: icmp_seq=3 ttl=64 time=0.467 ms

64 bytes from 172.17.1.244: icmp_seq=4 ttl=64 time=0.424 ms

64 bytes from 172.17.1.244: icmp_seq=5 ttl=64 time=0.407 ms

^C

--- 172.17.1.244 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4003ms

rtt min/avg/max/mdev = 0.407/0.695/1.289/0.348 ms

#是可用的,这样设置就不需要做端口映射了