docker&&数据卷volumes&&网络

数据卷volumes基本使用

挂载主机本地目录到容器

在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。

#启动容器,将物理主机的/data目录挂载到docker容器的/opt目录下
docker run -itd -v /data:/opt ubuntu:14.04

可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器
上面的命令加载主机的 /data目录到容器的/opt目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。

#启动容器,将物理主机的/data目录挂载到docker容器的/opt目录下
docker run -itd -v /data:/opt:ro ubuntu:14.04

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

挂载主机本地文件到容器

#实现记录在容器输入过的命令
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

如果直接挂载一个文件,很多文件编辑工具,包括 vi 或者 sed --in-place,可能会造成文件 inode 的改变,从 Docker 1.1 .0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

数据卷容器的使用

数据卷容器可以实现在容器之间共享数据同时持续更新数据。
是专门用来提供数据卷供其它容器挂载的

实现

创建数据卷容器

此处数据卷容器名称为volume1,其中容器内存在共享目录/v1:

root@ubuntu-virtual-machine:/opt# docker run  -dit  -v  /v1  --name  volume1  ubuntu:14.04
e6f7f0fd7f9b00ed5c19747cef01dfa0a377d33b548d73d9708b50152171870a
root@ubuntu-virtual-machine:/opt# 
root@ubuntu-virtual-machine:/opt# 
root@ubuntu-virtual-machine:/opt# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e6f7f0fd7f9b        ubuntu:14.04        "/bin/bash"         6 seconds ago       Up 4 seconds                            volume1

创建第二容器使用–volumes-from 来挂载 数据卷容器volume1中的数据卷

第二容器名称为volume1_1,其容器内存在共享目录/v1:

docker run  -dit  --volumes-from volume1  --name volume1_1 ubuntu:14.04
docker run  -dit  --volumes-from volume1_1  --name volume1_1_1 ubuntu:14.04

可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。
也可以从其他已经挂载了数据卷的容器来挂载数据卷。
通过共享目录/v1实现数据、文件共享

使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。
如果删除了挂载的容器(包括 volume1_1_1 、volume1_1 和 volume1 ),数据卷并不会被自动删除。
如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。

数据卷的备份、恢复、迁移

备份

sudo docker run --volumes-from volume1  -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/backup.tar /v1

分两步:

  1. 创建容器并挂载数据卷容器volume1的共享目录/v1 ,同时将本地目录挂载到容器内的/backup目录下
  2. 挂载完成后,执行打包命令对共享目录/v1进行打包并保存到/backup目录下,压缩包为backup.tar。

恢复

恢复步骤与上面相反

sudo  docker run  -dit  -v  /v1  --name  volume1  ubuntu:14.04
sudo  docker run --volumes-from volume1 -v $(pwd):/backup ubuntu:14.04 tar xvf  /backup/backup.tar

网络

外部访问容器

外部访问容器端口

root@ubuntu-virtual-machine:/opt/dfq# docker run -dit -p 10080:80 ubuntu:14.04
ee04e47aeae3c43a3f018135fd68d67d4603613b751d3466645e3566371b451f
root@ubuntu-virtual-machine:/opt/dfq# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
ee04e47aeae3        ubuntu:14.04        "/bin/bash"         4 seconds ago       Up 3 seconds        0.0.0.0:10080->80/tcp   affectionate_chebyshev
root@ubuntu-virtual-machine:/opt/dfq# netstat -anlp| grep :10080
tcp6       0      0 :::10080                :::*                    LISTEN      17096/docker-proxy

此时默认会绑定本地所有接口上的所有地址。
可以使用 udp 标记来指定 udp 端口."-p 10080:80/udp"
-p 标记可以多次使用来绑定多个端口

支持的格式有:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort

查看映射端口配置:

root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
ee04e47aeae3        ubuntu:14.04        "/bin/bash"         15 minutes ago      Up 15 minutes       0.0.0.0:10080->80/tcp   affectionate_chebyshev
root@ubuntu-virtual-machine:/home/ubuntu# docker port ee04e47aeae3  80
0.0.0.0:10080

端口范围映射

容器访问容器

使用 --link 参数可以让容器之间安全的进行交互:

root@ubuntu-virtual-machine:/home/ubuntu# docker run -dit --name mysql ubuntu:14.04
a49913c31e294e2b2ba231e1a4eadd60650b81c281fcb018ecf1e87c1e7c1ddf
root@ubuntu-virtual-machine:/home/ubuntu# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a49913c31e29        ubuntu:14.04        "/bin/bash"         25 seconds ago      Up 24 seconds                           mysql
root@ubuntu-virtual-machine:/home/ubuntu# docker run -dit  --name web  --link  mysql:mysql ubuntu:14.04

此时容器web与容器mysql之间可以互相无障碍访问。

容器间的网络互联体现在哪方面?

在这里插入图片描述
在这里插入图片描述

使用自定义网桥

创建自定义网桥

root@ubuntu-virtual-machine:/home/ubuntu# sudo service docker stop
root@ubuntu-virtual-machine:/home/ubuntu# apt-get install bridge-utils
root@ubuntu-virtual-machine:/home/ubuntu# brctl addbr  dfq_bridge
root@ubuntu-virtual-machine:/home/ubuntu# ip addr  add  10.2.0.1/24  dev  dfq_bridge
root@ubuntu-virtual-machine:/home/ubuntu# ip link set dev dfq_bridge  up
root@ubuntu-virtual-machine:/home/ubuntu# echo 'DOCKER_OPTS="-b=dfq_bridge"' >> /etc/default/docker
root@ubuntu-virtual-machine:/home/ubuntu# sudo service docker start

启动 Docker 服务。 新建一个容器,可以看到它已经桥接到了 bridge0 上

如何实现不同容器连接不同的桥接网络呢?

百度吧~~

–net的使用

Docker 创建一个容器的时候,会执行如下操作:

  • 创建一对虚拟接口,分别放到本地主机和新容器中;
  • 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
  • 容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的名字空间可见;
  • 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9。
  • 完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。

docker run 通过 --net 参数来指定容器的网络配置,有4个可选值:
–net=bridge
这个是默认值,连接到默认的网桥。
–net=host
告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。
–net=container:NAME_or_ID
让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信。
–net=none
让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。

使用 --net=none 后,如何自行配置网络?

用户使用 --net=none 后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节。

#首先,启动一个 /bin/bash 容器,指定 --net=none 参数。
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/#

#在本地主机查找容器的进程 id,并为它创建网络命名空间。
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778
$ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

#检查桥接网卡的 IP 和子网掩码信息。
$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0

#创建一对 “veth pair” 接口 A 和 B,绑定 A 到网桥 docker0,并启用它
$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up

#将B放到容器的网络命名空间,命名为 eth0,启动它并配置一个可用 IP(桥接网段)和默认网关。
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
$ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1

以上,就是 Docker 配置网络的具体过程。

当容器结束后,Docker 会清空容器,容器内的 eth0 会随网络命名空间一起被清除,A 接口也被自动从docker0 卸载。

此外,用户可以使用 ip netns exec 命令来在指定网络名字空间中进行配置,从而配置容器内的网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值