1. Docker-compose

 도커 컴포즈 = 여러 컨테이너를 일괄적으로 정의하고 관리할 수 있는 툴
  • YAML(야믈) 형태의 스크립트를 통해 원하는 컨테이너를 설정하고 작성한다.
  • 도커 컴포즈를 통해 YAML 파일을 실행하면 docker 명령어로 해석하여 실행하게 된다.
  • 도커 컴포즈를 통해 여러 컨테이너를 일괄적으로 운영할 수 있다.

YAML 파일 예시(https://docs.docker.com/compose/compose-file/)

# 같은 내용을 담고있다.
docker run --name db -v db_data:/v/li/my --restart=always -e MYSQL_ROOT_PASSWORD=somewordpress mysql:5.7


/*
services:
	db:
    	image: mysql:5.7
        volumes:
        	- db_data:/var/lib/mysql
        restart: always
        environment:
        	MYSQL_ROOT_PAWWSORD: somewordpress
*/
//Docker-compose에서 사용되는 YAML 파일 내용
version		#컴포즈 버전
service		#실행할 컨테이너 정의
build		#컨테이너 빌드
image		#실행할 이미지 지정
command		#컨테이너 실행 시 추가 명령어 지정
port		#컨테이너 공개 포트 목록
link		#연계할 컨테이너 지정
expose		#링크로 연계된 컨테이너에게만 공개할 포트 목록
volumes		#컨테이너에 볼륨 마운트
environment	#컨테이너에 적용할 환경변수 정의
restart		#컨테이너 종료 시 적용할 restart 정책
depends_on	#컨테이너 간의 종속성 정의(정의한 컨테이너가 먼저 동작)

 

2. 도커 컴포즈로 동작시키는 웹서버

2-1. 서비스 디렉토리 생성

mkdir webserver
cd webserver

2-2. docker-compose.yml 생성(by container image)

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

2-3. docker-compose 명령어

docker-compose up -d		#yaml 실행(백그라운드)
docker-compose ps		#컨테이너 정보(현재 디렉토리 - web,mysql)
docker-compose scale mysql=2		#mysql 개수 조절
docker-compose ps
docker-compose down		#현재디렉토리 컨테이너들 삭제
//docker-compose 명령어
up		#컨테이너 생성/시작
ps		#컨테이너 목록 표시
logs		#컨테이너 로그 출력
run		#컨테이너 실행
start		#컨테이너 시작
stop		#컨테이너 정지
restart		#컨테이너 재시작
pause		#컨테이너 일시정지
unpause		#컨테이너 재개
port		#공개 포트 번호 표시
config		#구성 확인
kill		#실행 중인 컨테이너 강제 정지
rm		#컨테이너 삭제
down		#리소스 삭제
docker-compose config		#YAML 문법 체크
docker-compose up
docker-compose up -d
docker-compose -f /other-dir/docker-compose.yml		#다른 디렉토리 실행

docker-compose ps
docker-compose scale 서비스이름=개수
docker-compose run 서비스이름 실행명령어		#특정 컨테이너 명령 전달
docker-compose logs 서비스이름

docker-compose stop
docker-compose start
docker-compose down

 

3. 빌드에서 운영까지

3-1. 서비스 디렉토리 생성

mkdir composetest
cd composetest

3-2. 빌드를 위한 dockerfile 생성

cat > Dockerfile
FROM python:3.7-alpine		#베이스 이미지
WORKDIR /code		#작업디렉토리 설정
ENV FLASK_APP=app.py		#환경변수 FLASK = 웹서버 지원(like apache)
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc m usl-dev linux-headers
COPY requirements.txt requirements.txt		#파이썬 구동 관련 라이브러리 목록(FLASK, Radis)
RUN pip install -r requirements.txt		#파이썬 라이브러리 설치(FLASK, Radis)
EXPOSE 5000
COPY . .		#파이썬 소스코드 복사
CMD ["flask", "run"]

3-3. docker-compose.yml 생성(by dockerfile)

cat > docker-compose.yml
version: "3"
services:
	web:		#FLASK - 웹서비스
    	build .		#현재 폴더의 도커파일을 빌드
        ports:
        	- "5000:5000"
    redis:		#redis - DB(횟수 저장)
    	image: "redis:alpine"		#이미지에 의해 빌드

3-4. docker-compose 명령어

docker-compose up -d

 


[실습]

1. Docker-compose 설치하기

docs.docker.com 에 있는 설치, 실행 명령어를 복붙

2. Container 빌드에서 운영까지

앞서 이론부분에서 설명한 절차가 담겨있음(https://docs.docker.com/compose/gettingstarted/)

2.1 서비스 디렉토리 생성 / 빌드를 위한 dockerfile 생성

mkdir composetest
cd composetest
 
cat > app.py
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)
    
cat > requirements.txt
flask
redis

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"]

 

2.2 docker-compose.yml 생성

cat > docker-compose.yml
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

 

2.2 docker-compose에 의해 빌드 및 실행

docker-compose up

ls
docker images

2.3 docker 컨테이너 시스템 접속

 

2.4 기존 컨테이너 수정 및 운영

docker-compose down		#ctrl+c

vim docker-compose.yml

/*
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code		#현재 작업디렉토리는 컨테이너의 /code를 마운트하여 code 안에 app.py를 로컬 디렉토리에서 컨트롤할 수 있도록
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
*/

docker-compose up -d
docker-compose ps

vi app.py		#볼륨 마운트 되었기 때문에 해당 수정 내용이 컨테이너에 반영됨

/*
@app.route('/')
def hello():
	count = get_hit_count()
    return 'Hello Docker! I have been seen {} times.\n'.format(count)
*/

2.5 기타 도커 컴포즈 명령어

docker-compose ps

docker-compose scale redis=3		#컨테이너의 개수를 조절할 수 있다.
docker-compose scale redis=1		#다만 포트가 지정되어있는 경우 스케일을 조절하면 충돌이 일어나기 때문에 주의해야한다.

docker-compose run web env		#docker의 exec 명령어와 유사
docker-compose logs web		#docker의 logs 명령어와 유사

docker-compose stop		#컴포즈 중지만(종료되지 않음)
docker-compose down --volumes		#컴포즈 종료+컴포즈에 의해 만들어진 볼륨까지 삭제

 

3. MySQL DB를 사용하는 Wordpress 운영하기

https://docs.docker.com/samples/wordpress/

워드프레스(wordpress)는 웹페이지 제작 및관리 기능을 가졌으며 기본적으로 MySQL DB를 사용한다.
따라서 생성된 워드프레스 데이터는 모두 MySQL에 저장된다.
또한 예제에서는 db컨테이너에 의해 mysql의 데이터가 db_data로 마운트되어 저장된다.(영구보존)

 

mkdir my_wordpress
cd my_wordpress		#service directory

cat > docker-compose.yml
/*
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 이후에 wordpress 진행
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"		#열려있는 포트(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: {}
*/

docker-compose up -d
docker-compose ps

설명한 볼륨마운트가 정상적으로 진행된 모습

docker-compose ps
docker-compose down --volumes