Skip to main content

Compose

docker-compose1

什麼是Docker-Compose

  • Docker 三大管理工具之一:Compose
  • 前身為fig 在 2014/07 被 Docker 收購
  • 第一版於 2013/12 由 Orchard 團隊以 Python 開發並發布
  • 以撰寫定義檔為主,定義和執行多個 Docker 容器,類似積木堆疊的概念產生完整服務服務
  • 只要寫一個 docker-compose.yml,把所有要使用 Docker Image 寫上去,最後只要下 docker-compose up 指令,就可以把所有的 Docker Container 執行起來

docker-composeyaml1

安裝Docker-compose

$ cd /usr/bin
$ wget https://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64
$ mv docker-compose-Linux-x86_64 docker-compose
$ chmod 755 docker-compose

撰寫 docker-compose.yml

$ vim docker-compose.yml
version: '2'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
admin:
image: adminer
ports:
- 8080:8080

Docker-compose 常用指令

$ docker-compose up -d //當前目錄執行
$ docker-compose -f ./XXX/docker-compose.yml up -d //指定目錄執行
$ docker-compose down //移除所有 compose 所建構的容器與網路
$ docker-compose start //啟動被關閉的所有容器
$ docker-compose restart //重啟所有容器
$ docker-compose stop //停止所有容器
$ docker-compose logs <compose 檔內的服務名稱> //查詢容器紀錄
$ docker-compose config //檢查 docker-compose.yml 是否正確撰寫

Docker-compose yaml文件語法

version 目前的docker-compose版本
services 在此services階層下建立多個容器服務
images 指定映像檔
build 指定Dockerfile所在目錄
context 指定dockerfile路徑
command 容器啟動後預設執行的命令
volumes 資料對應 host filder:container folder
ports port對應 host port:container port
networks 使指定容器連接指令網路進行連接
depends_on 先後順序
environment 設定環境變數
hostname 設定容器名稱
restart 設定容器是否重新啟動
stdin_open 讓容器的標準輸入保持打開
tty 虛擬終端機到容器的標準輸入上,等同-t

LAB

see dockerfile
FROM
copy 複製到容器內部
LABEL 看你dokerfile的時候的標籤
VOLUME 資料存在本機內部永久化
EXPOSE 80 port

FROM nginx
COPY ./html /usr/share/nginx/html
LABEL name="Nginx Web Server" \
build-date="2019-7-12"
VOLUME ["/usr/share/nginx/html"]
EXPOSE 80

$ cd docker_advanced2
//建立一個image
$ docker build -t aiclass/custom-nginx:v1 ./lab2/1_1/ //-t tag image名稱必須是小寫 dockerfile路徑
$ docker images
//執行一個container
$ docker run -itd -p 80:80 --name nginx aiclass/custom-nginx:v1
$ docker ps -a
到localhost的80端口
$ docker images -a
$ docker rmi 785
LAB3
$ cd lab3
$ cat docker-compose.yml
version: '3' //yaml的版本
services: //服務
flask: //flash服務
build:
context: ./ //基底的image
container_name: python_test //容器的名稱
tty: true //
stdin_open: true //
ports: //端口
- "5000:5000"
#Developer use
#volumes:
# - ./web:/app/ //資料卷綁定
#command:
# - app.py //容器啟動時的指令

$ cat dockerfile
ADD ./web /app //
WORKDIR /app //以容器app為工作路徑
# install flask //
RUN pip install --upgrade pip //
RUN pip install Flask requests line-bot-sdk PyMYSQL
##run flask
##Developer use
#CMD ["python"]
#Production use
CMD ["python", "app.py"] //啟動容器時執行的命令
$ cat web/app.py
"""
flask 網頁測試
"""
from flask import Flask, request, abort
app = Flask(__name__)
@app.route('/',methods=['GET'])
def hello_world():
return 'ready'
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000) //python容器的端口5000上運行
$ docker-compose -f $pwd/lab3/docker-compose.yml up -d //-f去哪找yaml檔案 up啟動服務 -d後臺執行
$ docker ps -a //看看容器的狀態