---
# System prepended metadata

title: Docker compose
tags: [dockerfile, docker compose, cloud]

---

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`