docker_practice/network/port_mapping.md
Kang Huaishuai ee26243625
use nginx:alpine as demo
Signed-off-by: Kang Huaishuai <khs1994@khs1994.com>
2020-08-25 16:54:59 +08:00

80 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 外部访问容器
容器中可以运行一些网络应用要让外部也可以访问这些应用可以通过 `-P` `-p` 参数来指定端口映射
当使用 `-P` 标记时Docker 会随机映射一个端口到内部容器开放的网络端口
使用 `docker container ls` 可以看到本地主机的 32768 被映射到了容器的 80 端口此时访问本机的 32768 端口即可访问容器内 NGINX 默认页面
```bash
$ docker run -d -P nginx:alpine
$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fae320d08268 nginx:alpine "/docker-entrypoint.…" 24 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp bold_mcnulty
```
同样的可以通过 `docker logs` 命令来查看访问记录
```bash
$ docker logs fa
172.17.0.1 - - [25/Aug/2020:08:34:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0" "-"
```
`-p` 则可以指定要映射的端口并且在一个指定端口上只可以绑定一个容器支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`
## 映射所有接口地址
使用 `hostPort:containerPort` 格式本地的 80 端口映射到容器的 80 端口可以执行
```bash
$ docker run -d -p 80:80 nginx:alpine
```
此时默认会绑定本地所有接口上的所有地址
## 映射到指定地址的指定端口
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一个特定地址比如 localhost 地址 127.0.0.1
```bash
$ docker run -d -p 127.0.0.1:80:80 nginx:alpine
```
## 映射到指定地址的任意端口
使用 `ip::containerPort` 绑定 localhost 的任意端口到容器的 80 端口本地主机会自动分配一个端口
```bash
$ docker run -d -p 127.0.0.1::80 nginx:alpine
```
还可以使用 `udp` 标记来指定 `udp` 端口
```bash
$ docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
```
## 查看映射端口配置
使用 `docker port` 来查看当前映射的端口配置也可以查看到绑定的地址
```bash
$ docker port fa 80
0.0.0.0:32768
```
注意
* 容器有自己的内部网络和 ip 地址使用 `docker inspect` 查看Docker 还可以有一个可变的网络配置
* `-p` 标记可以多次使用来绑定多个端口
例如
```bash
$ docker run -d \
-p 80:80 \
-p 443:443 \
nginx:alpine
```