[Inception] 2. 도커 이미지와 Dockerfile

aqualung·2023년 2월 26일

1. Docker Image

도커 이미지란 컨테이너 실행에 필요한 모든 파일과 설정을 하나의 이미지로 만든 것이다. 즉, 더 이상의 의존성 파일을 컴파일하거나 설치할 필요가 없는 상태를 파일로 만들어 둔 것이다.

이미지는 변하지 않는 항상성을 유지할 수 있으며 Docker Hub를 통해 버전관리와 배포가 용이하다.

도커 이미지는 레이어라는 개념이 특징적이다. 이미지는 프로세스를 위해 필요한 모든 구성 요소가 포함되어 있기 때문에 용량이 클 수 밖에 없다. 기존 이미지에 파일 하나를 추가하는 경우 그 큰 용량을 다시 다운로드 받아야 한다면 매우 비효율적일 것이다. 이런 문제를 해결하여 보다 가볍게 파일시스템을 유지하기 위한 개념이 레이어이다.

ezgif com-webp-to-png

그림처럼 이미지는 여러 층의 레이어로 이루어져 있다. 기존 레이어를 재사용하면서 레이어를 추가하는 식으로 이미지를 빌드하기 때문에 효율적이다. 또한 다른 컨테이너에서 재사용 가능한 이미지가 있다면 사용할 수 있다.

2. Dockerfile

Dockerfile은 image를 생성하기 위한 파일이다.

이미지를 빌드하기 위해 차례대로 명령어를 실행하는 일종의 스크립트이다. 자주 쓰이는 명령어만 소개하겠다.

# 베이스 이미지
FROM alpine:3.15

# 새로운 레이어가 생성되며 실행되는 명령
RUN	apk update && \ 
	apk add --no-cache dumb-init

# 호스트의 ./run.sh파일을 컨테이너의 /scripts/run.sh로 복사
COPY ./run.sh /scripts/run.sh


# 시작 시 반드시 실행할 명령어
ENTRYPOINT ["/usr/bin/dumb-init", "--"]

# 도커 실행 옵션으로 수정이 가능한 명령어
CMD ["sh", "/scripts/run.sh"]
  • FROM: 빌드하고자 하는 이미지의 기반이 되는 base image

  • RUN: 명령어를 실행한다. RUN 명령어는 새로운 레이어에서 실행된다.

  • COPY: Host의 파일을 이미지에 복사한다.

  • ENTRYPOINT: 컨테이너 시작 시 '반드시' 실행되는 명령어

  • CMD: ENTRYPOINT와 마찬가지로 컨테이너가 시작할 때 실행되지만 도커 실행옵션에 다른 명령어를 입력한다면 무시될 수 있다.

3. docker-compose.yml

단일 명령으로 여러 컨테이너를 한번에 실행할 수 있다. Network와 Volume 등 컨테이너 간에 연결이나 공유에 대해 보다 간편하게 설정할 수 있다.

docker-compose.yml에 대한 내용은 너무 방대하여 해당 문서를 참조하자.

.env

docker-compose.yml과 동일한 디렉토리에 .env파일을 작성하여 변수를 각 컨테이너에 넘겨줄 수 있다.

# .env

MYSQL_ROOT_PASSWORD=2582
MYSQL_DATABASE=wordpress_db
MYSQL_USER=seunchoi
MYSQL_USER_PASSWORD=5150
MYSQL_HOST=mariadb
# docker-compose.yml

	...

services:
  mariadb:
  
    ...
  
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_USER_PASSWORD=${MYSQL_USER_PASSWORD}

	...

0개의 댓글