docker-高级(待补图)
文章目录
- 数据卷(Volume)
- 介绍
- 查看方法
- 删除方法
- 绑定方法
- 匿名绑定
- 具名绑定
- Bind Mount
- 数据卷管理
- 网络
- bridge(桥接模式 默认)
- HOST(主机模式)
- None
- container(指定一个容器进行关联网络共享)
- 自定义(推荐)
- docker network 命令
- 创建网络
- docker network create
- 实例展示-自定义
- 实例展示-桥接(默认)
- 不同网络模式下的容器连接问题
数据卷(Volume)
介绍
- 连接容器与主机的存储的介质
- 强制删除容器并不会删除相应的数据卷,只会删除容器本身
查看方法
docker volume ls
删除方法
docker volume rm [VOLUME NAME]
绑定方法
匿名绑定
使用docker inspect 命令查找 Mounts关键词,Source:主机内目录,Destination:容器内目录
在使用 --rm 退出即删除容器时,匿名数据卷也会被删除,但使用docker rm 删除容器,匿名卷不会被自动删除
-v [CONTAINER SOURCE]
例如:
docker run --rm -d -p 80:80--name nginx_volume -v usr/share/nginx/html nginx
具名绑定
卸载docker后Volume也会被删除。
在使用 --rm 退出即删除容器时,具名绑定数据卷不会被删除)。
无法自由地使用指定的目录绑定容器的数据卷,只能使用数据卷自动生成的目录。
-v [VOLUME NAME]:[CONTAINER SOURCE]
例如:
docker run --rm -d -p 80:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx
Bind Mount
卸载docker后Volume依然存在。
绑定并加载主机的某个文件目录到容器中(覆盖容器中的文件目录)。
-v [HOST SOURCE]:[CONTAINER SOURCE]
例如:
docker run --rm -d -p 80:80 --name nginx_volume -v www/nginx/html:/usr/share/nginx/html nginx
数据卷管理
docker volume
参数:
create [VOLUME NAME]:创建数据卷
inspect [VOLUME NAME]:查看一个或多个数据卷的细节(创建时间、driver(驱动)、Labels(标签)、Mountpoint(主机内的加载路径)、Nanme(数据卷名字)、Options(选项)、Scope(作用域))
ls:列出数据卷
prune:删除本地未被使用的数据卷
rm [VOLUME NAME1] [VOLUME NAME2]...:删除一个或多个数据卷
网络
介绍:是Dockr对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。
目的:容器间的网络隔离、实现部分容器之间的网络共享、管理多个子网下容器的ip
作用:提供了多种模式,可以定制化的为每个容器制定不同的网络;自定义网络模式,划分不同的子网以及网关、dns等配置;网络互通,实现不同子网之间的网络互通、基于容器名(主机名)的方式在网络内访问
bridge(桥接模式 默认)
在主机中创建一个docker0的虚拟网桥(交换机),在docker0创建一对虚拟网卡,一半在主机上为vethxxx,还有一半在容器内eth0。
内部容器中网络可直接互通,但外部其他主机进行访问时,必须要先访问主机中的物理网卡–>虚拟网桥–>vethxxx–>eth0
[图片]
HOST(主机模式)
容器不再拥有自己的网络空间,而是直接与主机共享网络空间,基于该模式创健的容器的ip与主机是在同一个子网同一个网段中。
缺点:安全性较低,复用性较低。
[图片]
None
Docker将拥有有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、识、路由等相关信息。
只能在宿主机中使用 docker exec 等命令访问容器。
特点:完全隔离,与外部任何机器都无网络访问,只有自己的lo网卡 127.0.0.1。
[图片]
container(指定一个容器进行关联网络共享)
不会创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip或端口等。
[图片]
自定义(推荐)
不适用Dockr自带的网络模式,而是自己去定制化自己特有的网络模式。ckr自带的网络模式,而是自己去定制化自己特有的网络模式。
docker network 命令
docker network [Commands]
参数:
connect:将容器连接到网络
create:创建网络
disconnect:将容器与网络断开连接
inspect:显示一个或多个网络的详细信息
ls:列出网络
prune:删除所有未使用的网络
rm:删除一个或多个网络
创建网络
docker network create
docker network create [OPTIONS] NETWORK
参数:
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--subnet strings Subnet in CIDR format that represents a network segment
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
实例展示-自定义
目的:展现主机无法与容器实现网络互通,但是容器之间可以进行网络互通的效果。
准备:使用centos镜像进行测试。由于centos是一个系统不是一个软件,一般作为基础镜像去使用,所以运行为一个容器时,centos会自动退出。
#1. 下载centos镜像
docker pull centos
#2. 在docker中创建一个桥接网络,并指定网络配置(宿主机ip为192.168.1.x,为了展现主机无法与容器实现网络互通,所以这里指定了192.168.3.x)
docker network create --driver bridge --subnet 192.168.3.0/24 --gateway 192.168.3.1 test_network
docker network ls
#3.1 方法一:通过ping本地ip保证centos不会退出。
docker run -d --rm -P --name centos_network1 --net test_network centos ping 127.0.0.1
#3.2 方法二:使用 itd 参数。-i,以交互模式运行容器,并保持终端激活。-t,--tty:为容器分配一个伪终端。-d, --detach 后台运行,守护线程,并返回容器ID。
docker run -i -t -d --rm -P --name centos_network2 --net test_network centos
docker ps -a or docker ps
#4.测试容器之间网络的连通性
docker exec -it centos_network1 ping centos_network2
#查看两个基于test_network网络创建出来的centos容器的网络信息
docker exec centos_network1 ip a
docker exec centos_network2 ip a
实例展示-桥接(默认)
目的:使用自带的bridge网络模式
原理:在hosts内配置主机名及IP地址
#创建两个容器,并使docker_network2连通docker_network1
docker run -i -t -d --rm -P --name docker_network1 centos
docker run -i -t -d --rm -P --name docker_network2 --link docker_network1 centos
#测试docker_network2连接到docker_network1 成功
[root@localhost ~]# docker exec -it docker_network2 ping docker_network1
PING docker_network1 (172.17.0.2) 56(84) bytes of data.
64 bytes from docker_network1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.077 ms
#测试docker_network1连接到docker_network2 失败
[root@localhost ~]# docker exec -it docker_network1 ping docker_network2
ping: docker_network2: Name or service not known
不同网络模式下的容器连接问题
[图片]
测试环境:
docker0:Docker的虚拟网桥 172.17.0.1 <---->容器1 eth0–> 网络模拟:默认 172.17.0.2
test_network:自定义网络 192.168.3.1 <---->容器2 eth0–> 网络模拟:test_network 192.168.3.2
原理:给其中一个容器创建一个虚拟网卡,并连接到另一个容器中的网段中。
[图片]
#创建容器1 docker_net1
docker run -i -t -d --rm -P --name docker_net1 centos
#创建容器2 centos_net2
docker run -i -t -d --rm -P --name centos_net2 --net test_network centos
#未作连接前两个不同网络模式下的容器无法连接
[root@localhost ~]# docker exec -it docker_net1 ping centos_net2
ping: centos_net2: Name or service not known
#连接两个不同网络模式下的容器
docker network connect test_network docker_net1
# 测试连接 成功
[root@localhost ~]# docker exec -it docker_net1 ping centos_net2
PING centos_net2 (192.168.3.2) 56(84) bytes of data.
64 bytes from centos_net2.test_network (192.168.3.2): icmp_seq=1 ttl=64 time=0.091 ms