目录

一、四种网络模式

1.1 Host模式

1.2 Container模式

1.3 Bridge模式(默认)

1.4 None模式(躺平)

二、自定义网络

2.1 查看网络模式列表

2.2 查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)

2.3 指定分配容器IP地址

2.4 自定义网络固定IP

三、暴露端口 

3.1 自定义端口

3.2 需要在容器中开启nginx

3.3 在网页测试 

四、总结 

4.1 进入容器没有systemctl命令怎么解决

4.2  Docker网络模式有哪些?分别提供哪些功能?

4.3 如何把脚本传入一个已经运行的容器

4.4  docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)?


一、四种网络模式

1.1 Host模式

  • host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围。如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 NetworkNamespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如**文件系统、进程列表等还是和宿主机隔离的**。
  • 使用host模式的容器可以直接使用宿主机的Ip地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是**dockerhost 上已经使用的端口就不能再用了,网络的隔离性不好。
  • 解决了ip地址不固定的情况

1.2 Container模式

  • 创建的容器不会创建自己的网卡,配置自己的IP,而是**和一个指定的容器共享IP、端口范围(端口不能一致),只有一个容器有自己的网卡,出去还是docker0进行通讯
  • 有点像各个服务放在同一个宿主机上面这种情况
  • 这个模式指定新创建的容器和**已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信

1.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查看

1.4 None模式(躺平)

  • 该模式关闭了容器的网络功能
  • 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等
  • 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,l封闭的网络能很好的保证容器的安全性,可以安全的储存数据,不会被攻击,可以用来当个仓库

二、自定义网络

2.1 查看网络模式列表

docker network ls

2.2 查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)

docker inspect  容器ID

2.3 指定分配容器IP地址

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
#以上会报错,因为用户使用的ip地址不被规则所允许,docker0定义的就是按照顺序来,所有需要创建一个

2.4 自定义网络固定IP

可以先自定义网络,再使用指定IP运行docker

docker network 【--network bridge】 create --subnet=172.18.0.0/16 fl
docker run -itd --name test --net fl --ip 172.18.0.8 centos:7 /bin/bash

三、暴露端口 

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要在docker0上做一个端口映射,通过ens33暴露出去端口不同就可以了

-p 自定义端口 ( 宿主机端口:容器内端口 )

-P 随机端口 (-P 49153起始 49153到65535)

#自定义端口
docker run -itd -p 8081:80 nginx:latest /bin/bash
#需要在容器中开启nginx
docker exec -it e97b071be499 /bin/bash -c nginx
#在网页测试
http://192.168.152.16:8081/


# 随机端口
docker run -itd -P nginx:latest /bin/bash

3.1 自定义端口

3.2 需要在容器中开启nginx

3.3 在网页测试 

四、总结 

4.1 进入容器没有systemctl命令怎么解决

docker run -itd  --name cenos_v1 --privileged=true centos:7 /sbin/init
docker exec -it cenos_v1 /bin/bash

4.2  Docker网络模式有哪些?分别提供哪些功能?

  • Host :与宿主机共享网络名称空间/网络协议栈
  • Container:多个容器之间共享一个network namespaces
  • None :自闭空间
  • bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯

4.3 如何把脚本传入一个已经运行的容器

#使用cp命令复制进去容器
docker cp start.sh cenos_v1:/opt
#使用cp命令从容器复制出来
docker cp cenos_v1:/opt/start.sh ./

4.4  docker中,假设运行一个业务容器,但是业务容器需要暴露三个端口,启动后发现自己少加了一个端口。如何动态添加端口(如何对已经运行的容器添加或者修改端口)?

  1. 首先,我们可以修改/var/lib/docker/containers/containers_id中两个文件
  2. hostconfig.json 中的 portbinding:{}修改端口或添加端口
  3. 修改config.v2.json文件,修改对应的Ports{}来添加/修改端口
  4. 最后,重启守护进程。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐