Hekyのblog

多个服务的docker-compose编排

先是指定版本

version: '3'
现在已被废除,不需要写了

然后指定 service
每个service 都指定build字段或者image字段看是从dockerfile上构建镜像还是从拉取镜像
服务的名称直接缩进一格就好
container_name指定容器名称
ports指定开放的端口
depends_on指定该服务需要在哪些服务启动之后启动
environment指定环境变量
volumes指定数据卷

就是数据和容器内数据的映射
比如将容器内的某个文件夹保存在宿主机内的某个地方
也可以用docker的数据卷做持久化,在最外层需要多一个volumes字段,缩进一格放数据卷名称

在配置mysql的时候可以将sql文件映射到容器内/docker-entrypoint-initdb.d目录
映射好之后,容器启动会自动运行目录里面的sql文件。需要注意的是只有在首次创建数据库的时候会执行。所有如果对mysql做了持久化,就是将容器内/var/lib/mysql的东西映射到了本地或者数据卷,后面再次启动就不会执行,除非将持久化的内容删了,然后重新创建
mysql环境变量

  1. 环境变量优先级:

environment:

MYSQL_ROOT_PASSWORD: root123      # root密码(必需)
MYSQL_DATABASE:         # 创建的数据库名
MYSQL_USER:      # 创建的用户名
MYSQL_PASSWORD: # 用户密码

容器间通信需要使用networks来指定一个网络,和volume一样最后在配置url的时候将localhost或者127.0.0.1变成对应的服务名。
但是好像不用network指定网络也行。不过就是确实需要对应为服务名就是了。

更正:
可能是windows上的docker比较新,可以不指定network就默认为一个network,但是我部署到linux上的时候,ubuntu上装的一个docker compose就不支持,加上networks字段之后才正常工作

如果就是容器内自己用的话像是mysql,redis这种的端口应该就不用暴露出去,因为暴露出去是给宿主机用的。如果只是容器之间用的话就不暴露也行。

可以使用环境变量的方式配置application.propertiess里面的配置。将字段改为全大写,点变为短下划线即可。

最后使用

docker compose up -d

来后台启动

如果想要重新构建镜像可以使用

docker compose build
后面可以跟上对应的服务名表示单独构建某一个镜像

使用

docker compose down

来停止和删除容器

等于 stop + rm

示例:

services:
  qiannian:
    build: ./qiannian
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redisL
    networks:
      - qiannian_network
  
  ocr:
    build: ./ocr
    networks:
      - qiannian_network

  aiservice:
    build: ./ai_service
    networks:
      - qiannian_network

  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: qiannian
    networks:
      - qiannian_network
    volumes:
      - qiannian_mysql:/var/lib/mysql
      - ./qiannian/script.sql:/docker-entrypoint-initdb.d/script.sql

  redisL:
    image: redis:6.2-alpine
    container_name: redis
    networks:
      - qiannian_network

volumes:
  qiannian_mysql:

networks:
  qiannian_network:
    driver: bridge

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »