
지난 포스팅 [Docker]선택이 아닌 필수 에서 Docker가 무엇이고, 왜 사용하는지, 이미지가 무엇인지를 알아보았는데요.
이번에는 이 이미지를 어떻게 만드는지 그리고 여러개의 컨테이너를 어떻게 한번에 관리하는지에 대해 알아보겠습니다.
여기서 이미지를 만들기 위한 설정 파일이 바로 Dockerfile입니다.
# Dockerfile
FROM ubuntu:latest
MAINTAINER MyName <my-email@example.com>
# Nginx 설치
RUN apt-get update && apt-get install -y nginx
# 파일 복사
COPY index.html /usr/share/nginx/html
# 80번 포트 개방
EXPOSE 80
# Nginx 실행
CMD ["nginx", "-g", "daemon off;"]
예시처럼 FROM, RUN, COPY, WORKDIR, ENV, EXPOSE, CMD 등의 예약어를 사용하여 이미지 생성 과정을 정의합니다. 각 명령어의 역할은 다음과 같습니다.
이렇게 작성된 Dockerfile은 docker build 명령어를 통해 하나의 이미지로 탄생하게 됩니다.
ex) docker build -t my-image:latest .
생성된 이미지는 컨테이너로 실행하거나 레지스트리에 저장할 수 있습니다.
기본 명령어는 이것인데 옵션들을 알면 더 편리하게 컨테이너를 관리 할 수 있어요!
웹 서비스를 개발하다 보면 단순히 웹 서버 하나만 띄우는 경우는 드뭅니다. Web Server, API Server, Database, Redis 등 여러 개의 컨테이너가 유기적으로 연결되어야 합니다.
이걸 하나하나 docker run 명령어로 실행하는 방법보다는 하나의 파일로 여러개의 컨테이너를 한번에 관리할 수 있는 방법이 있다면 간단할 것입니다. 그것이 바로 Docker Compose입니다.
Docker Compose를 사용하면 명령어 하나로 모든 컨테이너 서비스를 실행하고 정리할 수 있습니다. 또한 Compose로 같은 네트워크에 속해 컨테이너끼리의 통신이 쉽습니다.
docker-compose.yml
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- api # api 컨테이너가 켜진 후 실행됨
api:
image: my-backend-image
environment:
- DB_HOST=db
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=secret
yaml 파일에서는 들여쓰기를 주의해야 합니다!
이렇게 파일을 생성한 후 주요 명령어로 컨테이너들을 한번에 관리 할 수 있습니다.
docker compose up -d
작성한 yaml 파일을 읽어 모든 컨테이너를 생성하고 실행합니다.
-d 옵션은 백그라운드 실행을 의미합니다.
docker compose down
docker compose ps
docker compose logs -f