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,容器本身和外部是不能通信的,那我们怎么让容器与外界通信呢?如下来介绍怎么访问外部

  1. 首先使用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模式!

希望看过的童鞋多多指教,谢谢!

时间: 2024-10-15 00:38:57

docker 基本操作Ⅲ的相关文章

docker 基本操作Ⅱ(关于镜像操作)

1 通过模板创建镜像 - 导入镜像基本操作 https://openvz.org/Download/template/precreated 在这个网址里面下载对应的模板 [[email protected] src]# wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz //下载centos7的模板 [[email protected] src]# cat centos-7-x86_

Docker基本操作 安装redis 与 redis 主从配置

今天李经理让我了解一下docker 以前从来没有接触过docker 百度了一下.貌似是挺出名的,挺方便的一个东西. 刚开始对docker没有什么概念.连这个是什么东西都不知道.网上说的是容器.对于什么都不懂的人来说.这个讲的还是有些宽泛了.不能形成一个理解. 于是到网易云课堂学习了一下docker.但是网易云课堂上面课程不多,只有一个免费的,上面讲的比较宽泛.但是呢 对于docker是什么东西终于有了一些了解. 一.什么是docker 有什么用     1.1:对于docker 看了这么多.他的

Docker基本操作

1.拉取镜像 docker pull centos 2.查看当前已有容器 docker ps 正在运行的 docker ps -a 显示所有的 3.容器与主机间拷贝文件 docker cp source container:/location

虚拟化之容器docker基本操作

docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制. Docker 支持三种不同的镜像层次存储的 drivers: aufs.devicemapper.btrfs ; Aufs: AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚 拟 文 件 系 统 下 (unite several directories into a single virtual fi

[目录] Docker 基本操作

1 容器基本操作 : https://www.cnblogs.com/defineconst/p/9990611.html 2 容器启动退出 : https://www.cnblogs.com/defineconst/p/10035529.html 3 基本命令 :https://www.cnblogs.com/defineconst/p/7707486.html https://www.cnblogs.com/defineconst/p/6622467.html  https://www.cn

【Docker基本操作】

关于镜像的操作 docker search centos 搜索所有centos的镜像 docker pull centos 获取centos镜像 docker images 或 docker image ls 查看镜像 docker images -qa 列出所有镜像的ID docker rmi -f 镜像名/镜像ID 删除指定镜像 -f 强制删除 在删除镜像之前请先用docker rm删除依赖于这个镜像的所有容器 docker save 镜像名/镜像ID > image.tar.gz 导出指定

docker 基本操作

# 常用命令 docker run 镜像 docker images 查看所有镜像 docke ps  查看运行中的容器 docker ps -a 列出所有容器 docker stop $(docker ps -a -q) 停止所有容器 docker rm $(docker ps -a -q) 删除所有容器 docker exec -it 3d1a00bbf39e /bin/bash    连接容器 # docker 镜像删除 1.停止所有的container,这样才能够删除其中的images:

【Docker基本操作】-- 1565075639.4398699

原创链接: http://106.13.73.98/__/103/ 关于镜像的操作 docker search centos 搜索所有centos的镜像 docker pull centos 获取centos镜像 docker images 或 docker image ls 查看镜像 docker images -qa 列出所有镜像的ID docker rmi -f 镜像名/镜像ID 删除指定镜像 -f 强制删除 在删除镜像之前请先用docker rm删除依赖于这个镜像的所有容器 docker

[学习记录]Docker基本操作指令

本文参考了<docker容器与容器云><第一本docker书> 部分指令解释的不会很详细,以后随着用的多了再慢慢完善. 1.docker info docker info需要docker守护进程启动后才能正常执行,因此也能用来判断docker守护进程是否已启动. 2.docker run [options] image [command] [arg...] 基于image镜像创建一个容器,并通过指定的选项进行控制 常见选项: docker run -i -t --name myco