前言
在许多情况下,在一台主机上部署了多个 Web 应用容器服务,且它们都通过 Nginx 反向代理,而 Nginx (也是容器服务) 如何与这些 Web 服务方便地通信也是一个问题。Docker 的容器互联可以让容器之间通过容器名访问,此次记录了如何建立 Nginx 与 Java Web 应用容器服务之间的互联通信。
容器网络示意图
准备镜像
已有镜像:nginx:1.21.5-alpine,demo-api:1.0;
其中 nginx:1.21.5-alpine 将运行一个 nginx 容器,demo-api:1.0 将运行一个Java Web 应用的容器。
### docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-api 1.0 9b026124b24a 2 days ago 95.3MB
nginx 1.21.5-alpine e08a7adafd85 2 weeks ago 22.1MB
运行容器
运行或者启动Java Web应用容器
### 运行Java Web应用容器
docker run -d -p 1002:2020 --name demo-api demo-api:1.0
### 启动Java Web应用容器
docker start demo-api
运行nginx容器,同时连接demo-api容器
运行nginx容器并连接demo-api容器时,需要已启动demo-api容器
--link,指定连接的容器,其中:可用作为别名
docker run -d -p 80:80 --name nginx --link demo-api:linkedemoapi nginx:1.21.5-alpine
查看连接信息
查看容器
### docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10e9507fb207 nginx:1.21.5-alpine "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp nginx
46ee25ff518a demo-api:1.0 "/bin/sh -c 'java -j…" 2 days ago Up About an hour 0.0.0.0:1002->2020/tcp demo-api
查看nginx容器的连接信息
### 进入容器
docker exec -it nginx /bin/sh
### 查看hosts
cat /etc/hosts
hosts:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 linkedemoapi 46ee25ff518a demo-api
172.17.0.3 10e9507fb207
信息:172.17.0.2 linkedemoapi 46ee25ff518a demo-api
- 172.17.0.2,demo-api容器的ip地址
- linddemoapi,连接demo-api容器时指定的别名
- 46ee25ff518a,demo-api容器的容器id
- demo-api,demo-api容器的主机名
信息:172.17.0.3 10e9507fb207
- 172.17.0.3,nginx容器的ip地址
- 10e9507fb207,nginx容器的容器id
访问Java Web应用
直接访问Java Web应用
浏览器输入:http://localhost:1002/api/test
通过nginx反向代理访问Java Web应用
编写nginx配置文件 假定当访问localhost:80/api/{xxx}时,代理到demo-api容器主机的2020端口上
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api {
proxy_pass http://demo-api:2020;
break;
}
}
热重启nginx(命令:nginx -s reload),
浏览器输入:http://localhost/api/test