iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 29
0
Software Development

.Net微服務輕旅行30天系列 第 29

Day 29: 微服務的封裝 Docker -- 容器們的啟動與互動docker-compose

相對於docker build與dockerfile聚焦在image如何產生,而docker-compose指令著重在複數容器啟動時的設定與互動(資料空間、docker network),內容主要著重在docker-compose.yml設定檔的編寫,docker-compose up指令可以依據docker-compose.yml檔案,進行一連串的設定與啟動

yml/yaml的格式

https://zh.wikipedia.org/wiki/YAML
寫幾點我在練習時候有稍微卡關的地方

  • 以縮排對齊為同一階層, 所以可以看到沒有像是() {},等JSON用來分隔的符號
  • key/value會以空白分開,例如index: 1, 不能寫成index:1
  • 大小寫是不同的
  • 注意要輸入的參數是key/value還是array
  • 不要用純notepad寫, notepad++或VS Code會幫你對齊,讓你更容易了解那些是同階層
  • 不接受tab, 只接受空白(如果你跟我一樣習慣按tab的話應該會卡關一下)

利用docker-compose啟動開發環境需要的服務

來看下面我用來啟動eureka, hystrix, rabbitmq的例子

version: '3'

services:
  eureka:
    image: springcloud/eureka:latest
    container_name: eureka-server
    depends_on:
       - "rabbitmq"
    ports: 
       - "8761:8761"

  hystrix:
    image: kennedyoliveira/hystrix-dashboard:latest
    container_name: hystrix-dashboard
    depends_on:
       - "rabbitmq"
    ports: 
       - "7979:7979"

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports: 
       - "5672:5672"
       - "15672:15672"
volumes:
networks:

先從大分區來看
version, services, volumes, networks
version: 這個docker-compose對應到的docker版本,不同版本指令略有區別
services: 就是容器的各項設定

  • image: 指定用來啟動的image
  • container_name: 啟動後的容器名稱
  • depend_on: 等待特定容器先啟動完成(啟動順序的安排),在這個例子中我先啟動RabbitMQ才啟動其他兩個
  • ports: locallost跟containers的port映射

volumes: 共用儲存空間的設定, 就是data volume
networks: 容器間內部網路的設定

由於沒有database又是透過主機的port連線,所以沒有內容

一行docker-compose up就讓我在利用steeltoeoss開發中需要的環境啟動完成

利用docker-compose啟動的過程中,產生新的image再啟動container

注意最下面的productservice,apigateway

version: '3'

services:
  eureka:
    image: springcloud/eureka:latest
    container_name: eureka-server
    depends_on:
       - "rabbitmq"
    ports: 
       - "8761:8761"

  hystrix:
    image: kennedyoliveira/hystrix-dashboard:latest
    container_name: hystrix-dashboard
    depends_on:
       - "rabbitmq"
    ports: 
       - "7979:7979"

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    ports: 
       - "5672:5672"
       - "15672:15672"

  productservice:
    image: productservice:latest
    container_name: productservice
    build:
      context: ./productservice
    depends_on:
      - "eureka"

  apigateway:
    image: apigateway:latest
    container_name: apigateway
    environment:
      - BUILD=LOCAL 
    build:
      context: ./apigateway
    depends_on:
      - "rabbitmq"
      - "hystrix"

利用build指令,可以切換到不同目錄下然後以該目錄底下的dockerfile進行編譯後發行image, 再依據最新的image啟動容器。當然docker-compose的步驟可以靠寫批次檔完成,但不會像使用docker-compose搭配yml這麼方便管理,利用docker-compose在localhost一次啟動所有開發所需的服務,這個還蠻實用的,當你的服務越來越多,可以幫你省下不少手動啟動跟環境設置的時間。

一些docker-compose的指令

docker-compose build
docker-compose start [容器名稱,沒有名稱則是啟動所有yml設定的容器]
docker-compose stop [容器名稱,沒有名稱則是停止所有yml設定的容器]
docker-compose rm -v: 移除所有yml設定且停止的容器,參數-v是移除data volumne
docker-compose ps: 列出在yml裡面被設定的容器
docker-compose build: 執行yml裡面有設定過的build

docker還有好多得學,三天真的只是划水....


上一篇
Day 28: 微服務的封裝 Docker -- dockerfile自製image
下一篇
Day 30: 每段旅行的終點,總是還有很多景點沒有逛到
系列文
.Net微服務輕旅行30天30

尚未有邦友留言

立即登入留言