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

时间:2018-03-09 10:09:23

标签: docker docker-compose

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

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

我的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

2 个答案:

答案 0 :(得分:0)

如果您定义了很多服务,我的建议是尽可能少地保留docker-compose.yml。例如,您可以编写内联定义,使用.env文件,这样您就不必总是指定它,删除container_name。将working_dir移动到Dockerfile。如果您使用的是版本2,则可以使用inheritance of service,但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

答案 1 :(得分:0)

此外,您还可以使用yaml的可能性以较短的方式编写重复的字符串。例如:

---
version: '3.4'
x-command: &command bash -c "ls &&  sleep infinity"

services:

  service1:
    command: *command

  service2:
    command: *command

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