剛開始接觸Docker的朋友,一定會常常看到範例寫到dockerfile docker-compose 那這兩個到底有什麼差別呢?
簡單用蛋糕店來舉例,一家店會有常備的蛋糕要每天賣,由於是每天都要產的,當然就有一套相同SOP流程及相同的模具可以做出蛋糕,以確保每天的蛋糕都一樣吧!好啦,這家店就像是Repository,可以有好多蛋糕模具,模具就像是Image,讓你可以重複生產相同的蛋糕,製造出來的蛋糕就是Container,每個蛋糕都是獨立且不會互相敢擾!!
## Dockerfile
FROM python:3.8.2
# 建立資料夾
RUN mkdir web_service
# 進去容器及指到該資料夾
WORKDIR web_service
# 複製所有檔案進去該資料夾
COPY . ./
# 更新apt-get
RUN apt-get update -y
# 改成台北時區
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
RUN TZ=Asia/Taipei \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata
# 下載套件
RUN pip install -r requirements.txt
# 設權限
RUN chmod -cR 640 *
# 執行python檔
CMD uvicorn main:app --reload --port 5006
ps. [Day15] 簡單搞懂 Gunicorn & Uvicorn 名詞解釋
執行Dockerfile docker build -t name.
查看建立的Docker Image docker image ls
Docker-Compose: 是用於執行Docker Container(s)
## docker-compose.yml
version: '3'
services:
# 服務的名字
web_service:
# docker deamon開啟時該container就會重啟
restart: always
# 該路徑底下需要包含Dockerfile
build: ./
# image 名稱
image: web_service
# 名稱
container_name: web_service
# 對應哪個port
ports:
- "5006:5006"
# 容器裡的檔案掛在容器外的哪裡
# connect at local file HOST:CONTAINER
volumes:
- ./:/web_service
docker-compose up -d
(-d 背景執行)docker ps -a