一、网络
看docker info可以看到可用的网络
[root@localhost ~]
当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后介绍一些自定义网络模式。 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
网络模式 | 简介 |
---|
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 | Bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 | None | 该模式关闭了容器的网络功能。 | Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。 | 自定义网络 | 略 |
[root@localhost ~]
启动一个容器后
[root@localhost ~]
5cfdc7971cbe6b6fa3c2aca728b384490e2e17db200beec119b1e60b29814672
[root@localhost ~]
[root@localhost ~]
1、bridge模式
Docker 容器默认使用 bridge 模式的网络。其特点如下: 使用一个 linux bridge,默认为 docker0 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内 Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。 容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信 可以自己创建的docker 网桥的IP可以自己设定,顺序不固定 iptables 的 SNTA 规则,使得从容器离开去外界的网络包的源 IP 地址被转换为 Docker 主机的IP地址: 相同两个容器如果端口相同,则通过iptables端口映射暴露不同端口
2、host模式
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。 host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是dockerhost 上已经使用的端口就不能再用了,网络的隔离性不好。
其特点包括:
这种模式下的容器没有隔离的 network namespace 容器的 IP 地址同 Docker host 的 IP 地址 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突 host 模式能够和其它模式共存
3、container 模式(overlay)
定义:
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。 container创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、端口范围 这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。(★★两个容器的进程可以通过lo0网卡设备通信)
4、none 模式
定义:
网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络。 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。 1、可以做仓库使用 2、可以用作挂载
5、操作
指定分配容器IP地址
[root@localhost ~]
5406c0c18478d880c662fa0dca8a26b7395663ba281f86710c6550096b344dee
docker: Error response from daemon: user specified IP address is supported on user defined networks only
创建成功,但是启动不成功,因为分配方式不合法。
自定义网络固定IP
默认创建的是bridge模式 如果要指定模式在creste后加上–network 模式
[root@localhost ~]
64627412d0d14353d0b7d43f5b9ac4e7184a40c7261a481bc25a09143fa0ca27
[root@localhost ~]
52bb5b238f3f68fe6bafa76b8698f6d358faaff88c9e5fd4c9ae5d4039cd7c5f
[root@localhost ~]
暴露端口
-p 自定义端口(宿主机端口:容器内端口) -P随机端口( -P 491.53起始49153到65535) docker run -itd -p 333:80 nginx /bin/bash ( docker 0) docker run -itd -P nginx /bin /bash
[root@localhost ~]
4461bcc1b335328e6ed92858b6627186961bba5ef85ae32c7ef22f86f31f3cc0
[root@localhost ~]
curl: (7) Failed connect to 192.168.133.50:333; Connection refused 访问拒绝因为没有开启
[root@localhost ~]
2022/01/12 11:39:19 [notice] 7
2022/01/12 11:39:19 [notice] 7
2022/01/12 11:39:19 [notice] 7
2022/01/12 11:39:19 [notice] 7
2022/01/12 11:39:19 [notice] 7
2022/01/12 11:39:19 [notice] 14
或者
[root@localhost ~]
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
[root@localhost ~]
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@localhost ~]
6cc966f838d498e516c422545d7ce6b25c01c2dc97f02c9e4bf850f1d27f65de
启始端口为49153,分配随之增长,如果其中一个被删除,则端口号暂被封存不在使用
[root@localhost ipv4]
5e34a3f25e8a589a6fde1fa368e309664194c87d4d451ddf33307fe1a6279be7
[root@localhost ~]
nginx03
[root@localhost ~]
e5662ed3eccf9682f4b407f6f739bcece613d636b59651841a1e9f7f08959085
#在宿主机环境执行容器内命令 docker exec -it 容器ID /bin/bash -c ‘nginx’ docker exec 容器工D/容器name 执行的命令
[root@localhost ~]
扩展题
#面试题 怎么把宿主机的文件传入到容器内部1、linux怎么复制 cp原文件路径目标文件路径 docker cp / opt/abc 容器id:/opt /abc
[root@localhost ~]
74ded2da3d925c5c7f06511b65edab054fc34a8230eb4f7063832ead0a137c6e
进入容器
[root@localhost ~]
[root@b92ada4177d3 ~]
[root@b92ada4177d3 zhou]
[root@b92ada4177d3 zhou]
1.txt
[root@localhost opt]
[root@localhost opt]
[root@localhost opt]
1.txt
[root@localhost opt]
this is a test
[root@localhost opt]
[root@b92ada4177d3 zhou]
this is a test
[root@b92ada4177d3 zhou]
#进入容器没有systemctl命令解决:添加–privileged=true(指定此容器是否为特权容器), 使用此参数,则不能用attach示例:
docker run -itd --name test3 --privileged=true centos /sbin/init
/ sbin/init内核启动时主动呼叫的第一个进程
[root@localhost ~]
013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce
[root@localhost ~]
[root@013fa7579c73 /]
因为没有做映射端口,所以不能被外界看到 docker中,假设,我运行了一个业务容器,需要暴露3个端口,启动之后,发现自己少加了一个端口,那么,如何动态添加端口(如何对已运行的容器,添加/修改端口)我们可以修改 /var/lib/docker/container/[container id]/中的两个文件 1、 hostconfig.json portbinding:{}修改端口或添加端口 2、修改config.v2.json文件,修改对应的Ports{}来添加/修改端口 最后,重教守护进程
添加端口
[root@localhost ~]
[root@localhost containers]
013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce b92ada4177d35e1ebda0285361ee296550a332e5987d97be51c99d8c1eb1646a
[root@localhost containers]
[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]
[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]
[root@localhost 013fa7579c737a34dbd9c67d7a8a77cf835537cf1c5d0e4c20d796487057b8ce]
|