docker-外部访问容器

外部网络访问容器内部,主要是通过端口映射的方式:

docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。容器启动时通过-p参数映射端口

动态映射

容器的指定端口映射到 主机随机端口

1
2
3
4
5
6
7
# docker run -d -p 80 httpd
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
319ccb170025 httpd "httpd-foreground" 9 seconds ago Up 8 seconds 0.0.0.0:32768->80/tcp gallant_gates
# docker port 319ccb170025
80/tcp -> 0.0.0.0:32768

可以看到容器的80端口映射到host的32768端口,外网通过32768端口就能访问到容器的80端口

静态映射

容器指定端口映射到指定的主机端口, host端口:容器端口

1
2
3
4
5
6
7
8
9
10
# docker run -d -p 8080:80 httpd
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfc4ab8ca8a1 httpd "httpd-foreground" 3 seconds ago Up 1 second 0.0.0.0:8080->80/tcp focused_ardinghelli
# docker port bfc4ab8ca8a1
80/tcp -> 0.0.0.0:8080
# curl localhost:8080
<html><body><h1>It works!</h1></body></html>

我们可以看到,容器的80端口映射到host的8080端口上, 访问8080能够输出容器80端口返回的信息

每一个映射的端口,host 都会启动一个 docker-proxy 进程来处理访问容器的流量:

1
2
3
# ps -ef|grep docker-proxy
root 2414 1064 0 10:37 ? 00:00:00 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.3 -container-port 80
root 2556 1999 0 10:42 pts/3 00:00:00 grep --color=auto docker-proxy