[목차]
1. 도커컴포즈란?
2. 도커컴포즈로 컨테이너 실행
2-1. 도커 컴포즈로 동작시키는 웹서버 예시
2-2. 도커 컴포즈 명령어
3. 빌드에서 운영까지
1. 도커컴포즈란?
여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴
- yaml 파일로 실행 요청
- 하나의 서비스를 운영하기 위해서는 여러 개의 애플리케이션이 동작해야 함
- 컨테이너화 된 애플리케이션들을 통합 관리할 수 있음
- 도커 컴포즈 설치 문서(Install the Compose standalone) : https://docs.docker.com/compose/install/other/
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
바이너리 파일이기 때문에 실행 권한을 추가해줘야 한다.
sudo chmod +x /usr/local/bin/docker-compose
2. 도커컴포즈로 컨테이너 실행
- 버전마다 지원 문법이 다름
version | compose 버전. 버전따라 지원 문법 다름. version: "3" |
services | 컴포즈를 이용해서 실행할 컨테이너 옵션을 정의 service: webserver: image: nginx db: image: redis |
build | 컨테이너 빌드 webapp: build: . |
image | 컴포즈를 통해 실행할 이미지를 지정 webapp: image: centos:7 |
command | 컨테이너에서 실행될 명령어 지정 app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" |
port | 컨테이너가 공개하는 포트를 나열 webapp: image: httpd:latest port: - 80 - 8443:443 |
link | 다른 컨테이너와 연계할 때 연계할 컨테이너 지정 webserver: image: wordpress:latest link: db:mysql |
expose | 포트를 링크로 연계된 컨테이너에게만 공개할 포트 webapp: build: . |
volumes | 컨테이너에 볼륨을 마운트 webapp: image: httpd volumes: - /var/www/html |
environment | 컨테이너에 적용할 환경변수를 정의 database: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: pass |
restart | 컨테이너가 종료될 때 적용할 restart 정책 no: 재시작 되지 않음 always: 컨테이너를 수동으로 끄기 전까지 항상 재시작 on-failure: 오류가 있을 시에 재시작 database: image: mysql:5.7 restart: always |
depends_on | 컨테이너 간의 종속성을 정의. 정의한 컨테이너가 먼저 동작되어야 한다. services: web: image: wordpress:latest depends_on: - db db: image: mysql |
워드프레스 예시: https://docs.docker.com/samples/wordpress/
(버전 도커 데스크탑 버전 4.10 이상 필요)
services:
db:
# We use a mariadb image which supports both amd64 & arm64 architecture
image: mariadb:10.6.4-focal
# If you really want to use MySQL, uncomment the following line
#image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
wp_data:
2-1. 도커 컴포즈로 동작시키는 웹서버 예시
1단계 서비스 디렉토리 생성
mkdir webserver
cd webserver
2단계 docker-compose.yml 생성
cat > docker-compose.yml
version: '3'
services:
web:
image: httpd:latest
ports:
- "80:80"
links:
- mysql:db
command: apachectl -DFOREGROUND
mysql:
image: mysql:latest
command: mysqld
environment:
MYSQL_ROOT_PASSWORD: pass
3단계 docker-compose 명령어
# 둘 다 가능. 중간 '-' 안써도 됨.
docker-compose up -d
docker compose up -d
# 상태 정보 확인
# 상단 명령어 up 뒤에 다른 옵션이 없기 때문에 현재 디렉토리에서 실행됐던 정보만 확인 가능
docker compose ps
# 스케일아웃/스케일인 가능. 단, 포트포워딩을 하고 있는 이미지는 안됨.
# docker-compose scale mysql=2
# docker-compose에서 비활성화 되었습니다. (compose up --scale를 대신 사용하세요)
docker compose up scale mysql=2
docker compose ps
# 컨테이너 종료는 stop이고, down은 현재 디렉토리에서 실행됐던 컨테이너 종료
docker compose down
# volume 까지 삭제
docker compose down --volumes
2-2. 도커 컴포즈 명령어
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
start | 컨테이너 시작 |
stop | 컨테이너 정지 |
restart | 컨테이너 재시작 |
pause | 컨테이너 일시 정지 |
unpause | 컨테이너 재개 |
port | 공개 포트 번호 표시 |
config | 구성 확인 (yml 파일 문법 확인, systax 오류 등) |
kill | 실행 중인 컨테이너 강제 정지 |
rm | 컨테이너 삭제 |
down | 리소스 삭제 |
- 다른 디렉토리에 있는 도커 컴포즈 실행할 때
docker-compose -f /other-dir/docker-compose.yml
- 특정 컨테이너에 명령어를 전달하고 싶을 때
docker-compose run 서비스이름 실행 명령어
3. 빌드에서 운영까지
1단계 서비스 디렉토리 생성
mkdir composetest
cd composetest
2단계 외부 서비스할 app.py 생성
접속할 때마다 1씩 증가하는 헬로우 텍스트 노출함
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)
3단계 빌드를 위한 dockerfile 생성
cat > Dockerfile
# 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"]
4단계 docker-compose.yml 생성
cat > docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
5단계 docker-compose 명령어
docker compose up -d
- 추가 샘플
레일스 : https://github.com/docker/awesome-compose/blob/master/official-documentation-samples/rails/README.md
- 볼륨 사용했을 때 이름만 쓰면 /var/lib/docker/volumes/ 디렉토리 안에 생성됨
- 출처: 따배도
10-1. 빌드에서 운영까지 (using Docker Compose) - 이론편
10-2. 빌드에서 운영까지 (using Docker Compose) - 실습편
'개발 > DevOps' 카테고리의 다른 글
Docker 컨테이너간 통신 (0) | 2022.12.29 |
---|---|
Docker Container Storage (0) | 2022.12.29 |
Docker 컨테이너 리소스 관리 (0) | 2022.12.29 |
Docker Registry 컨테이너 보관창고 (0) | 2022.12.28 |
Docker 컨테이너 만들기 (1) | 2022.12.27 |