본문 바로가기

Docker

Docker Compose 구성해보기 [정리]

Docker Compose 구성해보기

  • DB(MySQL) 서버와 해당 DB의 유저 리스트를 조회하는 WebApp을 개발하여 Compose로 실행해본다.
  • DB 서버는 기존의 my-mysql 이미지를 사용한다.

API Server 컨테이너 만들기

프로그램 작성

db_controller.py

import json
from os import getenv

import pymysql

def get_data():
    conn = pymysql.connect(
        host=getenv("MYSQL_HOST"),
        port=int(getenv("MYSQL_PORT")),
        user=getenv("MYSQL_USER"),
        password=getenv("MYSQL_PASSWORD"),
        db="mysql",
        charset='utf8'
    )

    cursor = conn.cursor()

    sql = "SELECT user, host FROM user"
    cursor.execute(sql)

    rows = cursor.fetchall()

    conn.close()

    return json.dumps(rows)

main.py

import json

from fastapi import FastAPI

from db_controller import get_data

app = FastAPI()

@app.get("/")
async def user_info():
    result = get_data()
    return {"message": result}

Dockerfile 작성

Dockerfile

FROM python:3.10-buster

RUN pip install fastapi uvicorn PyMySQL cryptography

COPY ./main.py ./db_controller.py ./start-server.sh /opt

CMD ["./opt/start-server.sh"]

빌드

docker build -t api_server:0.0.1 .

컨테이너 실행

docker run -itd --name api-server \\
  -p 8080:8080 \\
  -e MYSQL_HOST=172.17.0.2 \\
  -e MYSQL_PORT=3306 \\
  -e MYSQL_USER=devinu \\
  -e MYSQL_PASSWORD=devinu \\
  api_server:0.0.1

Docker Compose 작성

yaml 편집을 위한 vim 설정

~/.vimrc

set autoindent expandtab tabstop=2 shiftwidth=2

Docker compose 파일 작성

docker-compose.yaml

services:
  db:
    image: my_mysql:0.0.1
    ports:
    - "3306:3306"
    volumes:
    - mysqldb:/var/lib/mysql
    environment:
    - MYSQL_USER=devinu
    - MYSQL_PASSWORD=devinu

  api-server:
    depends_on:
    - db
    image: api_server:0.0.1
    ports:
    - "8080:8080"
    environment:
    - MYSQL_HOST=db
    - MYSQL_PORT=3306
    - MYSQL_USER=devinu
    - MYSQL_PASSWORD=devinu
volumes:
  mysqldb: {}

Docker Compose 실행

포그라운드 실행

docker compose up

백그라운드 실행

docker compose up -d

<aside> 💡 compose 실행 시 기본적으로 커스텀 네트워크가 생성되어 Docker0 네트워크가 아닌 해당 네트워크에 컨테이너가 생성됨

</aside>

컨테이너 확인

docker compose ps

Docker Compose 중지

docker compose stop

Docker Compose 종료

모든 컨테이너 중지(stop) 후 삭제(rm) + 네트워크 삭제

docker compose down

<aside> 💡 의존 볼륨과 이미지는 삭제되지 않음

</aside>

모든 컨테이너 중지 후 삭제 + 네트워크 삭제 + 모든 볼륨 및 이미지 삭제

docker compose down --rmi local -v

'Docker' 카테고리의 다른 글

이미지 저장소 [정리]  (0) 2024.07.17
나만의 이미지 만들기 [정리]  (1) 2024.07.17
다양한 도커 이미지 실행해보기 [정리]  (0) 2024.07.17
볼륨 [정리]  (0) 2024.07.17
컨테이너 포트 포워딩 [정리]  (0) 2024.07.17