도커 이미지란 컨테이너 실행에 필요한 모든 파일과 설정을 하나의 이미지로 만든 것이다. 즉, 더 이상의 의존성 파일을 컴파일하거나 설치할 필요가 없는 상태를 파일로 만들어 둔 것이다.
이미지는 변하지 않는 항상성을 유지할 수 있으며 Docker Hub를 통해 버전관리와 배포가 용이하다.
도커 이미지는 레이어라는 개념이 특징적이다. 이미지는 프로세스를 위해 필요한 모든 구성 요소가 포함되어 있기 때문에 용량이 클 수 밖에 없다. 기존 이미지에 파일 하나를 추가하는 경우 그 큰 용량을 다시 다운로드 받아야 한다면 매우 비효율적일 것이다. 이런 문제를 해결하여 보다 가볍게 파일시스템을 유지하기 위한 개념이 레이어이다.

그림처럼 이미지는 여러 층의 레이어로 이루어져 있다. 기존 레이어를 재사용하면서 레이어를 추가하는 식으로 이미지를 빌드하기 때문에 효율적이다. 또한 다른 컨테이너에서 재사용 가능한 이미지가 있다면 사용할 수 있다.
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와 마찬가지로 컨테이너가 시작할 때 실행되지만 도커 실행옵션에 다른 명령어를 입력한다면 무시될 수 있다.
단일 명령으로 여러 컨테이너를 한번에 실행할 수 있다. Network와 Volume 등 컨테이너 간에 연결이나 공유에 대해 보다 간편하게 설정할 수 있다.
docker-compose.yml에 대한 내용은 너무 방대하여 해당 문서를 참조하자.
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}
...