docker-compose网络设置之networks

networks使用方式之官网教程

  官网的docker-compose.yml参考文档:Compose file version 3 reference
  较为准确的中文翻译版:Compose file version 3 reference
  
  networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题。这种应用在swarm部署中,非常常见。不过,本文并不做讨论。
  一般对于集群服务,常常通过docker-compose.yml文档快速编排、部署应用服务。官网中给出了如下的使用场景和方式:

1. 未显式声明网络环境的docker-compose.yml

  例如,在目录app下创建docker-compose.yml,内容如下:

version: '3'
services:
  web:
    mage: nginx:latest
    container_name: web
    depends_on:
      - db
    ports:
      - "9090:80"
    links:
      - db
  db:
    image: mysql
    container_name: db

  使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect <container id>可以查看对应网络的配置。

$ docker net work ls
NETWORK ID          NAME                     DRIVER              SCOPE
6f5d9bc0b0a0        app_default              bridge              local
0fb4027b4f6d        bridge                   bridge              local
567f333b9de8        docker-compose_default   bridge              local
bb346324162a        host                     host                local
a4de711f6915        mysql_app                bridge              local
f6c79184ed27        mysql_default            bridge              local
6358d9d60e8a        none                     null                local
2. networks关键字指定自定义网络

  例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1并不能直接使用,你应该替换为host, bridge, overlay等选项中的一种。

version: '3'

services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

networks:
  front:
    # Use a custom driver
    driver: custom-driver-1
  back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

  值得注意的是,这里定义了backfront两个网络,似乎它们的名字就定义成了backfont,但是你使用docker network ls命令并不能找到它们。假如你是在myApp目录下运行的docker-compose up命令,那么这两个网络应该分别对应myApp_backmyApp_front

3. 配置默认网络
version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1
4. 使用已存在的网络
networks:
  default:
    external:
      name: my-pre-existing-network

遇到的问题

  学习了上面的东西,笔者准备将自己的项目付诸实践。我的项目包含了两个docker-compose.yml,且使用了links选项,所以必须使用networks配置。
  其中,一个docker-compose.yml用于启动mysql服务,位于mysql/目录下:

 version: "3"
services:
  dbmaster:
    image: master/mysql:latest
    container_name: dbmaster
    ports:
      - "3308:3306"
    volumes:
      - $HOME/Work/data/dbmaster:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: master
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    networks:
      - app

  dbslave:
    image: slave/mysql:latest
    container_name: dbslave
    ports:
      - "3309:3306"
    depends_on:
      - dbmaster
    volumes:
      - $HOME/Work/data/dbslave:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: slave
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    links:
      - dbmaster
    networks:
      - app
networks:
   default:
    external:
      name: app

  另一个docker-compose.yml用于启动服务程序,位于cloudgo/目录下:

version: "3"
services:
  web:
    image: nginx:latest
    container_name: web
    depends_on:
      - cloudgo
    ports:
      - "9090:80"
    volumes:
      - $HOME/Work/docker/docker-compose/nginx/conf.d:/etc/nginx/conf.d
    links:
      - cloudgot
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    networks:
      - app

  cloudgo:
    image: cloudgo:latest
    container_name: cloudgo
    ports:
      - "8080:8080"
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20" 
    external_links:
      - dbmaster
      - dbslave
    networks:
      - app
networks:
  app:
    external: true

  我决定使用预先创建的网络,然后把他们加入这个已经创建好的网络,从而实现通信。为此,我运行了如下命令:

$ docker network create app

  之后,开始运行编写好的docker-compose.yml文件。首先运行启动mysql的配置文件,结果如下:

l$ docker-compose up
ERROR: Service "dbmaster" uses an undefined network "app"

  明明已经创建好了,却还是报了错,说该网络未定义。尝试改变名称mysql_app,但是依旧报出同样的错误。最终证明,这种方法无法实现,至今没有找到官方文档给出的例子。
  所以,最终决定将第一个docker-compose.yml文件中的networks配置改为如下内容:

networks:
   mysql_app:
     driver: bridge

  在这个文件中定义一个网络,以便在后面使用。这里修改完毕,该文件其他地方凡是引用到了该网络的地方均要作出相同的修改。同样,第二个文件也一样。

其他的一些用法

  一般的使用格式如下:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

  在下面的例子中,我的web容器可以直接通过database:3306或者db:3306访问db容器了。它们同时属于一个网络,并且db设置了主机别名,所以这样的访问方式是完全可以的。

version: '2'

services:
  web:
    depends_on:
      - worker
    networks:
      - new

  worker:
    depends_on:
      - db
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql
networks:
  new:
  legacy:

  此时直接使用depends_on已经不再需要link,如果woker需要访问db,可以直接通过mysql:port的方式。
使用networks的要点在于:
1. 注意自定义网络的方式
2. 注意docker-compose.yml文件的位置与网络默认命名的关系
3. 注意遇到问题尝试几种替代方式去解决

  • 19
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
docker-compose 搭建的lamp+redis 代码 附上docker-compose # 标准配置文件应该包含 version、services、networks 三大部分, # 其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则 # 指定版本号 version: '2' services: # 在 services 标签下的第二级标签是 console,这个名字是用户自己自定义,它就是服务名称。 console: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: console # 容器内置名称 hostname: console # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/console # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # volumes_from 从其它容器或者服务挂载数据卷, # 可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - php # 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式 # ,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统 volumes: # 使用绝对路径挂载数据卷 - /root/.ssh/:/root/.ssh/ # 类似于使用 docker run 的效果 我也不知道 不写因为console并不是直接启动导致镜像不会产生 tty: true # web,这个名字是用户自己自定义,它就是服务名称。 web: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: web # 容器内置名称 hostname: web # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/nginx # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # 映射端口 ports: - '80:80' # 此选项解决了启动顺序的问题 这个的意思是必须在php启动以后才能启动 # 注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时, # 也会启动 php 服务,因为在配置文件中定义了依赖关系 depends_on: - php # volumes_from 从其它容器或者服务挂载数据卷, volumes_from: - php volumes: # 已经存在的命名的数据卷 - nginx-log:/var/log/nginx # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器 - ./images/nginx/sites-enabled:/etc/nginx/sites-enabled - ./images/nginx/cert:/etc/nginx/cert # 加入指定网络 networks: default: # 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器 aliases: - web.sunchanghao.top - mid.sunchanghao.top - sevice.sunchanghao.top - admin.sunchanghao.top # php,这个名字是用户自己自定义,它就是服务名称。 php: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: php # 容器内置名称 hostname: php # 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile, # 在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile # 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 build: # context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url # 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context context: ./images/php # 使用此 dockerfile 文件来构建,必须指定构建路径 dockerfile: Dockerfile # 挂载一个目录或者一个已存在的数据卷容器, volumes: # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./app:/mnt/app # db,这个名字是用户自己自定义,它就是服务名称。 db: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: db # 容器内置名称 hostname: db # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID image: mysql:5.7 environment: MYSQL_USER: 'sch' MYSQL_PASS: '1111' MYSQL_ROOT_PASSWORD: 'root' volumes: - db:/var/lib/mysql ports: - '3306:3306' redis: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: redis # 容器内置名称 hostname: redis # image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 image: redis:3.2.7 # 设置端口号 ports: - '6379:6379' # 挂载一个目录或者一个已存在的数据卷容器 volumes: # 已经存在的命名的数据卷。 - redis:/data # node volumes: nginx-log: # 设置volume的驱动,默认是local. driver: local db: driver: local redis: driver: local

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kiloveyousmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值