개발하는 자몽

[Docker] image, container, Dockerfile, docker compose, 본문

Architecture & Tool/Docker

[Docker] image, container, Dockerfile, docker compose,

jaamong 2024. 2. 3. 09:13

Docker image, container

image

이미지는 도커 컨테이너 생성에 관한 명령이 담긴 템플릿(read-only)입니다.

애플리케이션을 실행하는데 필요한 소스 코드, 런타임 환경, 시스템 라이브러리 등 모든 설정들이 포함되어 있습니다.

https://docs.docker.com/get-started/overview/#images

container

도커 컨테이너는 이미지의 실행 가능한 인스턴스로, 도커 이미지를 기반으로 코드를 위해 격리된 공간을 의미합니다.

https://docs.docker.com/guides/walkthroughs/what-is-a-container/
https://docs.docker.com/get-started/overview/#containers

image와 container의 관계

이미지는 `class`, 컨테이너는 `instance`와 비슷합니다. 실제로 이미지를 상속받아서 새로운 이미지를 만들 수 있으며, 이미지로 컨테이너를 생성할 수 있습니다.

 

 

Dockerfile

Dockerfile은 이미지를 어떻게 만들어야 하는지 알려주는 설계서 같은 것입니다. 프로젝트를 실행하는 데 있어서 필요한 환경이나 라이브러리 등을 작성하게 됩니다.

https://docs.docker.com/engine/reference/builder/ 

 

 

🔹FROM

하나의 Docker 이미지는 base 이미지부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩하여 여러 단계의 이미지 층(layer)을 쌓아가며 만들어집니다.

`FROM` 명령문은 이 base 이미지를 지정해 주기 위해서 사용되는데, 보통 Dockerfile 내에서 최상단에 위치합니다. base 이미지는 일반적으로 Docker Hub와 같은 Docker repository에 올려놓은 잘 알려진 공개 이미지인 경우가 많습니다.

FROM ubuntu:latest  # Ubuntu 최신 버전을 base 이미지로 사용

 

 

🔹RUN

`RUN` 명령문은 마치 쉘(shell)에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용됩니다. 쉘(shell)을 통해 거의 못하는 작업이 없는 것처럼 `RUN` 명령문으로 할 수 있는 작업은 무궁무진하지만, 보통 이미지 안에 특정 소프트웨어를 설치하기 위해서 많이 사용됩니다.

RUN pip install -r requirements.txt  # pip 패키지 설치

 

 

🔹WORKDIR

`WORKDIR` 명령문은 쉘(shell)의 `cd` 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환하기 위해서 사용됩니다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든  `RUN`, `CMD`, `ENTRYPOINT`, `COPY`, `ADD` 명령문은 해당 디렉터리를 기준으로 실행됩니다.

WORKDIR /usr/app  # /usr/app으로 작업 디렉터리 전환

 

 

🔹EXPOSE

`EXPOSE`는 컨테이너가 실행 시 특정 포트를 listen 하고 있음을 Docker에게 알려주는 명령어입니다. 도커 컨테이너의 포트를 외부로 노출시켜 호스트 머신과 연결하기 위해서 사용합니다.

EXPOSE <port> [<port>/<protocol>...]

# tcp 사용 경우
EXPOSE 80/tcp

 

 

🔹CMD

`CMD`는 컨테이너가 시작될 때 기본적으로 실행할 명령어를 지정하기 위해 사용합니다.

# CMD in Dockerfile
CMD ["executable","param1","param2"]  # 권장 방식
CMD ["param1","param2"]  # ENTRYPOINT가 사용될 때 의미있음
CMD command param1 param2  # shell form, docker 생명주기와 관련하여 좋지 않으므로 비권장
# command in shall
$ docker run <이미지> <CMD>

`CMD` 명령어는 shell에서 컨테이너를 `run`으로 실행할 때 인자가 있으면 해당 인자로 대체되어 실행됩니다. 이러한 사실은 `docker inspect` 명령어의 `CMD` 부분을 보면 확인할 수 있습니다.

 

 

🔹ENTRYPOINT

`ENTRYPOINT`는 `CMD`와 마찬가지로 컨테이너 생성 시 실행되는 프로세스 옵션입니다.

ENTRYPOINT ["executable", "param1", "param2"]  # exec form, which is the preferred form
ENTRYPOINT command param1 param2  # shell form

`ENTRYPOINT`는 컨테이너 실행 시 반드시 실행됩니다. 또한 `ENTRYPOINT`가 설정되어 있을 때, shell에서 `run`으로 실행할 경우 에러가 발생합니다.

`CMD`와 함께 사용될 경우, `CMD`는 `ENTRYPOINT` 뒤에 argument로 사용됩니다. (2번 형태)

 

 

docker-compose.yml

Dockerfile과 docker-compose.yml 차이점

💡 Dockerfile은 이미지를 어셈블 하기 위해 호출할 수 있는 명령이 포함된 간단한 텍스트 파일입니다. Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다.

https://dockerlabs.collabnix.com/beginners/difference-compose-dockerfile.html

 

 

🔹Dockerfile

Dockerfile은 base image 파일로부터 수정된 image를 만드는 일련의 과정들을 정리한 파일이며, docker는 Dockerfile을 이용해 손쉽게 동일한 이미지를 반복적으로 생성할 수 있습니다.

 

 

🔹docker-compose.yml

Docker Compose는 애플리케이션을 구성하는 서비스를 docker-compose.yml에 정의하여 격리된 환경에서 함께 실행할 수 있습니다. docker-compose.yml에 빌드 명령을 추가하면 Docker Compose는 Dockerfile을 사용합니다.

 

 

 

 

 

참고

https://sean.tistory.com/311

https://velog.io/@s2moon98/dockerFile%EA%B3%BC-docker-compose.yml-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

https://asung123456.tistory.com/51

https://bluese05.tistory.com/77

https://www.daleseo.com/dockerfile/

Comments