웹 서비스는 프론트엔드 서버, 백엔드 서버, 데이터 베이스 서버 등으로 이루어져있는데 각각을 docker 컨테이너로 작성하고, 연결하여 동작한다.
따라서 여러 컨테이너를 모아서 관리하기 위한 툴인 Docker Compose가 필요하다.
Docker Compose는 docker-compose.yml 파일을 작성하여 실행할 수 있다.
version
Docker Compose 파일 포맷 버전을 지정 (기본적으로는 버전 3을 사용)
version: "3"
services
각각의 컨테이너를 정의하는 명령
- image
{컨테이너이름} 컨테이너를 작성할 때, Docker Hub에 있는 이미지를 사용할 경우 image를 설정
services:
{컨테이너이름}:
image: mysql:5.6
- restart
컨테이너가 다운되었을 경우, 재시작 할 수 있도록 하는 설정
services:
{컨테이너이름}:
image: mysql:5.6
restart: always
- volumes
(데이터를 컨테이너에 저장하는 것이 아니라 호스트에 저장하는 방식 - 컨테이너 재실행 시 데이터가 초기화 되는 것을 방지)
docker run 옵션 중, -v 옵션과 동일한 역할
여러 volume을 지정할 수 있기 때문에 리스트처럼 작성하면 됨
services:
{컨테이너이름}:
image: mysql
restart: always
volumes:
- ./mysql_mine:/var/lib/mysql #{호스트의 공유 디렉토리}:{컨테이너의 공유 디렉토리}
- environment
Dockerfile의 ENV 옵션과 동일한 역할
services:
{컨테이너이름}:
image: mysql:5.6
restart: always
volumes: always
- ./mysql_mine:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=pilldb
- env_file
환경변수 값이 들어있는 파일을 읽도록 설정
services:
{컨테이너이름}:
image: mysql
restart: always
volumes:
- ./mysql_mine:/var/lib/mysql
env_file:
- ./mysql.env
- ports
docker run의 -p 옵션과 동일
services:
{컨테이너이름}:
image: mysql
restart: always
volumes:
- ./mysql_mine:/var/lib/mysql
env_file:
- ./mysql.env
ports:
- "3306:3306"
Docker Compose 실행/중지/삭제
version: "3"
services:
db:
image: mysql:5.7
restart: always
volumes:
- ./mysql_mine:/var/lib/mysql
env_file:
- ./mysql.env
ports:
- "3306:3306"
Docker Compose 실행
docker-compose up -d
이미지 재빌드를 해야할 경우는 --build 옵션을 추가하지 않으면 이미 작성된 이미지를 사용함
docker-compose up --build -d
Docker Compose 중지
docker-compose stop
docker-compose up 으로 생성된 컨테이너 삭제
docker-compose down
기존 docker-compose.yml에 컨테이너를 추가
docker-compose.yml
version: "3"
services:
app:
build:
context: ./FLASK_DOCKER
dockerfile: Dockerfile
links:
- "db:mysqldb"
ports:
- "80:8080"
container_name: appcontainer
depends_on:
- db
db:
image: mysql:5.7
restart: always
volumes:
- ./mysql_mine:/var/lib/mysql
env_file:
- ./mysql.env
ports:
- "3306:3306"
- build
이미지를 Dockerfile을 기반으로 작성 시 사용
- context: Dockerfile이 있는 디렉토리
- dockerfile: Dockerfile 명
- links
컨테이너 내부에서 다른 컨테이너를 사용하고 싶을 때 사용
ex) db 컨테이너를 app 컨테이너 안에서 사용할 때 "db:mysqldb" mysqldb라는 이름으로 사용하겠다는 명령어
그냥 db만 적을 경우 db라는 이름으로 사용가능
- container_name
컨테이너 이름 설정
- depends_on
해당 컨테이너가 생성되기 전에 먼저 생성되어야 할 컨테이너 명을 작성
.dockerignore
flask Dockerfile 작성시 COPY ./ /app 구문은 현재 폴더에 있는 모든 파일을 컨테이너의 /app 폴더에 복사하게 된다.COPY 시 특정 파일/폴더는 제외하도록 .dockerignore 파일을 사용할 수 있다.(git의 .gitignore처럼)
더보기
/FLASK_DOCKER/Dockerfile
FROM continuumio/miniconda
COPY ./ /app
WORKDIR /app
RUN pip install flask pymysql cryptography
CMD ["python", "main.py"]
/FLASK_DOCKER/main.py
from flask import Flask
import pymysql
app = Flask(__name__)
MYSQL_HOST = 'mysqldb'
MYSQL_PORT = 3306
def conn_mysqldb():
MYSQL_CONN = pymysql.connect(
host=MYSQL_HOST,
port=MYSQL_PORT,
user='root',
passwd='1234',
db='byeol',
charset='utf8'
)
return MYSQL_CONN
@app.route('/')
def hello_world():
mysql_db = conn_mysqldb()
db_cursor = mysql_db.cursor()
sql = "SHOW TABLES"
db_cursor.execute(sql)
user = db_cursor.fetchone()
print (user, MYSQL_HOST)