docker 基本操作Ⅲ
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 基本操作Ⅲ相关的知识,希望对你有一定的参考价值。
1 数据卷备份恢复
- 我们一般用的最多的是把容器和本地宿主机做目录映射直接存在本地,但是还有一种就是数据卷的备份与恢复,如下就来介绍:
先来一副图来了解一下数据卷的恢复与备份
宿主机也就是我们的服务器分享一个/data/backup/ 目录,本地的这个backup目录和新建容器内的backup相互映射,而我们现在的新建容器挂载了数据卷容器的/data/ 也就是意味着数据卷的data目录和容器的data目录数据是一致的,现在两两互通,下面也就是把新建容器中的data目录中的数据copy到backup中就可以了!这样就完成了真实的备份!
- 备份(本地创建备份目录)
mkdir /data/backup docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/ 说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/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//挂载数据卷新建容器,并解包
2 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网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
- 现在我们默认使用的是bridge,容器本身和外部是不能通信的,那我们怎么让容器与外界通信呢?如下来介绍怎么访问外部
首先使用centos镜像新建一个容器,然后在该容器中安装nginx服务,并启动
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08dd3d386d00 centos7 "bash" 3 seconds ago Up 3 seconds pensive_brattain
[[email protected] ~]# docker exec -it 08dd3d386d00 bash //进入容器
[[email protected] /]# yum install -y epel-release
//需要先安装epel扩展源
[[email protected] /]# yum install -y nginx //开始安装nginx
[[email protected] /]# systemctl start nginx //启动nginx,启动是出现了一个报错
Failed to get D-Bus connection: Operation not permitted
这个是这是因为dbus-daemon没有启动,解决该问题可以这样做
[[email protected] ~]# docker rm -f 794b4d5ed700
794b4d5ed700
先删除这个容器之后在启动容器
[[email protected] ~]# docker run -itd --privileged -e "container=docker" -p 808:80 centos7 /usr/sbin/init //启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init
5896f605586a5697f5bd8e8ae16e207f6716a70adf1c422c2da8909a2496c8df
[[email protected] /]# systemctl start nginx //启动nginx时就没有问题了
[[email protected] /]# rpm -qa nginx //查看nginx的rpm包
nginx-1.10.2-2.el7.x86_64
2 再把该容器导成一个新的镜像(centos_nginx),然后再使用新镜像创建容器,并指定端口映射。
[[email protected] ~]# docker commit -m "install nginx" -a "chylinux" 08dd3d386d00 centos7 //将容器导成镜像 sha256:8170b76bc6a875bebfa1860dcc3ad9bade4640e0dc73421bcd30ebe80bc1f973 [[email protected] ~]# docker images //查看成功 REPOSITORY TAG IMAGE ID CREATED SIZE centos7 latest 8170b76bc6a8 About a minute ago 569MB [[email protected] ~]# docker run -itd -p 808:80 centos7 bash ////-p 可以指定端口映射,本例中将容器的80端口映射为本地的808端口(这里是容器的端口映射为本地的端口,本地的端口自定义即可) 794b4d5ed700cfaffa0cbe6e8755cbf1b072e0b298e8ade609b6accd6430cb9e [[email protected] ~]# curl localhost:808 本地可以访问了
测试外部机器访问内部的容器
[[email protected] ~]# curl 192.168.212.10:808 //访问成功
3 配置桥接网络
- 为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了
[[email protected] ~]# cd /etc/sysconfig/network-scripts/ [[email protected] network-scripts]# cp ifcfg-ens33 ifcfg-br0 [[email protected] network-scripts]# vi ifcfg-br0 TYPE=Bridge //将这个变为bridge BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=br0 //改为网卡的名称 UUID=9921878c-a733-4564-8737-ee6af48d5015 DEVICE=br0 //改为网卡的名称 ONBOOT=yes IPADDR=192.168.212.10 NETMASK=255.255.255.0 GATEWAY=192.168.212.2 DNS1=119.29.29.29 [[email protected] network-scripts]# vi ifcfg-ens33 //之后在编辑ens33 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 #UUID=9921878c-a733-4564-8737-ee6af48d5015 //需要注释 DEVICE=ens33 ONBOOT=yes #IPADDR=192.168.212.10 //需要注释 #NETMASK=255.255.255.0 //需要注释 #GATEWAY=192.168.212.2 //需要注释 #DNS1=119.29.29.29 //需要注释 BRIDGE=br0 增加刚修改的ifcfg-br0 [[email protected] network-scripts]# systemctl restart network //重启网卡 [[email protected] network-scripts]# ifconfig //查看到用的是一个网卡(即ens33与bro用的一个网卡) br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.212.10 netmask 255.255.255.0 broadcast 192.168.212.255 inet6 fe80::4228:9a24:3718:ba9e prefixlen 64 scopeid 0x20<link> ether 00:0c:29:70:77:62 txqueuelen 1000 (Ethernet) RX packets 36 bytes 3544 (3.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 28 bytes 2456 (2.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:77ff:fe70:d168 prefixlen 64 scopeid 0x20<link> ether 02:42:77:70:d1:68 txqueuelen 0 (Ethernet) RX packets 3 bytes 96 (96.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 11 bytes 806 (806.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 安装pipwork
pipework是由Docker的工程师Jérme Petazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用.
[[email protected] ~]# git clone https://github.com/jpetazzo/pipework [[email protected] ~]# cd pipework/ 进入到目录下 [[email protected] pipework]# cp pipework /usr/local/bin/ [[email protected] pipework]# docker run -itd --net=none centos7 bash //启动一个容器 a9655415cca39879f21d51ca8a658aeb2d66ba3d6f9cb35cf81fa7d0cc00f308 [[email protected] pipework]# docker exec -it a96554 bach //进入容器 [[email protected] /]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 查看没有地址,现在来配置一个Ip地址
pipwork配置ip地址并且测试
[[email protected] pipework]# pipework br0 a9655415cca3 192.168.212.18/[email protected] // br0是网卡的名称,后面是容器的名字(id也可以)后面跟给容器设置的ip地址与子网掩码,@后面跟的是网关 [[email protected] pipework]# docker exec -it a96554 bash [[email protected] /]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 14: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 46:6f:8b:5b:28:17 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.212.18/24 brd 192.168.212.255 scope global eth1 valid_lft forever preferred_lft forever 如上已经查看到有设置的ip地址 [[email protected] /]# ping baidu.com //在容器中是可以 PING baidu.com (220.181.57.217) 56(84) bytes of data. 64 bytes from 220.181.57.217: icmp_seq=1 ttl=128 time=5.57 ms 64 bytes from 220.181.57.217: icmp_seq=2 ttl=128 time=5.69 ms 现在来进行测试,用一台chy01的机器测试 [[email protected] ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.212.11 netmask 255.255.255.0 broadcast 192.168.212.255 inet6 fe80::243b:ddac:7a2b:a5b prefixlen 64 scopeid 0x20<link> ether 00:0c:29:13:b3:3b txqueuelen 1000 (Ethernet) RX packets 96358 bytes 6128391 (5.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 11801 bytes 742577 (725.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [[email protected] ~]# ping 192.168.212.18 PING 192.168.212.18 (192.168.212.18) 56(84) bytes of data. 64 bytes from 192.168.212.18: icmp_seq=1 ttl=64 time=1.17 ms 64 bytes from 192.168.212.18: icmp_seq=2 ttl=64 time=0.452 ms 64 bytes from 192.168.212.18: icmp_seq=3 ttl=64 time=0.584 ms (如上用其它的机器也可以ping通)
这个就是咱们使用pipework软件所搭建起来的bridge模式,当然,这种模式才是真正的网桥模式,官方的bridge模式我认为就是虚拟机下面的NAT模式!
以上是关于docker 基本操作Ⅲ的主要内容,如果未能解决你的问题,请参考以下文章