새소식

Docker

🐙Docker Compose

  • -

웹 서비스는 프론트엔드 서버, 백엔드 서버, 데이터 베이스 서버 등으로 이루어져있는데 각각을 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)

 

728x90

'Docker' 카테고리의 다른 글

리눅스 Docker/Docker-compose 설치  (0) 2022.09.23
github로 Docker Image 공유  (0) 2022.09.05
Dockerfile  (0) 2022.09.05
Docker 명령어  (0) 2022.09.01
[🐳Docker] Flask App 띄우기  (0) 2022.07.08
Contents