docker网络之bridge实战

docker中bridge网络是默认的网络类型,本文主要介绍一下容器之间的相互通信方法。


docker

使用单容器部署并相互组建网络的话,需要先创建一个网络,然后再把需要相互通信的容器加入此网络即可实现相互通信,由于bridge网络模式有DNS解析,所以可以直接填写主机名进行通信。

比如nginx-proxy-manager-zh和portainer俩个容器需要相互组网,前者反向代理后者进行访问,则:

1.在安装之前,先查看docker网络列表,防止冲突。

docker network ls
  • 如果只显示bridge、host、none三种网络类型则表示环境干净,可以继续操作。

2.创建一个名字叫 internal 的docker网络。

docker network create internal

3.创建nginx-proxy-manager-zh容器服务

docker run -d \
  --name nginx-proxy-manager-zh \
  --restart always \
  --network internal \
  -p 80:80 \
  -p 81:81 \
  -p 443:443 \
  -v /home/docker/nginx-proxy-manager-zh/data:/data \
  -v /home/docker/nginx-proxy-manager-zh/letsencrypt:/etc/letsencrypt \
  chishin/nginx-proxy-manager-zh

4.容器nginx-proxy-manager-zh的访问参数

http://IP:81
Email:admin@example.com
Password:changeme

5.如果可以成功打开此网页则代表部署成功。

6.创建portainer

docker run -d \
  --name portainer \
  --restart always \
  --network internal \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/docker/portainer/data:/data \
  6053537/portainer-ce

7.默认portainer的访问地址为IP:9000,但是本次部署是NGINX反向代理过去,所以需要进入nginx-proxy-manager-zh这个管理页面添加主机名和9000端口,然后使用设置的IP或者域名访问即可。

8.如果可以正常访问即部署完成。

docker-compose

上面创建了一个名字叫 internal 的 bridge 网络,如果后续想通过compose编排的方式加入上面的网络,则需要在compose文件中添加入此网络即可。

下面拿owncloud的docker-compose文件举例;

version: "3.7"

services:
  owncloud:
    image: owncloud/server:10.11.0
    container_name: owncloud_server
    restart: always
    networks:
      - internal
    environment:
      - "OWNCLOUD_DOMAIN=c.kingsbestone.top"
      - "OWNCLOUD_TRUSTED_DOMAINS=c.kingsbestone.top"
      - "OWNCLOUD_DB_TYPE=mysql"
      - "OWNCLOUD_DB_NAME=owncloud"
      - "OWNCLOUD_DB_USERNAME=owncloud"
      - "OWNCLOUD_DB_PASSWORD=owncloud@000"
      - "OWNCLOUD_DB_HOST=mariadb"
      - "OWNCLOUD_ADMIN_USERNAME=admin"
      - "OWNCLOUD_ADMIN_PASSWORD=admin@000"
      - "OWNCLOUD_MYSQL_UTF8MB4=true"
      - "OWNCLOUD_REDIS_ENABLED=true"
      - "OWNCLOUD_REDIS_HOST=redis"
    healthcheck:
      test: ["CMD", "/usr/bin/healthcheck"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - "/home/docker/owncloud/data:/mnt/data"

  mariadb:
    image: mariadb:10.6
    container_name: owncloud_mariadb
    restart: always
    networks:
      - internal
    environment:
      - "MYSQL_ROOT_PASSWORD=Admin@000"
      - "MYSQL_USER=owncloud"
      - "MYSQL_PASSWORD=owncloud@000"
      - "MYSQL_DATABASE=owncloud"
    command: ["--max-allowed-packet=128M", "--innodb-log-file-size=64M"]
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-u", "root", "--password=Admin@000"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - "/home/docker/owncloud/mariadb/mysql:/var/lib/mysql"

  redis:
    image: redis:6
    container_name: owncloud_redis
    restart: always
    networks:
      - internal
    command: ["--databases", "1"]
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - "/home/docker/owncloud/redis/data:/data"

networks:
  internal:
    external: true

这样部署完成后即可自动加入上面创建好的docker网络 internal 中了,只需要在 nginx-proxy-manager-zh 的控制台中添加 owncloud 的主机名和端口即可正常访问,默认owncloud的端口为8080。

owncloud的文件中如果要加入现有网络环境则需要修改每一个容器的networks的键值和一级networks键值为你实际的值:

networks:
  internal:
    external: true

如果你要新创建一个独立的网络环境则,需要修改每一个容器的networks键值和一级networks键值,可根据实际情况修改,例如:

networks:
  my_network:
    driver: bridge

这样就创建好了一个新的my_network的桥接网络了,driver后可以跟的参数有:bridge、host、none、Overlay、Macvlan、IPvlan等。


end…