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

# 같은 내용을 담고있다.
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 설치하기





2. Container 빌드에서 운영까지

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 운영하기

워드프레스(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

'Cloud Native > Docker' 카테고리의 다른 글
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 12+(문제풀이/오류) (0) | 2022.02.25 |
---|---|
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 12(컨테이너간 통신/DB Error) (0) | 2022.02.21 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 11(컨테이너 스토리지) (0) | 2022.02.18 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 10+(문제풀이/성공) (0) | 2022.02.18 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 10(컨테이너 리소스 관리) (0) | 2022.02.18 |