如何处理docker-compose.yml中的多个服务



我一直在使用微服务架构来开发我的软件,并且我已经使用 Docker Compose 运行我的服务,但我的问题是当创建新服务时,我必须将它们添加到 docker-compose.yml 中,然后我在 docker-compose.yml 中得到了大约 200+ 百行代码,我现在有大约 17 个服务,这些服务相互关联。

然后我的问题是"如何管理 docker-compose.yml 以便于维护和清洁?

My docker-compose.yml:

version: '2'
services:
   mongo:
     container_name: mongodb
     image: mongo:3.4.7
     volumes:
       - ./mongo/data:/data/db
     ports:
       - 54321:27017
     networks:
       - zensorium_backend
     restart: always
     command: mongod --smallfiles
   golang_oauth:
     container_name: golang_oauth
     build: .
     volumes:
        - ./oauth:/go/src/oauth
     working_dir: /go/src/oauth
     ports:
        - 8080:8082
     depends_on:
        - mongo
     env_file:
       - ./.api.env
     networks:
       - zensorium_backend
     command: realize start --run
     restart: always
   golang_account:
     container_name: golang_account
     build: .
     volumes:
        - ./account:/go/src/account
     working_dir: /go/src/account
     ports:
        - 8081:8082
     depends_on:
        - mongo
     env_file:
       - ./.api.env
     networks:
       - zensorium_backend
     command: realize start --run
     restart: always
   golang_client:
     container_name: golang_client
     build: .
     volumes:
        - ./client:/go/src/client
     working_dir: /go/src/client
     ports:
        - 8082:8082
     depends_on:
        - mongo
     env_file:
       - ./.api.env
     networks:
       - zensorium_backend
     command: realize start --run
     restart: always
   golang_mail:
     container_name: golang_mail
     build: .
     volumes:
        - ./mail:/go/src/mail
     working_dir: /go/src/mail
     expose:
        - 8082
     depends_on:
        - mongo
     env_file:
        - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_user:
     container_name: golang_user
     build: .
     volumes:
        - ./user:/go/src/user
     working_dir: /go/src/user
     ports:
        - 8083:8082
     depends_on:
        - mongo
     env_file:
        - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_gateway2:
     container_name: golang_gateway2
     build: .
     volumes:
        - ./gateway2:/go/src/gateway
     working_dir: /go/src/gateway
     ports:
        - 8084:8082
     depends_on:
        - mongo
     env_file:
       - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_measurement:
     container_name: golang_measurement
     build: .
     volumes:
        - ./measurement:/go/src/measurement
     working_dir: /go/src/measurement
     ports:
        - 8085:8082
     depends_on:
        - mongo
     env_file:
        - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_app:
     container_name: golang_app
     build: .
     volumes:
        - ./app:/go/src/app
     working_dir: /go/src/app
     ports:
        - 8086:8082
     depends_on:
        - mongo
     env_file:
        - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_logging:
     container_name: golang_logging
     build: .
     volumes:
        - ./logging:/go/src/logging
     working_dir: /go/src/logging
     ports:
        - 8087:8082
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_notify:
     container_name: golang_notify
     build: .
     volumes:
        - ./notify:/go/src/notify
     working_dir: /go/src/notify
     ports:
        - 8088:8082
     env_file:
        - ./.api.env
     networks:
        - zensorium_backend
     command: realize start --run
     restart: always
   golang_routine:
     container_name: golang_routine
     build: .
     volumes:
       - ./routine:/go/src/routine
     working_dir: /go/src/routine
     ports:
       - 8089:8082
     env_file:
       - ./.api.env
     networks:
       - zensorium_backend
     command: realize start --run
     restart: always
   angular_cli:
     container_name: angular_cli
     build: ./angular-cli
     ports:
       - "4200:4200"
     networks:
       - zensorium_frontend
     working_dir: /home/node/webPortal
     volumes:
       - ./angular-cli/webPortal:/home/node/webPortal
       - /home/node/webPortal/node_modules
     restart: always
     command: npm start
   golang_dev:
       container_name: golang_dev
       build: .
       volumes:
          - ./dev:/go/src/dev
       working_dir: /go/src/dev
       ports:
         - 8090:8082
       env_file:
         - ./.api.env
       networks:
         - zensorium_backend
       command: realize start --run
       restart: always
networks:
  zensorium_backend:
    driver: bridge
  zensorium_frontend:
    driver: bridge

我的建议是,如果您定义了大量服务,请尽可能少地保持docker-compose.yml。例如,您可以内联编写定义,使用.env文件,这样您就不必总是指定它,删除container_name。将working_dir移动到 Dockerfile。如果您使用的是版本 2,则可以使用服务的继承,但在 docker-compose 3 及更高版本中不支持此功能...还应使用命名卷。

内联docker-compose.yml示例

version: '2'
services:
  mongo:
    image: mongo:3.4.7
    command: mongod --smallfiles
    restart: always
    ports: ["54321:27017"]
    networks: [zensorium_backend]
    volumes: ["my_mongo_data:/data/db"]

  golang_oauth:
    build: .
    command: realize start --run
    restart: always
    working_dir: /go/src/oauth # could be moved do Dockerfile
    ports: ["8080:8082"]
    depends_on: [mongo]
    environment: ["VAR_1=${VAR_1}","VAR2=${VAR2}"] # using .env file
    networks: [zensorium_backend]
    volumes: ["my_oauth_data:/go/src/oauth"]
volumes:
  my_mongo_data:
  my_oauth_data:
networks:
  zensorium_backend:
    driver: bridge
  zensorium_frontend:
    driver: bridge

和 .env 文件与 .yml 位于同一文件夹中

VAR_1=mazel
VAR2=tov

您也可以使用 yaml 的可能性以更短的方式编写重复的字符串。例如:

---版本: '3.4'x-command: &command bash -c "ls && sleep infinity"服务业:  服务1:    命令: *命令  服务2:    命令: *命令

人类可以使用模板:https://matthiasnoback.nl/2018/03/defining-multiple-similar-services-with-docker-compose/

最新更新