通过 ip 在 docker 容器外访问 docker 内的 web 服务
需求:比如我在 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 镜像
运行如下命令启动 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
命令查看映射情况,如下图所示:
可以看到,我们可以通过访问 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)