Docker Compose 文件通常使用 YAML 格式,下面是一个完整的 Compase 示例:
# 版本声明 version: '3.8' # 服务定义 services: # 一个容器,即一个服务 web: build: context: . dockerfile: Dockerfile.web ports: - "8080:80" depends_on: - db - cache environment: - DB_HOST=db - CACHE_HOST=cache - APP_ENV=production networks: - mynetwork # 一个容器,即一个服务 db: image: postgres:13 environment: - POSTGRES_USER=myuser - POSTGRES_PASSWORD=mypassword - POSTGRES_DB=mydb volumes: - db_data:/var/lib/postgresql/data networks: - mynetwork # 一个容器,即一个服务 cache: image: redis:latest ports: - "6379:6379" volumes: - cache_data:/data networks: - mynetwork # 定义数据卷 volumes: db_data: cache_data: # 定义网络 networks: mynetwork: driver: bridge
下面将对 Docker Compose 的各个部分进行详细介绍。
Docker Compose 中需要指定版本信息,在文件开头,使用 version 进行版本声明。例如:
version: '3'
目前,常用的版本是 “3.x”,它引入了一些新的功能和语法改进。
使用 services 进行服务定义,服务定义用来定义应用程序中的各个服务。每个服务都是一个独立的容器,具有自己的配置,如:镜像、端口映射、环境变量等。例如:
# 定义服务 services: # 定义一个服务 web: image: nginx ports: - "80:80" # 定义另一个服务 db: image: mysql environment: MYSQL_ROOT_PASSWORD: password
在上面的例子中,定义了两个服务:“web” 和 “db”:
web 服务使用 Nginx 镜像,将容器的 80 端口映射到宿主机的 80 端口。
db 服务使用 MySQL 镜像,并设置了环境变量 MYSQL_ROOT_PASSWORD 为“password”。
每个服务可以有多个配置选项,如网络、数据卷、依赖等,例如:
# 服务定义 services: # 一个容器,即一个服务 web: # 容器构建信息 build: context: . dockerfile: Dockerfile.web # 容器的端口映射 ports: - "8080:80" # 容器的依赖 depends_on: - db - cache # 容器的环境变量 environment: - DB_HOST=db - CACHE_HOST=cache - APP_ENV=production # 容器的网络配置 networks: - mynetwork
一个服务定义可以包括以下常见的选项:
使用 image 指定当前服务使用的镜像名称。可以是本地镜像、Docker Hub 上的镜像或私有仓库中的镜像。
如果服务需要从源代码构建镜像,可以使用 build 选项指定构建上下文和 Dockerfile 的路径。例如:
# 服务定义 services: # 一个容器,即一个服务 web: build: context: . dockerfile: Dockerfile.web
在上面的例子中,“web” 服务将从当前目录(上下文为 “.”)中的 Dockerfile 构建镜像。
使用 ports 定义容器与宿主机之间的端口映射。格式为 “宿主机端口:容器端口”。例如:“8080:80” 表示将宿主机的 8080 端口映射到容器的 80 端口。例如:
# 服务定义 services: # 一个容器,即一个服务 web: # ... # 容器的端口映射 ports: - "8080:80"
如果要映射多个端口,如下:
# 服务定义 services: # 一个容器,即一个服务 web: # ... # 容器的端口映射 ports: - "8080:80" - "8082:82"
使用 environment 设置环境变量,可以是一个字典或一个数组。例如:
db: environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: mydatabase
上例中定义了一个名为 db 的服务,其中:
MYSQL_ROOT_PASSWORD: password 这是为 MySQL 数据库设置根用户的密码为 password。在实际使用中,应使用强密码以确保数据库的安全性。
MYSQL_DATABASE: mydatabase 这是指定在 MySQL 数据库中创建一个名为 mydatabase 的数据库。当容器启动时,如果该数据库不存在,MySQL 会自动创建它。
使用 volumes 实现挂载卷,可以是宿主机目录或数据卷。例如:
web: volumes: - ./app:/app - web_data:/usr/share/nginx/html
以下是对这段配置的解释:
./app:/app 将主机上当前目录下的 app 目录挂载到容器内的 /app 路径。这种方式可以方便地在开发过程中让容器访问主机上的应用代码,以便进行实时的开发和调试。例如,在主机上修改代码后,容器可以立即看到这些变化,无需重新构建容器。
web_data:/usr/share/nginx/html 将名为 web_data 的卷挂载到容器内的 /usr/share/nginx/html 路径。如果 web_data 卷不存在,Docker Compose 启动时会自动创建它。这个卷可以用于存储网站的静态文件,确保数据的持久性。
使用 depends_on 指定服务之间的依赖关系。例如:
web: # 定义依赖 depends_on: - db
以下是对这段配置的解释:
depends_on: - db 表示 web 服务依赖于名为 db 的服务。这意味着在启动 web 服务之前,Docker Compose 会确保 db 服务已经启动并处于运行状态。这样可以避免在数据库服务尚未准备好时,web 服务尝试连接数据库而导致的错误。
在 Docker Compose 中,使用 volumes 定义数据卷。数据卷可以在多个服务之间共享数据。例如:
# 定义数据卷 volumes: # 定义名为 myvolume 的数据卷 myvolume: # 指定驱动类型 driver: local # 指定驱动选项参数 driver_opts: # 指定数据卷类型 type: none # 指定主机上的位置 device: /path/to/host/directory # 指定使用方式 o: bind
这段配置是在定义一个名为 myvolume 的数据卷,并指定了一些参数来控制这个数据卷的行为。详细说明如下:
driver 参数:
driver: local 表示使用本地驱动来创建这个数据卷。在 Docker 中,不同的驱动可以用于不同的存储后端,而 local 驱动通常表示使用本地文件系统来存储数据卷的数据。
driver_opts 参数:
type: none 这里明确指定了数据卷的类型为 none。结合 local 驱动,这通常意味着直接使用主机的文件系统,而不经过特定的存储后端类型的处理。
device: /path/to/host/directory 指定了主机上的具体目录路径。这个路径将作为数据卷在主机上的存储位置。容器中挂载这个数据卷时,实际上就是访问这个主机目录下的内容。
o: bind 这个参数表示使用绑定挂载(bind mount)的方式。绑定挂载允许将主机上的一个目录直接挂载到容器中,使得容器可以访问主机目录中的文件和目录,并且容器中的修改也会反映到主机目录中(如果权限允许的话)。
总的来说,这段配置定义了一个名为 myvolume 的数据卷,使用本地驱动和绑定挂载的方式,将主机上的 /path/to/host/directory 目录与容器中的特定路径进行关联,实现数据的共享和持久化。这样可以方便地在容器和主机之间共享文件,并且确保数据在容器被删除或重新创建时仍然得以保留。
在 Docker Compose 中,使用 networks 定义网络,可以让服务在同一个网络中进行通信。例如:
# 定义网络 networks: # 定义名为 mynetwork 的网络 mynetwork: # 指定网络的驱动类型 driver: bridge
这段配置定义了一个名为 mynetwork 的网络。参数详细说明:
driver: bridge 指定了网络的驱动类型为 bridge。这是 Docker 中一种常见的网络驱动,它创建一个虚拟的以太网桥接网络。使用 bridge 驱动的网络具有以下特点:
容器隔离:每个容器连接到这个网络时,会在容器内部创建一个虚拟网络接口,与其他容器在网络层面上进行隔离。这有助于提高安全性和避免网络冲突。
容器间通信:尽管容器在网络层面上是隔离的,但连接到同一个 bridge 网络的容器可以通过容器名称或 IP 地址相互通信。这样可以方便地在不同的服务之间进行网络通信,而无需暴露容器的端口到主机上。
与主机网络隔离:bridge 网络与主机的网络是隔离的,容器在这个网络中的 IP 地址通常是由 Docker 分配的私有 IP 地址范围。这可以避免容器与主机上的其他服务发生 IP 地址冲突。
总之,Docker Compose 文件结构清晰,易于理解和维护。通过定义多个服务和它们的配置选项,可以轻松地管理多容器应用程序的部署和运行。