Docker-compose란?
- 여러 container를 일괄적으로 정의하고 실행할 수 있는 tool
- container화 된 application들을 통합 관리 할 수 있음Overview of Docker Compose 참고
- yaml file 문법 (Compose file version 2 reference , Compose file version 3 reference 참고)
- version : compose version
version에 따라 지원 문법이 다름. - service : compose를 이용해서 실행할 container option을 정의
- build : container build
- image : compose를 통해 실행할 image를 저장
- command : container에서 실행될 명령어 지정
- port : container가 공개하는 port를 나열
- link : 다른 container와 연계할 때 연계할 container 지정
- expose : port를 link로 연계된 container에게만 공개할 port
- volumes : container에 volume을 mount
- environment : container에 적용할 환경변수를 정의
- restart : container가 종료될 때 적용할 restart 정책
- no : 재시작 되지 않음
- always : container를 수동으로 끄기 전까지 항상 재시작
- on-failure : 오류가 있을 시에 재시작
- depends_on : container 간의 종속성을 정의
정의한 container가 먼저 동작 되어야 함
- version : compose version
Docker-compose command
- up : container 생성/시작
- --scale : container 개수 증가/감소
- ps : container 목록 표시
- logs : container log 출력
- run : container 실행
- start : container 시작
- stop : container 정지
- restart : container 재시작
- pause : container 일시정지
- unpause : container 재개
- port : 공개 port 번호 표시
- config : 구성 확인
- kill : 실행 중인 container 강제 정지
- rm : container 삭제
- down : resourece 삭제
- --volumes : volume까지 삭제
❗ 반드시 docker-compose.yml file이 있는 directory에서 명령 실행 가능
[ Hands - on ]
Docker-compose 설치 (
Install Docker Compose 참고)
- prerequisites
- docker engine 설치 필요 Install Docker Engine
- docker를 관리할 수 있는 non-root user 필요
- 설치 확인
docker compose verison
Container 빌드에서 운영까지 (Get started with Docker Compose 참고)
- service directory 생성
mkdir composetest
cd composetest
- build를 위한 dockerfile 생성
cat >> app.py << EOF
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
EOF
cat >> requirements.txt << EOF
flask
redis
EOF
cat >> dockerfile << EOF
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
EOF
- docker-compose.yml 생성
cat >> docker-compose.yml << EOF
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
EOF
- docker-compose command로 application build and run
docker compose up
- 실행 확인
- docker-compose.yml file 수정
cat > docker-compose.yml << EOF
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
EOF
- docker-compose command로 application rebuild and rerun
docker compose up -d
- 실행확인
- host의 app.py code 내용 변경
vi app.py
- 변경된 사항 적용 확인
- conatiner 개수 증가
docker compose up -d --scale redis=3
- 추가 command 확인
docker compose run web env
docker compose logs web
- container 삭제
docker compose down --volumes
Mysql을 사용하는 Wordpress 운영 (Quickstart: Compose and WordPress 참고)
- service directory 생성
mkdir my_wordpress
cd my_wordpress/
- docker-compose.yml file 생성
cat >> docker-compose.yml << EOF
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
EOF
- container build and run
docker compose up -d
- http://localhost:8000 로 접속하여 생성 확인
- db contents 확인 (root user로 확인 가능)
ls -al /var/lib/docker/volumes/my_wordpress_db_data/_data
- container 삭제
docker compose down --volumes
'INFRA > DevOps' 카테고리의 다른 글
[K8s] kubernetes 동작 원리 (0) | 2022.08.16 |
---|---|
[k8s] kubernetes 설치 (containerd 사용) (0) | 2022.08.08 |
github-action과 aws codedeploy를 이용해 ec2에 배포하기 (0) | 2022.07.20 |
[Docker] Container간 통신 (네트워크) (0) | 2022.07.18 |
Github의 이해 3 (0) | 2022.07.15 |
댓글