需求:比如我在 docker 里面起了一个 nginx 服务,同时在 docker 里面起了一个前端服务,如果我想在 docker 外访问这个前端页面,以下就是实现的方法

  • 在使用 Dockerfile 构建镜像之前,先新建一个 html 页面(index.html)和一个 nginx 配置文件(localhost.conf)

index.html 文件里的内容如下:

<!DOCTYPE html>
<html>
<head>
  <title>欢迎访问 Docker</title>
  <meta name="viewport" content="width=device-width">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <style type="text/css">
    html, body {
      width: 100%;
      height: 100%;
    }

    .title {
      text-align: center;
    }
  </style>
</head>
<body>
  <h3 class="title">恭喜你成功通过 IP 访问到 Docker 里的内容</h3>
</body>
</html>

localhost.conf 文件里的内容如下:

server {
  # nginx 里面监听 9000 端口,需要注意的是,由于 docker 是起在本地的,因此这个端口号要避免和已有的端口号冲突
  listen 9000;
  # server_name 为 localhost
  server_name localhost;

  location / {
    # 访问目录为 /web,这个目录也可以换成别的
    root /web;
    # 访问主页为 index.html,文件也可以自定义
    index index.html index.htm;
  }
}
  • 配置 Dockerfile

Dockerfile 内容如下:

# docker 运行环境(ubuntu:14.04)
FROM ubuntu:14.04

# 安装所需依赖(nginx,vim,curl)
RUN apt-get clean && apt-get update && \
    apt-get install -y \
    nginx \
    vim \
    curl

# 将本地的 index.html 文件移动到 docker 里,放在 / 目录下
ADD ./index.html /

# 将本地的 localhost.conf 文件移动到 docker 里,放在 / 目录下
ADD ./localhost.conf /

# 在 docker 里新建 /web 文件夹,把 index.html 文件移动到文件夹内
# 将 localhost.conf 文件移动到 etc/nginx/conf.d/ 文件夹内
RUN mkdir /web && mv index.html /web/ && mv localhost.conf /etc/nginx/conf.d/

tips:在 docker bash 输入命令 whereis nginx 可以查看 docker 里nginx 配置路径

  • 构建镜像

运行如下命令构建镜像

# -t 设置镜像的名字和标签
docker build -t jiayizhen/via_ip:0.1 .

上述命令会根据 ./ 目录下的 Dockerfile 构建 docker 镜像

构建成功后可以使用命令 docker images 查看,如下图所示:

docker images

  • 启动 docker 镜像

运行如下命令启动 docker(同时进入 docker bash),把 docker 里定义的端口号映射出来,这样在 docker 就可以访问了

# -i 以交互模式运行容器,通常与 -t 同时使用
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
# -p 端口映射,格式为:主机(宿主)端口:容器端口
docker run -i -t -p 9001:9000 jiayizhen/via_ip:0.1

通过上述命令,可以看到,将 docker 里的 9000 端口映射为 9001 端口(通过 -p 参数实现的)

运行成功后,可以通过 docker ps 命令查看映射情况,如下图所示:

docker ps

可以看到,我们可以通过访问 localhost:9001 进而访问到 docker 里面 9000 端口监听的东西

  • 启动 docker 里的 nginx

上述步骤完成后,还是无法实现最终的要求,原因是 docker 里面的 nginx 还没起

在 docker bash 里输入命令 nginx(校验:nginx -t,重启:nginx -s reload,停止:nginx -s stop)启动服务

在 docker bash 里输入命令 curl localhost:9000 可以看到 index.html 文件里的内容

在 docker 外使用命令 curl localhost:9001 可以看到 docker 里的前端服务内容(也可以在浏览器里直接访问 localhost:9001)