Docker는 애플리케이션을 독립적인 환경에서 실행할 수 있게 해주는 도구입니다.
Docker를 사용할 때 중요한 파일이 바로 Dockerfile입니다.
이 파일은 Docker 이미지가 어떻게 구성될지를 정의합니다. Dockerfile에는 다양한 명령어와 옵션이 있으며, 이를 통해 이미지의 설정과 구성을 지정할 수 있습니다.
이 블로그에서는 Dockerfile의 주요 명령어와 각 명령어의 옵션을 초급자도 쉽게 이해할 수 있도록 설명하겠습니다.
1. Dockerfile 기본 구조
Dockerfile은 여러 명령어로 구성되며, 각 명령어는 이미지의 특정 부분을 설정합니다.
가장 기본적인 명령어는 FROM, RUN, COPY, ADD, CMD, ENTRYPOINT, EXPOSE 등이 있습니다.
각 명령어는 다양한 옵션을 지원하여 더욱 세밀한 설정이 가능합니다.
2. 주요 Dockerfile 명령어와 옵션
2.1 FROM
FROM 명령어는 Docker 이미지의 베이스가 되는 이미지를 지정합니다. 모든 Dockerfile의 시작은 FROM 명령어로 시작해야 합니다.
FROM <이미지>:<태그>
- <이미지>: 사용할 베이스 이미지의 이름입니다. 예를 들어, node는 Node.js가 설치된 이미지를 의미합니다.
- <태그>: 이미지의 버전입니다. 예를 들어, 14는 Node.js 14 버전을 의미합니다. 기본값은 latest입니다.
예제
FROM ubuntu:20.04
- ubuntu:20.04: Ubuntu 20.04 버전을 베이스 이미지로 사용합니다.
2.2 RUN
RUN 명령어는 컨테이너 내부에서 명령어를 실행합니다. 주로 소프트웨어를 설치하거나 패키지를 업데이트할 때 사용됩니다.
RUN <명령어> [<옵션>]
- <명령어>: 컨테이너에서 실행할 명령어입니다.
- [<옵션>]: 명령어에 추가할 옵션입니다.
예제
RUN apt-get update && apt-get install -y nginx
- apt-get update: 패키지 목록을 업데이트합니다.
- apt-get install -y nginx: nginx를 설치합니다. -y 옵션은 설치 확인을 자동으로 진행합니다.
2.3 COPY
COPY 명령어는 호스트 시스템의 파일이나 디렉터리를 컨테이너의 파일 시스템으로 복사합니다.
COPY <소스> <대상>
- <소스>: 호스트 시스템에서 복사할 파일이나 디렉터리입니다.
- <대상>: 컨테이너 내부의 복사 위치입니다.
예제
COPY index.html /usr/share/nginx/html/
- index.html: 호스트의 index.html 파일을 컨테이너의 /usr/share/nginx/html/ 디렉터리로 복사합니다.
2.4 ADD
ADD 명령어는 COPY와 유사하지만, 압축 파일을 자동으로 풀거나 URL에서 파일을 다운로드할 수 있습니다.
ADD <소스> <대상>
- <소스>: 호스트 시스템에서 추가할 파일, 디렉터리 또는 URL입니다.
- <대상>: 컨테이너 내부의 추가 위치입니다.
예제
ADD https://example.com/app.tar.gz /app/
- https://example.com/app.tar.gz: URL에서 파일을 다운로드하여 /app/ 디렉터리에 추가합니다.
2.5 CMD
CMD 명령어는 컨테이너가 실행될 때 기본으로 실행될 명령어를 설정합니다. CMD는 하나만 사용할 수 있으며, ENTRYPOINT와 함께 사용될 수 있습니다.
CMD ["<명령어>", "<옵션>"]
- <명령어>: 컨테이너가 시작될 때 실행할 명령어입니다.
- <옵션>: 명령어에 추가할 옵션입니다.
예제
CMD ["nginx", "-g", "daemon off;"]
- nginx -g 'daemon off;': Nginx를 포그라운드 모드로 실행하여 컨테이너가 종료되지 않게 합니다.
2.6 ENTRYPOINT
ENTRYPOINT 명령어는 컨테이너가 시작될 때 항상 실행되는 명령어를 설정합니다.
CMD와 함께 사용하면 CMD에서 지정한 인수가 ENTRYPOINT 명령어에 전달됩니다.
ENTRYPOINT ["<명령어>"]
- <명령어>: 컨테이너가 시작될 때 실행할 명령어입니다.
예제
ENTRYPOINT ["python"]
CMD ["app.py"]
- python app.py: python 명령어로 app.py를 실행합니다. CMD에서 지정한 app.py가 ENTRYPOINT의 python 명령어에 전달됩니다.
2.7 EXPOSE
EXPOSE 명령어는 컨테이너가 수신할 포트를 정의합니다. 실제로 포트를 열어주는 것은 Docker 실행 시 옵션으로 설정합니다.
EXPOSE <포트>
- <포트>: 컨테이너가 사용할 포트 번호입니다.
예제
EXPOSE 80
- 80: 컨테이너가 80번 포트를 사용하도록 설정합니다.
3. 간단한 Dockerfile 예제
다음은 간단한 웹 서버를 위한 Dockerfile 예제입니다.
# 1. 베이스 이미지로 Ubuntu를 사용합니다.
FROM ubuntu:20.04
# 2. 패키지 업데이트 및 Nginx 설치
RUN apt-get update && apt-get install -y nginx
# 3. 호스트의 index.html 파일을 컨테이너에 복사
COPY index.html /usr/share/nginx/html/
# 4. Nginx 서버를 포그라운드 모드로 실행
CMD ["nginx", "-g", "daemon off;"]
# 5. 컨테이너의 80번 포트 노출
EXPOSE 80
- FROM ubuntu:20.04: Ubuntu 20.04 버전을 베이스로 합니다.
- RUN apt-get update && apt-get install -y nginx: nginx를 설치합니다.
- COPY index.html /usr/share/nginx/html/: index.html 파일을 복사합니다.
- CMD ["nginx", "-g", "daemon off;"]: Nginx를 포그라운드 모드로 실행합니다.
- EXPOSE 80: 80번 포트를 노출합니다.
4. Docker 이미지 빌드 및 실행
작성한 Dockerfile을 기반으로 Docker 이미지를 빌드하려면 다음 명령어를 사용합니다.
docker build -t my-web-server .
- -t my-web-server: 빌드된 이미지에 my-web-server라는 태그를 붙입니다.
빌드한 이미지를 실행하려면 다음 명령어를 사용합니다.
docker run -p 8080:80 my-web-server
- -p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다.
Dockerfile은 Docker 이미지를 만들기 위한 중요한 파일로, 다양한 명령어와 옵션을 통해 이미지의 구성과 설정을 정의할 수 있습니다.
FROM, RUN, COPY, ADD, CMD, ENTRYPOINT, EXPOSE 명령어와 그 옵션들을 이해하면 Docker 이미지를 효과적으로 관리하고 배포할 수 있습니다.
이 블로그가 Dockerfile을 작성하는 데 도움이 되었기를 바랍니다.
추가적인 질문이나 도움이 필요하시면 언제든지 말씀해 주세요!
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Docker' 카테고리의 다른 글
Docker Compose를 사용한 멀티 컨테이너 애플리케이션 관리 / Docker Compose란? 멀티 컨테이너 환경에서의 역할 (0) | 2024.09.12 |
---|---|
Docker Dockerfile 작성 및 이미지 빌드 / 이미지 빌드: docker build 명령어 사용법 (3) | 2024.09.11 |
Docker Dockerfile 작성 및 이미지 빌드 / Dockerfile의 역할: 이미지를 정의하는 파일 (0) | 2024.09.11 |
Docker 이미지와 컨테이너/ 명령어 사용법: docker run, docker ps, docker stop, docker rm (2) | 2024.09.10 |
Docker 이미지와 컨테이너/ Docker 컨테이너 개념부터 실행 및 관리 (1) | 2024.09.10 |