开发环境

mac zsh docker-compose

~ docker-compose --version
docker-compose version 1.22.0, build f46880f

目录结构

图片

docker-compose.yml

version: "3"
services:
  web: # 服务的名称
    image: nginx
    volumes: # 文件夹映射
      - /Users/cai/Documents/www:/usr/share/nginx/html:ro # 宿主:docker:只读  ,www目录
      - ./config/web.conf:/etc/nginx/nginx.conf:ro # nginx配置文件
    ports: # 端口转发 宿主:docker
      - "8080:80"
      - "8081:81"
    # environment:
    # - NGINX_HOST=foobar.com
    # - NGINX_PORT=80
    # command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    networks: ## 定义网络
      nn: ## 加入的网络的名称
        ipv4_address: 192.168.5.101 ## ipv4的ip地址

  web8082:
    image: nginx
    volumes:
      - /Users/cai/Documents/www/8082:/usr/share/nginx/html:ro
    ports:
      - "8082:80"

    networks:
      nn:
        ipv4_address: 192.168.5.102

  web8083:
    image: nginx
    volumes:
      - /Users/cai/Documents/www/8083:/usr/share/nginx/html:ro
    ports:
      - "8083:80"

    networks:
      nn:
        ipv4_address: 192.168.5.103

networks: ##定义网络组
  nn: ## 网络组名称
    driver: bridge ## 网络的模式
    ipam: ## 配置网络
      driver: default
      config:
        - subnet: 192.168.5.0/24 ## ip地址网络 这里宿主机一般会是该网段的 192.168.5.1,所以不要设置自网段为1

配置服务 配置网络

将服务加入同一个网络组,这样 docker 就可以在同一个网络组里了,由于 docker 的特性,每个容器会认为自己和另一个容器是局域网的关系

我这里做的是 nginx 转发

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;


    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            # proxy_pass http://web8081;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location = /300.html {
            proxy_redirect off;
            proxy_pass http://192.168.5.102/index.html; ## 备注1
        }

        location = /600.html {
            proxy_redirect off;
            proxy_pass http://192.168.5.103/index.html; ## 备注2
        }
    }

    server{
        listen 81;
        server_name localhost;

        location / {
            root   /usr/share/nginx/html/sub;
            index  index.html index.htm;
        }
    }
}


备注 1,备注 2 将 300.html 600.html 转发到 103 的 ip 地址 由于 docker 中 nginx 端口默认配置的是 80,所以 http 的端口转发没有端口号 8082 端口 对于 8080 端口默认服务器来讲 ip 地址是 102

启动

docker up

加 -d 的话就是后台运行, 直接运行可以看见日志

图片

这里测试了一下 可以看到 服务器那边有日志 图片

我们发的请求 8082 的服务器给出了反馈


后记

这里简单记录了下 docker 配合 nginx 达到两个隔离容器间的通信问题

同样的 这里如果用 mysql+服务器 app 程序 也可以达成通信的原理,无非就是换个 ip 地址和通过命令启动服务端程序的问题