目录
3.2 查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
2. docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)?
引言
本文将介绍docker 容器的网络模式和容器卷的内容
一、虚拟网关
- docker0是安装docker就自动有的一个容器的虚拟网关
- docker0是容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射
- 使用ifconfig可以查看
二、docker 常用的几种网络模式
注:以上几种模式不需要手动配置,真正需要配置的是自定义网络
2.1 Host模式
- host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围。如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 NetworkNamespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如**文件系统、进程列表等还是和宿主机隔离的**。
- 使用host模式的容器可以直接使用宿主机的Ip地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是**dockerhost 上已经使用的端口就不能再用了**,网络的隔离性不好。
- 解决了ip地址不固定的情况
总结:与宿主机共享网络名称空间/网络协议栈。IP共享、端口范围共享
2.2 Container模式
- 创建的容器不会创建自己的网卡,配置自己的IP,而是**和一个指定的容器共享IP、端口范围(端口不能一致),只有一个容器有自己的网卡**,出去还是docker0进行通讯
- 有点像各个服务放在同一个宿主机上面这种情况
- 这个模式指定新创建的容器和**已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
- 两个容器的进程可以通过 lo 网卡设备通信**
总结:多个容器之间共享一个network namespaces ,多个容器共用一个IP和端口范围
2.3 Bridge模式(默认)
- 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主之间的关联
- 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
- 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建**一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中**。可以通过brctl show命令查看
- bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看
总结:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker 0 网桥及 iptables和nat表配置与宿主机通信
2.4 None模式(躺平)
- 该模式关闭了容器的网络功能
- 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
- 这种网络模式下容器**只有lo回环网络,没有其他网卡。**none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性
- 可以安全的储存数据,不会被攻击,可以用来当个仓库
总结:自闭空间,无网卡,无需网络连接
2.5 overlay 网络模式(叠加)
overlay(又叫叠加网络、覆盖网络)简单理解就是把一个逻辑网络建立在一个实体网络之上。
其在大体框架上对基础网络不进行大规模修改就能实现应用在网络上的承载,并能与其它网络业务分离,通过控制协议对边缘的网络设备进行网络构建和扩展是SD-WAN以及数据中心等解决方案使用的核心组网技术。
一个Overlay网络主要由三部分组成:
- 边缘设备:是指与虚拟机直接相连的设备
- 控制平面:主要负责虚拟隧道的建立维护以及主机可达性信息的通告
- 转发平面:承载 Overlay 报文的物理网络
总结:使用外部的服务组件作为网关和映射,例如ingress-nginx
1、docker中有几种网络模式,分别提供哪些功能
bridge :使用docker 0作为网桥容器,桥接容器与宿主机(网络)
Host :与宿主机共享网络名称空间/网络协议栈
Container:多个容器之间共享一个network namespaces
None :自闭空间
Bridge:默认模式通过Veth对 连接容器与dockerO网桥,网桥分配给容器IP,同时docker0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
2、两个容器如何通讯
host网络模式:基于local
container网络模式:基于其中提供的container
bridge网络模式:基于docker 0网桥loopback :回环网卡、TCP/IP网卡是否生效
virtualt bridge: linux自身继承了一个虚拟化功能(kvm架构),是原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安装虚拟网卡
(示例:安装workstation(虚拟化平台)之后,会在网络适配器中会多出VWMnet1 WMnet8 VWMnet0)
docker 0 :容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射
docker 0 :本身也是一种容器
三、自定义网络
3.1 查看网络模式列表
docker network ls
3.2 查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
docker inspect 容器ID
3.3 指定分配容器IP地址
docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个
3.4 自定义网络固定iP
可以先自定义网络,再使用指定IP运行docker
docker network 【--network bridge】 create --subnet=172.112.0.0/16 yxp1
docker run -itd --name test03 --net yxp1 --ip 172.112.0.8 centos:7 /bin/bash
3.5 暴露端口
两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了
-p:自定义端口 ( 宿主机端口:容器内端口 )
-P: 随机端口 (-P 49153起始 49153到65535)
#自定义端口
docker run -itd -p 789:80 nginx:latest /bin/bash
#需要在容器中开启nginx
docker exec -it f282a476b06c /bin/bash -c nginx
#在网页测试
http://192.168.111.20:789/
# 随机端口
docker run -itd -P nginx:latest /bin/bash
#自定义端口
虽然端口已经映射了但是页面访问不了
原因: /bin/bash 也是一个Cmd ,和 cmd 冲突(cmd 是直接启动nginx);如果有多个cmd 会冲出
解决方法:
网页就能访问
使用-P:
docker run -itd -P nginx /bin/bash # -P随机端口 范围:49153-65535
docker exec 4212da198593 nginx #运行nginx
网页测试:
3.6 在宿主机环境执行容器内命令
docker exec -it 容器id /bin/bash -c 'nginx'
docker exec 容器id/容器name 执行的命令
3.7 如何把脚本传入一个已经运行的容器
#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt
#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/start.sh ./
#使用cp命令复制进去容器
#使用cp命令从容器复制出来
3.8 进入容器没有systemctl命令怎么解决
解决方案:
- 添加
--privileged=true
(指定此容器是否为特权容器),使用此参数,则不能用attach
案例:
docker run -itd --name test02 --privileged=true centos:7 /sbin/init
# /sbin/init 内核启动时主动呼叫的第一个进程
#可以使用docker inspect 容器ID
docker exec -it centos-systemd /bin/bash #进去容器
yum install httpd
systemctl status httpd
3.9 小结
1. Docker网络模式有哪些?分别提供哪些功能?
我这边了解到的有四种,Host container none bridge overlay
- Host :与宿主机共享网络名称空间/网络协议栈
- Container:多个容器之间共享一个network namespaces
- None :自闭空间
- bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时**docker 0**作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
- overlay:叠加网络模式,使用外部的服务组件作为网关或代理
2. docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)?
首先,我们可以修改/data/docker/containers/containers_id中两个文件
①hostconfig.json 中的 portbinding:{}修改端口或添加端口
②修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
最后,重启守护进程。
四、docker的数据管理
管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。
数据管理操作
- 方便查看容器内产生的数据
- 多容器间实现数据共享
数据之间的共享(目的)
- 宿主机与容器之间的数据共享
- 容器与容器之间的数据共享
4.1 数据卷
4.1.1 原理
将容器内部的配置文件目录,挂载到宿主机指定目录下
数据卷默认会一直存在,即使容器被删除
- 宿主机和容器是两个不同的名称空间,如果想进行连接需要用ssh,exec和attch也类似于ssh这种方式登录
- 在企业中ssh这种登陆方式会比较危险,安全漏洞很大,尽量减少ssh这种,杜绝了频繁使用exec
- 因此使用数据卷的方式把容器内部的文件目录挂载到宿主机指定目录下进行修改,当容器里的文件频繁需要修改时不需要登陆进去,直接使用数据卷方式在宿主机指定的目录下进行修改即可。方便又安全
4.1.2 作用
修改配置文件:
- 例如,nginx. conf /usr/local/nginx/ conf/nginx.conf —> /container_ nginx/ conf/nginx. conf
容器内部产生的日志,如何收集:
- 将容器内部存方日志文件的目录挂载到宿主机指定目录下/container_ nginx/ log/access_ 1og/access_ log
传入变量挂载到宿主机在宿主机
- 上添加变量内容,将变量放入共享目录,在容器中/etc/profile 直接加载就可以export xxdir=/data/data1/xx.
4.1.3 特性
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响到镜像
- 数据卷默认 会一直存在,即使容器被删除
4.1.4 实操
需求:宿主机目录/var/www挂载到容器中的/data1
#注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
#-v选项可以在容器内创建数据卷,是volume的缩写
docker run -it --name test01 -v /var/www:/data1 centos:7 bash
ls
#返回宿主机进行查看
cd /var/www/
ls
#在容器中创建文件
echo "this is test01 file" > /data1/test.txt
#在宿主机查看是否有内容
cat /var/www/test.txt
1.#把宿主机挂载到容器内部
2、#另外开一个终端在宿主机进行查看
3. #在容器中创建文件
4、#在宿主机查看是否有内容
5. 在宿主机上添加内容查看
4.2 数据卷容器
4.2.1 原理
让两个容器实现数据共享
4.2.2 作用
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
4.2.3 实操
需求:创建数据卷容器
#创建一个容器作为数据卷容器
docker run -it --name test1 -v /data1 -v /data2 centos:7 bash #创建并进入容器
echo "this is test02 file" > /data1/test.txt #容器内创建测试文件1
echo "THIS IS TEST2 FILE" > /data2/TEST.txt #容器内创建测试文件2
#使用--volumes-from来挂载test2容器中的数据卷到新的容器
docker run -it --name test2 --volumes-from test1 centos:7 bash #创建并进入容器
cat data1/test.txt #查看测试数据是否同步
cat data2/TEST.txt
1、创建一个容器作为数据卷容器并创建文件
2、#使用–volumes-from来挂载test2容器中的数据卷到新的容器
4.3 容器互联 (使用centos镜像)
docker run -itd -P --name web1 centos:7 /bin/bash //创建并运行容器取名web1,端口号随机映射
docker exec -it 容器ID /bin/bash
#另起一个终端
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash //创建并运行容器取名web2,链接到web1和其通信
#--link:打通隧道
docker exec -it 容器ID /bin/bash
#两个容器都下载
yum -y install net-tools //各自下载ifconfig的工具
验证:
进web2容器 ping web1
两个容器都下载
验证:
4.4 小结
如何实现docker持久化
在生成容器的同时,加上-v选项,指定把当前服务器的目录映射到容器中