network基础
docker network是我们在使用docker容器时最早关心的问题,我们部署了一个docker的应用,外部如何访问是需要解决的第一个问题.
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
555fce32080c bridge bridge local
aba9d2ba3e2a host host local
330ab4af02e8 none null local
docker容器提供了三种网络连接方式,bridge, host,以及none,默认情况下docker中的网卡设置是bridge方式,可以通过docker inspect (Container Name)命令查看,默认情况下,执行命令后,可以发现在控制台上输出的JSON结构中有这样的节点:
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "555fce32080cae35886bdf246945156f298e7f0698a7ae221e384840d21795f7",
"EndpointID": "9fb4b9c25bea30064161d90c796d31e64902eb169cb58fc3d3156f095e661548",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
也可以执行docker network inspect bridge/host察看bridge或者host的网络状态。
在执行docker run命令或者docker create的时候,可以增加参数来修改docker中的网络地址,hosts文件以及resolv.conf文件的配置。
- “–hostname HOSTNAME” 选项为容器指定主机名,例如:
docker run --name b1 -it --rm -h leveldc.com busybox:latest
- “–dns DNS_SERVER_IP” 选项为容器指定所使用的dns服务器地址,例如:
docker run --name b1 -it --rm -h leveldc.com --dns 223.5.5.5 busybox:latest
- “–add-host HOSTNAME:IP” 选项为容器指定本地主机名解析项,例如:
docker run --name b1 -it --rm -h leveldc.com --dns 223.5.5.5 --add-host "leveldc.com:172.17.00.101" busybox:latest
如何对外提供network服务
下来是这次试验的重点,如何把一个docker服务提供给外部网络访问?
bridge方式
-p port 动态端口影射
docker run --name b02 -it --network bridge -p 80 --rm levi/busybox_httpd:v0.2
这个参数会随即分配一个宿主机的端口,影射到docker服务的ip地址上。
执行 docker port b02 就可以显示出来影射到的随机端口:
docker port b02
80/tcp -> 0.0.0.0:32768
我的宿主机ip 地址为192.168.137.100,通过主机访问服务如下:
-p 宿主机ip:宿主机端口:docker服务端口 动态端口影射**
如果宿主机端口不指定,则随机影射,例如:
docker run --name b02 --rm -p 192.168.137.100:80:80 levi/busybox_httpd:v0.2
另外还有一个"-P"命令,开放所有端口,这个需要配合dockerfile来进行配置,后面再整理这部分内容。
host 方式
host方式可以直接把容器的端口影射到主机上来,并且使用相同的端口号,使用起来更简单.
docker run --name nginx --network host --rm nginx:1.14-alpine
如果不能访问,注意,host方式和bridge方式有一点区别,
host方式一定要关闭防火墙,或者允许端口访问
1.关闭防火墙
systemctl stop firewalld.service
2.运行以下命令添加80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
最后重启防火墙服务即可:
systemctl restart firewalld.service