Docker compose == 主要使用的功能為build、up、down。目標是整合在一個repo中如果需要多個microservices,就會需要有多個dockerfile。又同時目前的應用只會建構單一node,不需要把docker images推到dockerhub上,因此使用本機build image並使用本機docker image做成micro-service cluster就會需要。 ## 資料夾結構 假設資料夾狀態為: ```mermaid classDiagram direction TB; class RootFolder { docker_compose.yml } class Service1Folder{ dockerfile1 } class Service2Folder{ dockerfile2 } RootFolder -- Service1Folder RootFolder -- Service2Folder ``` 後面就期望docker compose可以到特定資料夾下編譯dockerfile製作成docker images。 ## 製作方式 先用一個很toy的dockerfile,並且把這個dockerfile放到service1跟service2的folder底下。這邊要測試經過docker compose設定路徑後的context是在root底下還是該資料夾底下,所以在Service1的資料夾底下放置了一個檔案hello.txt,並且透過dockerfile把該檔案放到Container裡面。Service2則不需要: ```dockerfile= # Service1 From ubuntu RUN apt update -y && apt upgrade -y RUN mkdir /workspace WORKDIR /workspace COPY "hello.txt" . CMD [bash] ``` ```dockerfile= # Service2 From ubuntu RUN apt update -y && apt upgrade -y CMD [bash] ``` 接下來到root folder底下製作docker-compose.yml: ```yaml= version: '3' services: service1: build: context: ./service1 dockerfile: Dockerfile command: sleep 100 ports: - "5000:5000" volumes: - .:/workspace links: - service2 service2: build: context: ./service2 dockerfile: Dockerfile command: sleep 100 volumes: - .:/workspace service3: image: "markliou/python3-tensorflow-gpu" command: sleep 100 ``` ## docker compose操作 啟用docker compose: ```shell= sudo docker-compose up sudo docker-compose up -d #如果要做成背景執行的話 ``` Service1跟Service2都是使用dockerfile進行管理,所以會製作docker image。docker compose命名該image的方式就是由該docker file是哪個service下的docker進行命名,並且在前面冠上*docker_temp_*。以這邊的例子,就會有3個container產生,分別叫做docker_temp_service1_1、docker_temp_service1_2、docker_temp_service1_3。 如果服務已經啟動過,但是有修改過dockerfile,之前好像有莫名的原因沒有進行到重build。所以如果有修改到dockerfile,建議把container重新編譯過: ```shell= docker-compose build docker-compose up --build ``` 上面提過如果沒有用daemon模式,有可能服務開了以後就卡在那。當把terminal關掉或是送終止訊號出去都會停掉這個compose。使用daemon模式如果要停掉compose服務: ```shell= sudo docker-compose down ``` [範例程式碼](https://github.com/markliou/tool_scripts/tree/master/docker/docker-compose) ###### tags: `cloud` `dockerfile` `docker compose`