Image
Docker에서 Image란 컨테이너를 만드는 템플릿 같은 것이다. 이미지로 만들고 싶은 프로젝트의 내용이나 설정 정보와 같은 것을 포함하여 만들어낼 수 있다. 주로 코드나 라이브러리, 환경 변수 등을 포함한다.
Image는 여러 Layer로 구성되어 있다. 해당 레이어들은 Dockerfile에 작성되어 있는 내용으로, 한 명령어마다 하나의 레이어가 생성된다. 그래서 이미지를 만들 때 콘솔 로그를 살펴보면 각 레이어마다 작업이 처리되는 것을 볼 수 있다.
# 베이스 이미지 설정
FROM ubuntu:18.04
# 메타데이터 추가 (작성자 정보)
LABEL maintainer="example@example.com"
# 패키지 업데이트 및 필요한 패키지 설치
RUN apt-get update && apt-get install -y \
software-properties-common \
python3.7 \
python3-pip
# 작업 디렉토리 설정
WORKDIR /app
# 호스트 OS의 파일을 Docker 이미지에 복사
COPY . /app
# 외부 접근 가능한 포트 설정
EXPOSE 80
# 컨테이너 실행 명령
CMD ["python3", "app.py"]
위는 Dockerfile의 작성 예이다. 내용을 간단하게 살펴보자.
FROM
베이스로 삼을 이미지를 설정한다. Docker Hub에 있는 이미지나 로컬에 있는 이미지를 지정하면 된다. 로컬에 해당 이미지가 없으면 Docker Hub에서 다운로드 받아 사용한다. 기본적으로 사용할 해당 이미지 위에 자신의 프로젝트 파일들이 합쳐진다고 보면 된다.
LABEL
이미지에 대한 설명 정보 등을 지정한다.
RUN
패키지 목록을 업데이트하고 필요한 소프트웨어, 의존성 라이브러리 등을 설치하도록 한다.
WORKDIR
기본적으로 이미지 내에서 이루어지는 명령어 등의 작업이 이루어지는 경로를 의미한다. /app으로 설정했으면 해당 디렉토리 내에서 작업들이 실행된다.
COPY
자신의 프로젝트 파일을 이미지 내로 복사한다.
EXPOSE
이미지 내에서 어떤 포트를 노출시킬지 지정한다. 나중에 컨테이너로 만들어 실행할 때는 컨테이너의 포트와 로컬 컴퓨터의 포트를 매핑시켜줘야 정상적으로 작동한다.
CMD
컨테이너가 시작되면 실행시킬 명령어를 지정한다.
위의 명령어 하나가 하나의 레이어이다.
다음은 이미지를 빌드하는 방법을 알아보자.
docker build .
현재 위치에 Dockerfile이 있다는 것을 알리기 위해 현재 디렉토리를 나타내는 .를 지정하여 이미지를 빌드하는 명령어이다.

Docker Desktop으로 살펴보면 생성된 이미지가 어떤 것이 있는지 살펴볼 수 있다.
Image는 기본적으로 Read-Only이다. 한번 생성하면 동일한 Image는 읽어들이는 것밖에 하지 못한다는 것이다. 만약 코드의 내용을 변경하거나 프로젝트의 어떤 파일을 변경하는 등의 행위를 할 경우 Image는 이를 반영하지 못한다. 해당 변경 내용을 반영하려면 다시 Image를 만들어야 한다.
Container
Container는 Image를 통해 생성한 인스턴스이다. 각 Container는 가상 머신처럼 독립적으로 실행된다.
Container를 실행하려면 다음과 같은 명령어를 입력한다.
docker run -p 8080:80 7e0aa2d69a15
위 코드는 단순히 예시일 뿐이다.
호스트의 8080포트와 컨테이너의 80포트를 연결시키는 플래그를 추가하여 7e0aa2d69a15라는 id의 이미지를 이용해 컨테이너를 실행시킨다.
컨테이너는 이미지의 레이어들 위에 최종적으로 컨테이너의 레이어를 얹어서 동작한다. 이미지의 경우는 읽기 전용이었지만 컨테이너를 실행하면서 생시는 레이어는 읽기와 쓰기 모두 가능하다.
docker ps // 실행중인 컨테이너 리스트
docker ps -a // 모든 컨테이너 리스트

위의 명령어를 이용하면 실행중인 컨테이너와 모든 컨테이너 목록을 표시할 수 있다.

물론 Docker Desktop으로도 컨테이너의 정보들을 볼 수 있다.
'공부 > Docker' 카테고리의 다른 글
| [Docker] GCP에서 Docker 및 Docker-Compose 설치하기 (0) | 2024.05.17 |
|---|---|
| [Docker] EC2에서 Spring Cloud Config refused 에러 해결하기 (0) | 2024.05.14 |
| [Docker] Docker에 대해서 간단하게 알아보자 (0) | 2024.01.16 |