📌 공부 계기
추가적인 도커 공부를 위해 유튜브 따배도 도커 시리즈를 보면서 정리해 봅니다.
목차
📍10-1. 빌드에서 운영까지 : 이론
1️⃣ 도커 컴포즈가 뭐에요?
여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴.
하나의 서비스를 운영하기 위해 여러개의 애플리케이션을 동작해야 할 때가 있다. 이때 애플리케이션을 컨테이너화 시켜 통합 관리할 수 있다.
지금까지 여러 명령어를 하나하나 실행해주었는데
YAML(야믈)파일 하나로 도커 컴포즈에 요청하면 이 yaml 파일을 명령어로 해석해 컨테이너를 관리한다.
또한 이 compose로 연결되어 있는 컨테이너들을
docker-compose 툴로 한꺼번에 상태를 보고, 관리하고, 운영할 수 있다.
🚩 도커 컴파일 구성
여기 포스팅에도 정리해 놓긴 했었는데
* version
도커 컴포즈의 버전을 의미.
현재(230409 기준) version 3 이상을 사용
* services
실행하려는 컨테이너들을 정의하는 영역
컨테이너에 대한 이름, 이미지, 포트 매핑, 환경변수, 볼륨 등의 정보를 가지고 컨테이너를 생성하고 관리
- image : 컨테이너의 베이스 이미지
- build : 정의된 도커파일에서 이미지 빌드하고 서비스 컨테이너 생성
- environment : 컨테이너에 적용할 환경변수 설정 (run 명령어의 --env, -e 옵션과 동일)
- command : 컨테이너가 실행될 때 수행할 명령어 (run 명령어의 서브 command에 적용하는 것과 동일)
- depends_on : 컨테이너 간의 의존성 주입. 여기에 적힌 컨테이너가 먼저 생성되야한다.
- ports : 개방할 포트 지정 (run 명령어의 -p 와 동일)
- expose : 링크로 연계된 컨테이너에게만 공개할 포트 설정
- volumes : 컨테이너에 볼륨 마운트
- restart : 컨테이너가 종료될 때 재시작 정책
- no : 재시작 되지 않음
- always : 외부에 영향에 의해 종료 되었을 때 항상 재시작 (수동으로 끄기 전까지 항상 재시작)
- on-failure : 오류가 있을 시 재시작
📢 참고
- yaml 파일은 2칸씩 들여쓰기(indent) 해야함
2️⃣ 도커 컴포즈로 컨테이너 실행할 수 있나요?
1) 도커 컴포즈가 사용할 서비스 디렉토리 생성
webserver 디렉토리를 생성하고(mkdir = make directory), webserver 로 이동 (cd = change directory)
mkdir webserver
cd webserver
2) docker-compose.yml 생성
도커컴포즈 yml(=yaml)파일 생성
cat > docker-compose.yml
그 안에 아래 처럼 작성 (*yaml 파일은 2인덴트(들여쓰기) 기준!!)
version: '3'
services:
web:
image: httpd:latest
ports:
- "80:80"
links:
- mysql:db
command: apachectl -DFOREGROUND
mysql:
imge: mysql:latest
command: mysqld
environment:
MYSQL_ROOT_PASSWORD: pass
3) docker-compose 명령어
# start : 시작, up : 생성 및 실행 , d 옵션 : detach모드 즉, 백그라운드 실행
docker compose up [-d]
# 지금 위치한 디렉토리 대상 도커컴포즈 파일 기준으로 프로세스 목록 조회
docker compose ps
# 개수 설정
docker compose scale mysql=2
# stop : 중지, down : =rm, 중지 및 삭제
docker compose down
명령어 | 설명 |
up | 컨테이너 생성/시작 |
ps | 컨테이너 목록 표시 |
logs | 컨테이너 로그 출력 |
run | 컨테이너 실행 |
start | 컨테이너 시작 |
stop | 컨테이너 정지 |
restart | 컨테이너 재시작 |
pause | 컨테이너 일시 정지 |
unpause | 컨테이너 재개 |
port | 공개 포트 번호 표시 |
config | 구성 확인 (yaml 파일 문법 체크 |
kill | 실행 중인 컨테이너 강제 정지 |
rm | 컨테이너 삭제 |
down | 리소스 삭제 |
-f | 다른 폴더에 있는 yaml파일을 실행하고 싶을 때 사용하는 옵션 |
scale 서비스이름=개수 | 해당 서비스 개수를 설정 |
📍10-2. 빌드에서 운영까지 : 실습
0️⃣ 도커 컴포즈 플러그인 설치
sudo apt-get update
sudo apt-get install docker-compose-plugin
여기 실습 부분은 도커에서 제공하는 자료와 함께 실습
1️⃣ 서비스 디렉토리 생성 및 파일 생성
서비스 디렉토리 생성
mkdir composetest
cd composetest
실습용 예시 파일 app.py
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)
실습용 파일 requirements.txt
2️⃣ 빌드를 위한 dockerfile 생성
파일 생성
cat > Dockerfile
파일 작성
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"]
# 다음줄에서 crtl+c하면 저장 및 종료
파일 조회
# > 리다이렉션이 들어가면 덮어쓰기가 되므로 빼주면 조회가능
cat Dockerfile
명령어 분석
명령어 | 설명 |
FROM python:3.7-alpine | python:3.7-alpine 이미지를 베이스로 사용 |
WORKDIR /code | 작업 디렉토리는 현재위치의 code라는 폴더를 사용 |
ENV FLASK_APP=app.py | 환경변수 FLASK_APP 에 app.py할당 |
ENV FLASK_RUN_HOST=0.0.0.0 | 환경변수 FLASK_RUN_HOST에 0.0.0.0 할당 |
RUN apk add --no-cache gcc musl-dev linux-headers | |
COPY requirements.txt requirements.txt | 호스트의 requirements.txt 파일을 컨테이너 작업 디렉토리인 code 에 복사 |
RUN pip install -r requirements.txt | requirements.txt 내부 요소를 읽어 pip 인스톨을 진행 |
EXPOSE 5000 | 5000포트를 개방 |
COPY . . | 현재 . 디렉토리를 컨테이너의 . 디렉토리로 모두 복사 |
CMD ["flask","run"] | 복사한 코드를 flask로 실행하는 명령어 |
3️⃣ docker-compose.yml 생성
docker-compose.yml 생성
cat > docker-compose.yml
내용 작성
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
4️⃣ docker-compose 명령어
컴포즈를 실행 (** 컴포즈 파일명이 docker-compose.yml 아니라면 -f 옵션을 통해 파일 이름을 정확하게 적어야함)
docker compose up
5️⃣ docker-compose 확인
# 현재 컴포즈파일로 인해 실행된 프로세스 목록 조회
docker compose ps
6️⃣기존 docker-compose를 중간에 수정하려면
일단 기존 컨테이너들을 중지하고 삭제
docker compose down
비쥬얼 에디터로 compose 파일 수정
컨테이너에 있는 파일을 호스트랑 볼륨마운트해서 호스트에서 수정해보기 위한 볼륨 마운트
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
수정하고 다시 up
그리고 호스트의 디렉토리에 마운트했으니 호스트의 app.py를 바로 수정해서 적용되는 지를 확인해보자
7️⃣ 개수를 조절해보자
# 현재 scale 명령어는 비활성화 되었고
docker compose scale redis=3
# up의 옵션으로 사용해야한다
docker compose up --scale redis=3
이 명령어를 통해 그때그때 사용자의 수에 따라 scale out, scale in을 해줄 수 있다.
📢 다만, 포트포워딩된 경우는 정해진 포트를 쓰기 때문에 확장이 불가능, 다른 포트 사용해야함
8️⃣ 추가 명령어
- run을 이용하면 서브 명령어 전달 가능
아래는 web 컨테이너에 env 명령어로 환경변수 보여달라는 의미
# docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]
docker compose run web env
- 해당 컨테이너 로그 보기
docker compose logs web
9️⃣ 종료 및 삭제
# 종료
docker compose stop
# 종료 및 삭제
docker compose down
# --volumes 옵션까지 넣으면 컴포즈로 인해 생성된 볼륨까지도 모두 삭제
docker compose down --volumes
🔟 또 다른 예시
워드프레스랑 mysql이랑 연동해보는 예시
1) 서비스 디렉토리 생성
2) docker-compose.yml 생성
3) compose 실행 확인
'DevOps > Docker' 카테고리의 다른 글
따배도 도커 시리즈 9] 컨테이너간 통신(네트워크) (0) | 2023.04.23 |
---|---|
따배도 도커 시리즈 8] Docker Container Storage (0) | 2023.04.21 |
따배도 도커 시리즈 7] 컨테이너 관리 (0) | 2023.04.15 |
따배도 도커 시리즈 6] 컨테이너 사용하기 (0) | 2023.04.14 |
따배도 도커 시리즈 5] 컨테이너 보관창고 Registry (0) | 2023.04.13 |