일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- FastAPI
- 알고리즘
- NLP
- rnn
- docker
- 완전탐색
- vscode
- GIT
- NaverAItech
- DeepLearning
- datascience
- torchserve
- PytorchLightning
- Kubernetes
- pep8
- GCP
- GitHub Action
- 백준
- 프로그래머스
- github
- python
- autoencoder
- Kaggle
- 네이버AItech
- 코딩테스트
- FDS
- pytorch
- wandb
- Matplotlib
- leetcode
- Today
- Total
Sangmun
Docker compose 본문
지금까지는 하나의 Docker Image만을 띄우는 것을 알아보았는데 하난의 Docker Image가 아니라 여러 Docker Image를 띄우고 싶거나 A Image를 띄우고 B Image를 띄워야 하는 상황이 있다면?(B가 A에 의존)
Docker compose를 활용을 할 수 있다.
Docker compose 설치
Mac이나 Window라면 docker desktop을 설치하면서 docker compose도 자동으로 설치가 된다.
linux라면 docker compose는 따로 설치를 해줘야 한다.
https://docs.docker.com/compose/install/
설치 후 버전을 확인하면서 제대로 설치가 되었는지 확인을 해준다.
$docker compose version
docker-compose.yml
docker image의 내용을 Dockerfile에 작성했던 것처럼 docker-compose의 내용은 docker-compose.yml에 작성을 한다.
먼저 그냥 docker run 명령어로 node image를 띄웠을 때와 docker-compose에 작성된 내용을 비교해 보자.
node서버의 포트, volume, 환경 변수등 많은 옵션들이 주어진다.
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
위의 명령어를 docker-compose.yml 파일로는 아래와 같이 옮길 수 있다.
services:
# app은 어떠한 이름도 될 수 있음 사용자 정의에 따름
# 자동적으로 네트워크의 이름이 됨
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
다음은 docker run으로 mysql을 생성하는 명령어이다.
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0
docker-compose.yml로는 아래와 같이 작성할 수 있다.
주목해야 할 점은 아래와 같다.
* docker run 명령어에서는 network-alias를 지정해 주었지만 docker-compose.yml에서는 service이름을 mysql로 지정해 주면서 자동적으로 network-alias가 mysql로 지정되게 된다.
* 또한 docker run 명령어에서는 지정된 volume이 자동으로 생성되었지만 compose에서는 그렇지 않아서 사용할 volumne을 volumes: 카테고리 아래에 지정해 준 것을 확인할 수 있다.
services:
app:
# The app service definition
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
따라서 전체 docker-compose.yml 파일은 다음과 같다.
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
이후 docker-compose run -d 명령어로 실행해 주면 다음과 같은 로그가 뜨면서 잘 실행되는 것을 확인할 수 있다.
Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... done
docker-compose.yml 파일에 작성
docker-compose로 fastapi와 mysql 연동
또 다른 예시로는 fastapi와 mysql을 연동하는 예시가 있다.
mysql 부분은 위의 예시와 크게 달라진 것은 없다.
version: '3'
services:
db:
image: mysql:5.7.12
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: my_database
ports:
- 3306:3306
app:
build:
context: .
environment:
DB_URL: mysql+mysqldb://root:root@db:3306/my_database?charset=utf8mb4
ports:
- 8000:8000
depends_on:
- db
restart: always
* version : compose file의 버전을 명시합니다.
versioning은 버전별로 다음과 같은 특징이 있습니다.
- Version 1에서는 버저닝을 생략
- Version 2부터 마이너 버전(2.x)까지 설정해야 함 (생략 시 2.0으로 적용된다.)
- Version 3은 도커 스웜과 같이 사용되도록 디자인됨
* build : Dockerfile 빌드를 하기 위해 Dockerfile이 있는 경로를 지정
context:.라는 의미는 현재 경로에 Dockerfile이 있다는 의미이며 위의 예제에서 사용된 Dockerfile은 다음과 같다.
FROM python:3.8.7-slim-buster
COPY . /app
WORKDIR /app
ENV PYTHONPATH /app
ENV PYTHONBUFFERED=1
RUN pip install pip==21.2.4 && \
pip install -r requirements.txt
CMD ["python", "main.py"]
* depends_on: service 간 종속을 의미하며 위에서는 db가 실행되고 난 후에 app이 실행되어야 한다는 의미이다.
* restart : 몇 가지 옵션이 있으며 각각 아래의 뜻을 의미한다.
no : 수동으로 재시작
always : 컨테이너를 수동으로 off 하기 전까진 항상 재시작
on-failure : 오류가 있을 때 재시작
출처 :
https://meetup.nhncloud.com/posts/277
https://docs.docker.com/get-started/08_using_compose/
'개발' 카테고리의 다른 글
Python Thread의 개념과 사용예시 (0) | 2023.03.07 |
---|---|
Google cloud Compute Engine에서 인스턴스 만들기 (0) | 2023.02.11 |
Docker 기본 명령어 정리 (0) | 2023.02.04 |
저작권에 대한 내용 정리 (0) | 2023.01.23 |
자연어 전처리 관련 유용한 패키지 (0) | 2023.01.22 |