四、数据卷管理和容器互联实验

数据卷管理和容器互联

  • 创建数据卷

新建一个以ubuntu14.04为镜像,名叫web1的交互式容器,并且设置数据卷/html1。

docker create --name web1 -it  -v /html1 ubuntu:14.04

启动容器web1:

docker start -i web1

向数据卷html1中新建一个文件123,内容也是123。使用ctrl+p+q暂时退出docker容器,但是保持容器一直运行。

root@DB:~# docker start -i web1

root@cf1ee0def6e0:/# cd /html1/

root@cf1ee0def6e0:/html1# ls

扫描二维码关注公众号,回复: 6582421 查看本文章

root@cf1ee0def6e0:/html1# echo "123" > 123

root@cf1ee0def6e0:/html1# ls

123

在宿主机上,使用docker inspect来查看一下对应上面的那个数据卷的目录路径:

docker inspect web1|grep /var/lib/docker/volumes

并在宿主机上查看本地数据卷中文件的内容

cat /var/lib/docker/volumes/c4ba4ea4bb6eec7de7999eeb039ac57a2c66a7f31576a0235fa6289493288835/_data/123

向文件123中,添加新的内容test。

echo "test" >> /var/lib/docker/volumes/c4ba4ea4bb6eec7de7999eeb039ac57a2c66a7f31576a0235fa6289493288835/_data/123

再次进入刚刚创建的容器web1,并且进入/html1目录查看文件123的值是否发生变化?

利用docker CLI中专有命令来创建数据卷,数据卷名称为html3并且查看数据卷的详细信息

docker volume create --name html3

docker inspect html3

  • 挂载数据卷
  1. 挂载宿主机文件到容器上。

在宿主机上创建一个目录/html,并在目录中创建一个新文件web.list,内容为192.168.1.1

以ubuntu:14.04为模板,创建一个容器web4,挂载宿主机文件/html4/web.list到容器/html4/web.list中,并且挂载共享的数据设置为只读。

进入容器之后,用echo命令往/html4/web.list中写数据,是否可以写入,为什么?

用ctrl+p+q退出容器,但是不关闭容器,发现在宿主机中可以修改数据卷的内容。

  1. 挂载宿主机目录到容器上

在宿主机上创建一个目录/var/spp,并在目录中新建两个文件test1和test2,内容为test1和test2。以ubuntu:14.04为模板,创建一个容器web5,挂载宿主机文件/var/spp到容器/var/spp中。

  1. 挂载多个目录到容器上

在宿主机中新建两个目录/var/spp1和/var/spp2,在/var/spp1中新建文件test1,内容为123456,在/var/spp2中新建文件test2,内容为abcdef。以ubuntu:14.04为模板,新建一个容器web6,并且挂载两个目录/var/spp1和/var/spp2,并且把/var/spp2目录设置为只读。在容器内,查看/var/spp1/test1内容,并且向/var/spp2/test2中添加数据date2,请问是否能够添加成功,为什么?

  • 删除数据卷
  1. 直接删除数据卷

我们可以通过docker提供的数据卷管理命令,查看宿主机中所有的数据卷,并且删除它。

Docker volume list //列出宿主机中的所有数据卷

Docker volume rm volumeID  //直接删除,但是这样会误删

  1. 随着容器删除数据卷

Volume 只有在下列情况下才能被删除:

1)docker rm -v删除容器时添加了-v选项,只有无人使用该数据卷时候,才会被真正删除!

2)docker run --rm运行容器时添加了--rm选项

可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:

 

(四)设置数据卷的VOLUME指令

VOLUME指令可以向镜像创建的容器中添加数据卷,数据卷可以在容器之间共享和重用。数据卷的修改是立即生效的。volume格式:

VOLUME [“/data”,”/data2”]

VOLUME /data

举例:

FROM ubuntu:14.04

RUN mkdir /app && echo "hello" >/app/test.txt

VOLUME  /home

CMD  ["cat","/app/test.txt"]

 

 

然后构建:docker build -t test .

执行:docker run --rm test(容器退出时就能够自动清理容器内部的文件系统。)

输出hello

在本地创建一个文件:

mkdir local

echo “here is a test”>~/local/test.txt

再次运行容器,使用-v参数指定/app目录,然后查看cat结果,发现目标文件并不是容器上的test.txt文件,而是宿主机上的test.txt文件

docker run --rm -v ~/local:/app test

(五)挂载一个数据卷容器

启动一个名为container1容器,此容器包含两个数据卷/var/volume1和/var/volume2(这两个数据卷目录是在容器里的,容器创建的时候会自动生成这两目录)查看/var/volume1是空的

root@DB:~# docker run -it --name container1 -v /var/volume1 -v /var/volume2 ubuntu:14.04 /bin/bash

root@111971e8fa65:/# ls /var/volume1

root@111971e8fa65:/#

用docker inspect 命令查看宿主机上与数据卷对应的目录路径:

 

由上面命令结果可以查到,两个数据卷/var/volume1和/var/volume2下的数据在/var/lib/docker/volumes/下对于的两个目录的_data下面

创建App1_container容器,挂载container1容器中的数据卷

可以再创建一个容器,挂载App1_container中从container1挂载的数据卷。当然也可以直接挂载初始的container1容器数据卷

即便是删除了初始的数据卷容器App1_container,或是删除了其它容器,但只要是有容器在使用该数据卷,那么它里面的数据就不会丢失。

(六)数据卷迁移

  1. 备份
  1. 我们先创建一个data容器.

docker run -it -v /data --name data ubuntu:14.04

  1. 上面创建的data数据卷容器挂载了data目录.

为了验证数据卷容器的备份功能,在挂载的/data目录下创建一个data文件,并写入内容"this is data"。

echo “this is data” >> /data/data

  1. 再利用数据卷容器备份,使用 –volumes-from 标记来创建一个加载data容器卷的容器,并从主机挂载当前目录到容器的/backup目录。

docker run -it --volumes-from data -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/data.tar /data

容器启动后,在当前目录下生成的backup.tar文件就是data容器卷的备份文件。

这样,数据卷容器中的数据就备份完成。

root@DB:~# docker run -it -v /data --name data ubuntu:14.04

root@bb5fc3074ac7:/# echo "this is data" >> /data/data

root@bb5fc3074ac7:/# cat /data/data

this is data

root@bb5fc3074ac7:/# root@DB:~#

root@DB:~# docker run -it --volumes-from data -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/data.tar /data

tar: Removing leading `/' from member names

/data/

/data/data

 

  1. 恢复

备份最终也是为了可以恢复,否则备份就没有意义了,Docker恢复备份也很简单,只需要2步即可。

首先,创建一个带有空数据卷的容器data1。

docker run -it -v /data --name data1 ubuntu:14.04 /bin/bash

然后,创建另一个容器,挂载data1容器卷中的数据卷,并使用untar解压备份文件到挂载的容器卷中。

docker run --volumes-from data1 -v $(pwd):/backup Ubuntu:14.04 tar xvf /backup/data.tar

这个时候,之前备份的数据卷容器的数据已经恢复到了容器data1中了。

为了查看和验证恢复的数据,我们可以再启动一个容器挂载data1容器卷来查看。

整个实践过程如下:

(七)安装网桥管理工具,并且查看网桥设备

  1. 安装网桥管理工具

apt-get intall -y bridge-utils

  1. 查看网桥设备

 brctl show

  1. 开启一个容器

docker run -it --name test1 ubuntu:14.04 /bin/bash

进入docker,如果用ifconfig命令查看docker网络情况,如果找不到命令command not found,因为docker轻量级运行,没有此命令,需要安装,解决办法:

1)      Apt-get update更新索引

2)      Apt-get install net-tools 安装ifconfig命令

3)      Apt-get install iputils-ping 安装ping命令

④ 用ctrl+p+q退出但是保持容器的继续运行,并且查看网桥设备

brctl show

(八)查看在默认情况下,在同一宿主机中运行的所有容器都是互联的。

环境准备:用于测试docker镜像的dockerfile

FROM ubuntu:14.04

RUN apt-get install -y ping

RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

EXPOSE 80

CMD /bin/bash

构建镜像 docker build -t catherine2005/cct .

测试:

  •  启动一个容器cct1

docker run -it --name cct1 catherine2005/cct

  •  查看ip地址,

Ifconfig

③ 启动nginx

nginx

④ ctrl+p+q转到后台

⑤ 启动一个容器cct2

docker run -it --name cct2 catherine2005/cct

⑥ 查看ip地址

Ifconfig

⑦ 此时使用ping命令,查看是否能够ping通cct1

⑧ 使用curl http://172.17.0.8,看看ngnix服务有没有正常启动

⑨ 停止容器cct1,并且启动一个新的容器test1

⑩ 重启容器cct1,并查看容器内的ip地址,发现变化了

docker restart cct2

docker attach cct2

Ifconfig

地址发生改变,IP不是固定的

(九)创建第三个容器时,将第三个容器link到第一个容器中,这样第三个容器访问第一个容器时利用名字就能访问。

  1. 启动一个新容器cct3,并且使用link选项关联cct1,别名为webtest

docker run -it --name cct3 --link=cct1:webtest catherine2005/cct

  1. 使用ifconfig命令查看自己的ip
  2. 使用ping命令来看看容器cct1的别名webtest是否可以ping通

  1. 查看一下环境变量,可以看到大量以WEBTEST*开头的环境变量,这些环境变量是在容器启动时,由docker添加的。

env 

  1. 查看自己的环境映射

cat /etc/hosts

  1. Ctrl+p+q可以转后台
  2. 重启docker服务

service docker restart

  1. 重启容器cct1,cct2,cct3

docker restart cct1 cct2 cct3

  1. 重新进入容器cct3

docker attach cct3

  1. 使用ping命令来看看容器cct1的别名webtest是否可以ping通

  1. 再次查看一下自己的环境变量

Env

 

  1. 查看自己的环境映射

cat /etc/hosts

 

(十)拒绝容器之间的互联

编辑docker默认配置文件

sudo vim  /etc/default/docker

在其中加上 :DOCKER_OPTS="--icc=false"

  1. 在/etc/systemd/system/multi-user.target.wants/docker.service 这个文件中加入和修改一下内容,在[Service]下添EnvironmentFile=-/etc/default/docker,在ExecStart=/usr/bin/docker daemon -H fd://后面加入$DOCKER_OPTS  

注意: fd://和$DOCKER_OPTS  不是连着的,需要有空格

  1. 再次加载daemon

 systemctl daemon-reload

  1. 重启docker服务

 systemctl restart docker

  1. 检查配置已修改

ps -ef | grep docker

  1. 启动两个容器

docker start cct1 cct2

  1. # 在cct1容器中ping容器cct2的IP(不可ping通)

sudo ping 172.17.0.3

(十一)允许端口映射访问

  1. # 使用filter表查看网络访问规则

sudo iptables -t filter -L –n

  1. 启动一个容器,并且指定容器开放的端口

docker run -it -p 80 --name cct5 catherine2005/cct

  1. 在容器内部启动nginx
  2. Ctrl+p+q转到后台
  3. 查看容器映射主机的端口Docker port cct5

  1. 在本机上,curl http://127.0.0.1:32768(刚刚映射出来的端口号)

  1. 使用iptables查看规则变化

 iptables -L –n

允许外部ip访问这个内部机器

  1. 使用ifconfig查看本机的ip 192.168.186.146

  1. 换台虚拟机,使用下列命令查看cct5是否可以查看

curl 192.168.186.146:32768

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41043145/article/details/93398927