外部访问容器
随机映射
-P: Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
# http1.jsvar http = require('http');http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n');}).listen(3000);// 终端打印如下信息console.log('Server running at http://127.0.0.1:3000/');# DockerfileFROM nodeENV APP_HOME /usr/src/appCOPY http1.js ${APP_HOME}/index.jsEXPOSE 3000WORKDIR ${APP_HOME}CMD ["node","index"]# 打包docker build -t node_http:v5 .# 运行docker run -d -P node_http:v5 # 查看docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7f0dbe8702f0 node_http:v5 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:32768->3000/tcp naughty_panini
指定映射
# 映射所有地址 hostPort:containerPortdocker run -d -p 5000:5000 training/webapp python app.py# 映射到指定地址的指定端口 ip:hostPort:containerPortdocker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py# 映射到指定地址的任意端口 ip::containerPortdocker run -d -p 127.0.0.1::5000 training/webapp python app.py# 使用 udp 标记来指定 udp 端口docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
- 注意
- 容器有自己的内部网络和 ip 地址(使用
docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。) - -p 标记可以多次使用来绑定多个端口:
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
容器互联
自定义docker网络
# 新建一个自定义网络,-d 参数可选 bridge overlay(用于swarm mode)docker network create -d bridge my-net# 启动容器1 加入网络docker run -dit --name ubuntu1 --network my-net ubuntu:18.04# 启动容器2加入网络docker run -dit --name ubuntu2 --network my-net ubuntu:18.04# 查看docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES275a6b755dd7 ubuntu:18.04 "/bin/bash" 7 seconds ago Up 6 seconds ubuntu2e38afaf0e4ee ubuntu:18.04 "/bin/bash" 15 seconds ago Up 13 seconds ubuntu1# 进入容器2docker attach 275a6b755dd7# 需先安排pingapt-get update && apt-get install inetutils-ping# PING 容器1, 可正常通信PING ubuntu1 (172.18.0.2): 56 data bytes64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.238 ms64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.244 ms64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.245 ms64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.245 ms64 bytes from 172.18.0.2: icmp_seq=4 ttl=64 time=0.187 ms