## 外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 `-P` 或 `-p` 参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 `49000~49900` 的端口到内部容器开放的网络端口。
使用 `docker ps` 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
```
$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
```
同样的,可以通过 `docker logs` 命令来查看应用的信息。
```
$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
```
-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`。
### 映射所有接口地址
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
```
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
```
此时默认会绑定本地所有接口上的所有地址。
### 映射到指定地址的指定端口
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
```
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
```
### 映射到指定地址的任意端口
使用 `ip::containerPort` 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
```
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
```
还可以使用 udp 标记来指定 udp 端口
```
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
```
### 查看映射端口配置
使用 `docker port` 来查看当前映射的端口配置,也可以查看到绑定的地址
```
$ docker port nostalgic_morse 5000
127.0.0.1:49155.
```
注意:
* 容器有自己的内部网络和 ip 地址(使用 `docker inspect` 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
* -p 标记可以多次使用来绑定多个端口
例如
```
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
```
- 前言
- Docker 简介
- 什么是 Docker
- 为什么要用 Docker
- 基本概念
- 镜像
- 容器
- 仓库
- 安装
- Ubuntu
- CentOS
- 镜像
- 获取镜像
- 列出
- 创建
- 存出和载入
- 移除
- 实现原理
- 容器
- 启动
- 守护态运行
- 终止
- 进入容器
- 导出和导入
- 删除
- 仓库
- Docker Hub
- 私有仓库
- 配置文件
- 数据管理
- 数据卷
- 数据卷容器
- 备份、恢复、迁移数据卷
- 使用网络
- 外部访问容器
- 容器互联
- 高级网络配置
- 快速配置指南
- 配置 DNS
- 容器访问控制
- 端口映射实现
- 配置 docker0 网桥
- 自定义网桥
- 工具和示例
- 编辑网络配置文件
- 实例:创建一个点到点连接
- 实战案例
- 使用 Supervisor 来管理进程
- 创建 tomcat/weblogic 集群
- 多台物理主机之间的容器互联
- 标准化开发测试和生产环境
- 安全
- 内核名字空间
- 控制组
- 服务端防护
- 内核能力机制
- 其它安全特性
- 总结
- Dockerfile
- 基本结构
- 指令
- 创建镜像
- 底层实现
- 基本架构
- 名字空间
- 控制组
- 联合文件系统
- 容器格式
- 网络
- Docker Compose 项目
- 简介
- 安装
- 使用
- 命令说明
- YAML 模板文件
- Docker Machine 项目
- 简介
- 安装
- 使用
- Docker Swarm 项目
- 简介
- 安装
- 使用
- 调度器
- 过滤器
- Etcd 项目
- 简介
- 安装
- 使用 etcdctl
- Fig 项目
- 简介
- 安装
- 命令参考
- fig.yml参考
- 环境变量参考
- 实战 Django
- 实战 Rails
- 实战 wordpress
- CoreOS 项目
- 简介
- 工具
- 快速搭建CoreOS集群
- Kubernetes 项目
- 简介
- 快速上手
- 基本概念
- kubectl 使用
- 架构设计
- Mesos 项目
- 简介
- 安装与使用
- 原理与架构
- 配置项解析
- 常见框架
- 附录一:命令查询
- 附录二:常见仓库介绍
- Ubuntu
- CentOS
- MySQL
- MongoDB
- Redis
- Nginx
- WordPress
- Node.js
- 附录三:有用的资源