개발/DevOps

Docker 빌드에서 운영까지 (using docker compose)

달리초이 2022. 12. 30. 09:55


[목차]

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/django/README.md

워드프레스 : https://github.com/docker/awesome-compose/blob/master/official-documentation-samples/wordpress/README.md

레일스 : https://github.com/docker/awesome-compose/blob/master/official-documentation-samples/rails/README.md

 

- 볼륨 사용했을 때 이름만 쓰면 /var/lib/docker/volumes/ 디렉토리 안에 생성됨

 

 

 

 

- 출처: 따배도

10-1. 빌드에서 운영까지 (using Docker Compose) - 이론편

https://youtu.be/AYRVKB1L0Ak

10-2. 빌드에서 운영까지 (using Docker Compose) - 실습편

https://youtu.be/f8yLLWaXtCM

728x90
반응형

'개발 > 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