Docker容器互联

85 阅读2分钟

前言

在许多情况下,在一台主机上部署了多个 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 image.png

通过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 image.png