백엔드 TIL

[Docker] 도커란? 도커파일(Docker File) 개념과 작성법

bum0w0 2024. 7. 30. 01:49

 

 

 

Docker

도커란 소프트웨어를 컨테이너로 패키징하여 배포하고 실행하는 플랫폼이다.

어플리케이션을 개발한 후 실행할 때 필요한 환경들을 패키징 하여 별 다른 설치 없이 한번에 실행시켜주도록 하는 것을 컨테이너화 한다고 한다. 이런 방식으로 우리는 애플리케이션을 배포할 때 발생하는 Environment Disparity(개발 환경이 맞지 않는 상태) 문제를 해결할 수 있다.

 

도커 사용 과정 요약

Docker를 사용하면 개발 환경을 표준화하고 배포할 수 있습니다. 먼저, 개발 컴퓨터와 서버에 Docker를 설치합니다. 이후, 필요한 환경을 설정하는 Dockerfile을 작성하여, 소프트웨어와 라이브러리의 구성을 정의합니다. 이 Dockerfile을 기반으로 Docker 이미지를 생성한 후, 컨테이너를 실행하여 독립적이고 일관된 실행 환경을 제공합니다. 코드와 Dockerfile을 서버에 업로드하면, 동일한 환경에서 코드가 실행되며, Docker Hub를 통해 이미지를 저장하고 공유할 수도 있습니다. 이 과정으로 인해 개발 환경과 운영 환경 간의 일관성을 유지하고, 환경 불일치 문제를 예방할 수 있습니다.

 

 

Docker File

Dockerfile은 애플리케이션을 위한 환경을 정의하는 설정 파일이다. Docker 이미지를 생성하기 위한 명령어들을 포함하는데, 여기에는  설치할 소프트웨어, 설정할 환경 변수, 실행할 명령어 등이 포함된다. Docker가 이 파일을 기반으로 필요한 종속성을 다운로드하고, 애플리케이션을 빌드하여 일관된 실행 환경을 제공하는 컨테이너를 생성하게 된다.

 

도커 파일은 확장자 명 없이 파일 이름을 Dockerfile로 지으면 된다.

 

Docker File 작성법

Docker File은 레이어 개념으로 실행된다. (build 시 파일에 적힌 명령어 순서대로 제작됨) 따라서 레이어 순서대로 작성하자.

 

주요 명령어

1. FROM - Docker 이미지를 생성하기 위한 베이스 이미지를 지정합니다.
2. RUN - 이미지 빌드 중에 명령어를 실행하여, 패키지 설치, 파일 생성 등 필요한 작업을 수행합니다.
3. CMD - 컨테이너가 시작될 때 기본적으로 실행할 명령어를 지정합니다.
4. ENTRYPOINT - 컨테이너가 실행될 때 항상 실행할 명령어를 설정합니다. CMD와 함께 사용되어 명령어의 인수를 설정할 수 있습니다.
5. COPY - 호스트의 파일이나 디렉토리를 컨테이너의 파일 시스템으로 복사합니다.
6. ADD - COPY와 유사하지만, URL로부터 파일을 다운로드하거나, 압축 파일을 자동으로 추출할 수 있습니다.
7. VOLUME - 컨테이너의 디렉토리를 데이터 볼륨으로 설정하여, 데이터를 컨테이너 외부와 공유할 수 있습니다.
8. EXPOSE - 컨테이너가 사용할 포트를 명시합니다. 포트 매핑은 docker run 명령어에서 수행됩니다.
9. ENV - 컨테이너의 환경 변수를 설정합니다. 애플리케이션 실행 시 사용할 수 있습니다.
10. WORKDIR - 이후 명령어들이 실행될 디렉토리를 설정합니다. RUN, CMD, ENTRYPOINT 명령어는 이 디렉토리 내에서 실행됩니다.
11. USER - 명령어를 실행할 사용자를 설정합니다.
12. ARG - Dockerfile의 빌드 시점에서 사용할 수 있는 변수를 설정합니다. 컨테이너 실행 시에는 사용되지 않습니다.
13. LABEL - 이미지에 메타데이터를 추가합니다. 유지보수자 정보나 버전 정보 등을 명시할 수 있습니다.

 

 

 

Docker File 빌드

docker build -t ${원하는 이미지 이름}

 

예시 ( . : 현재 디렉토리에 있는 Dockerfile을 사용한다. 다른 경로를 사용할 경우 경로를 지정)

docker build -t my-app:latest .

생성한 이미지 기반으로 컨테이너 실행

docker run -d -p 8080:8080 --name my-webservice my-app:latest

my-app:latest: 사용하려는 Docker 이미지의 이름과 태그를 지정. 이 이미지는 my-app이라는 이름을 가지고 있으며, latest라는 태그가 붙어 있다.

--name my-webservice: 컨테이너에 my-webservice라는 이름을 지정

-p 8080:8080: 호스트와 컨테이너 간의 포트 매핑을 설정

-d: 컨테이너를 백그라운드에서 실행