前言
本系列介绍如何基于docker-compose部署一套自己的开发环境。
教程讲解docker中networks配置。
给大家上一套我自己的简单的学习环境配置~先!
https://github.com/FRBoiling/rendu-env
参考文档:https://docs.docker.com/compose/compose-file/#network-configuration-reference
网络环境
通常,物理机之间的通信,大多是基于IP地址来实现的。在docker中,各容器之间也是通过IP地址的方式来通信的。涉及到网络通信相关的知识。我这里不做详细介绍。
你只需要知道,这基于相应的网络环境,并作合理的配置才能实现。
这里我只介绍容器的网络通信的简单配置。比如,IPv4,IPv6 ,网关,子网掩码等等。
目的是快速上手使用容器。
默认情况
默认情况下,Compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。
这样,容器就可被该网络中的其他容器访问。
应用程序的网络名称基于Compose的工程名称,而项目名称基于docker-compose.yml所在目录的名称。
如需修改工程名称,可使用–project-name标识或COMPOSE_PORJECT_NAME环境变量。
举个例子,假如一个应用程序在名为rd_ubuntu的目录中,并且docker-compose.yml如下所示:
version: '3'
services:
ubuntu:
image: ubuntu:latest
build: .
ports:
- "22:22" #比如ssh端口
当我们运行docker-compose up时,将会执行以下几步:
创建一个名为ubuntu_default的网络;
- 使用ubuntu服务的配置创建容器,它以“ubuntu”这个名称加入网络ubuntu_default;
- 可运行docker network ls查看已有网络列表
大致类似上图所示,ubuntu_default就是刚刚创建的容器ubuntu默认加入的网络
自定义网络
一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用networks命令自定义网络。networks命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。
默认网络自定义驱动
networks:
default: # default是一个默认存在的网络,
# Use a custom driver
driver: custom-driver-1
这样,就指定了自定义的网络驱动。
自定义网络
如下,我们在其中定义了两个自定义网络,名为inner和outer
networks:
inner:
# Use a custom driver
driver: custom-driver-1
outer:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2
自定义IP网段
networks:
inner:
# Use a custom driver
driver: default
outer:
ipam:
driver: default # 使用默认驱动
config:
- subnet: "172.16.238.0/24" #ipv4
- subnet: "2001:3984:3989::/64" #ipv6
加入网络
容器附加到的网络
version: "3.9"
networks:
inner:
name: rd_inner
services:
rd_ubuntu:
container_name: rd_ubuntu # 指定一个自定义容器名称,而不是生成的默认名称。
image: boiling/ubuntu:latest # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
restart: always # 容器总是重新启动
cap_add:
- ALL # 使用ALL参数,container内的root拥有全部权限。同privileged: true类似
build: # 构建参数
context: . # docker配置目录
dockerfile: dockerfile # dockerfile文件名
args:
buildno: 1
ports: # 配置端口 - "宿主机端口:容器暴露端口"
- "22:22" # 22是ssh端口
- "873:873" # 873是srync端口
networks: # 配置所属网络,引用networks下的条目(就是最上面配置的networks中配置的网络)
- inner # 加入inner网络
容器hosts外挂
不仅如此,我们还可使用networks将服务连接到不是由Compose管理的、外部创建的网络。
services:
some-service:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
容器静态IP
IP地址在容器启动时候可能会发生变法。这对于连接来说是相当麻烦的。你需要总是去查看当前的IP。并修改相应的连接配置。这就需要设置固定ip
version: "3.9"
networks:
inner: #自定义网络
name: rd_inner # 指定一个自定义网络名称,而不是生成的默认名称。
driver: driver
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1 #网关地址
services:
rd_ubuntu:
container_name: rd_ubuntu # 指定一个自定义容器名称,而不是生成的默认名称。
image: boiling/ubuntu:latest # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
restart: always # 容器总是重新启动
cap_add:
- ALL # 使用ALL参数,container内的root拥有全部权限。同privileged: true类似
build: # 构建参数
context: . # docker配置目录
dockerfile: Dockerfile # dockerfile文件名
args:
buildno: 1
ports: # 配置端口 - "宿主机端口:容器暴露端口"
- "22:22" # 22是ssh端口
- "873:873" # 873是srync端口
networks: # 配置所属网络,引用networks下的条目(就是最上面配置的networks中配置的网络)
inner: # 加入inner网络
ipv4_address: 172.20.0.2
容器网络别名
固定IP其实还是不太方便的,在使用容器时候,我们需要保证网络中的容器ip不重复,还需要知道各ip所对应的是哪个容器。
长串的IP还是不太好记的,而且比较容易出错。怎么办呢,最好用一个有具体含义的标识,用来方便我们记忆和区分容器。
容器在网络上是允许有别名的,且这个别名在所在网络中都可以直接访问,这就类似局域网在各物理机的主机名。
version: "3.9"
networks:
inner: #自定义网络
name: rd_inner # 指定一个自定义网络名称,而不是生成的默认名称。
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1 #网关地址
services:
rd_ubuntu:
container_name: rd_ubuntu # 指定一个自定义容器名称,而不是生成的默认名称。
image: boiling/ubuntu:latest # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
restart: always # 容器总是重新启动
cap_add:
- ALL # 使用ALL参数,container内的root拥有全部权限。同privileged: true类似
build: # 构建参数
context: . # docker配置目录
dockerfile: Dockerfile # dockerfile文件名
args:
buildno: 1
ports: # 配置端口 - "宿主机端口:容器暴露端口"
- "22:22" # 22是ssh端口
- "873:873" # 873是srync端口
networks: # 配置所属网络,引用networks下的条目(就是最上面配置的networks中配置的网络)
inner:
aliases:
- UNBUNTU_URL