docker0:172.17.0.1 nginx:172.17.0.2
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort 多个容器都想使用80端口
-p ip::containerPort(随机端口)
-p hostPort:containerPort:udp
-p 10.0.0.100::53:udp 使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 81:80 -p 443:443 可以指定多个-p
随机映射 docker run -P (随机端口)
通过iptables来实现的端口映射

1:单个容器使用80端口

启动一台nginx

[root@docker-01 ~]# docker run -itd nginx:latest
11f36d32c7f3595fb4908f123ffe4e3970d0ebc6fbe0359ab863692edc4541d4
[root@docker-01 ~]# docker exec -it bold_merkle /bin/bash
root@11f36d32c7f3:/# hostname -i
172.17.0.2
root@11f36d32c7f3:/# exit
[root@docker-01 ~]# curl -I 172.17.0.2
HTTP/1.1 200 OK
Server: nginx/1.17.9
Date: Sun, 22 Mar 2020 08:14:17 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 03 Mar 2020 14:32:47 GMT
Connection: keep-alive
ETag: "5e5e6a8f-264"
Accept-Ranges: bytes

当访问宿主机的80端口会默认转到容器的80端口

[root@docker-01 ~]# docker run -itd -p 80:80 nginx:latest 
df264e2895f7ce9672a4468bc62a4c1a9f0cbb1f4de1b515c919b74289740c5c
[root@docker-01 ~]# iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.3:80

2:多个容器使用80端口

docker run -d -p等于启动了两个nginx

[root@docker-01 ~]# docker rm -f `docker ps -a -q`    #批量删除容易
[root@docker-01 ~]# ifconfig eth0:1 10.0.0.100/24 up
[root@docker-01 ~]# docker run -d -p 10.0.0.11:80:80 nginx:latest 
[root@docker-01 ~]# docker run -d -p 10.0.0.100:80:80 nginx:latest 

[root@docker-01 ~]# netstat -ntl    #监听了两个80端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 10.0.0.100:80           0.0.0.0:*               LISTEN     
tcp        0      0 10.0.0.11:80            0.0.0.0:*               LISTEN

不加ip地址会随机分配地址进行监测

docker run -itd -p 8888:80 nginx:latest

3:随机分配端口

[root@docker-01 ~]# docker run -itd -p 10.0.0.11::80 nginx:latest
[root@docker-01 ~]# docker run -itd -p 10.0.0.11::80 nginx:latest
[root@docker-01 ~]# netstat -ntl|grep 10.0.0.11
tcp        0      0 10.0.0.11:32768         0.0.0.0:*               LISTEN
tcp        0      0 10.0.0.11:32769         0.0.0.0:*               LISTEN

两个端口都可以访问

为什么随机端口是32768开始的?

[root@docker-01 ~]# sysctl -a|grep ipv4|grep rang
net.ipv4.ip_local_port_range = 32768    60999

4:随机映射

[root@docker-01 ~]# docker run -itd -P nginx:latest
[root@docker-01 ~]# docker run -itd -P nginx:latest
[root@docker-01 ~]# netstat -ntl
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp6       0      0 :::32770                :::*                    LISTEN
tcp6       0      0 :::32771                :::*                    LISTEN
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐