其实只要是把容器和本地宿主机做了目录映射直接存在本地,那我们只需对本地的硬盘定期备份下不就好了么?那这个备份就是多余的,但是偏偏就有这么干的。备份和恢复也就接踵而来。
1.1 本地创建备份目录
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目录下面。
也许有点乱,看下下面这个图:
宿主机也就是我们的服务器分享一个/data/backup/ 目录,本地的这个backup目录和新建容器内的backup相互映射,而我们现在的新建容器挂载了数据卷容器的/data/ 也就是意味着数据卷的data目录和容器的data目录数据是一致的,现在两两互通,下面也就是把新建容器中的data目录中的数据copy到backup中就可以了!这样就完成了真实的备份!
1.2 恢复
思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把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
恢复也就是按照刚刚的思路反着来就可以了。实用性不高,因为多数情况下我们还是用宿主机映射的比较广泛。
在开始之前先分享一个错误,进入容器后不可以连接yum任何服务和不可以ping任何网络,最后发现原因是之前我们搭建了内网的容器平台,导致问题产生。 修改后并重启docker服务:
vi /etc/docker/daemon.json //加入如下内容
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
systemctl restart docker
[[email protected] /]# systemctl restart nginx
Failed to get D-Bus connection: Operation not permitted
//显然报错了! 操作不允许。
解决方案:
后面再来分析↓
docker commit -m "installed nginx" -a "zhdya" dbef333372c2 centos_nginx
docker run -itd -p 8088:80 centos_nginx bash //-p 可以指定端口映射,本例中将容器的80端口映射为本地的8088端口
也就是说,现在任何主机只要通过 宿主机IP:8088 就可以访问容器的80端口
①先关闭 已经启动的docker容器
②重新指定特定的参数启动
[root@zhdy01 ~]# docker run -itd --privileged -e "container=docker" -p 8088:80 centos_nginx /usr/sbin/init
519c0e50ce837ec2f2d5ab60549b77b0c69e8f635b173f991f3b178d7efc8254
进入容器并启动:
[root@zhdy01 ~]# docker exec -it 519c0e50ce837e bash
[root@519c0e50ce83 /]# systemctl start nginx
[root@519c0e50ce83 /]# ps aux | grep nginx
root 88 0.0 0.2 122812 2076 ? Ss 02:50 0:00 nginx: master process /usr/sbin/nginx
nginx 89 0.0 0.3 123244 3112 ? S 02:50 0:00 nginx: worker process
使用其它机器测试容器的80端口:
[[email protected] ~]# curl 192.168.59.131: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" />
//一个nginx的欢迎页!
-p后面也支持IP:port:ip:port 的格式,比如
-p 127.0.0.1:8080:80
也可以不写本地的端口,只写ip,这样会随意分配一个端口
-p 127.0.0.1::80 //注意这里是两个冒号
这种模式应该不陌生,这种模式就是相当于配置咱们的容器和宿主机在同一局域网模式下,这样我们就可以认为这台docker容器也是一台真正的宿主机!
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# cp ifcfg-ens33 ifcfg-br0
[[email protected] network-scripts]# vim ifcfg-br0
TYPE="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="516645c7-9bd8-490e-a61a-d9e70a87180b"
DEVICE="br0"
ONBOOT="yes"
IPADDR="192.168.59.131"
NETMASK=255.255.255.0
GATEWAY=192.168.59.2
DNS1=61.177.7.1
DNS2=119.29.29.29
//重启网卡
[[email protected] network-scripts]# systemctl restart network
如上只有ens33没有IP,这样才能实验咱们真正的目的,试想一下,这种模式未来是不是咱们只要把镜像配置好,按照如上模式配置IP这样不就轻易实现了,轻轻松松部署各种服务!
git clone https://github.com/jpetazzo/pipework
//不需要任何的编译,直接copy配置文件到bin目录下即可:
cp pipework/pipework /usr/local/bin/
开启一个容器 <设置成没有网络模式:>
[root@zhdy01 ~]# docker run -itd --net=none centos_nginx bash
780d7478ff8687cd66bec908948d0dbe09e39cdfff51284dcfb533cf008015ef
[root@zhdy01 ~]# docker exec -it 780d7478ff8 bash
[root@780d7478ff86 /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
给容器设置一个指定的IP地址:
[[email protected] ~]# pipework br0 780d747 192.168.59.159/[email protected]
[[email protected] ~]# docker exec -it 780d7478ff8 bash
[[email protected] /]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.159 netmask 255.255.255.0 broadcast 192.168.59.255
ether 86:0f:3e:8d:b3:2d txqueuelen 1000 (Ethernet)
RX packets 7 bytes 578 (578.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
如上就理所当然的生成了咱们指定的IP。(网络肯定也是通的,只要在同一局域网其它的server也完全可以ping通)
这个就是咱们使用pipework软件所搭建起来的bridge模式,当然,这种模式才是真正的网桥模式,官方的bridge模式我认为就是虚拟机下面的NAT模式!
现在是不是我们完全就可以使用各种咱们自己所需的服务?当然醉醉醉方便的就是 随时可移植到另外一台服务器!!!