소개
Docker는 애플리케이션을 컨테이너로 패키징하고 배포하기 위한 강력한 도구입니다. 이 과정의 핵심은 Docker 이미지이며, 이는 코드, 종속성, 구성을 포함하여 애플리케이션을 실행하는 데 필요한 모든 것을 담고 있는 사전 빌드된 패키지입니다. 이번 실습에서는 추가 소프트웨어, 라이브러리 또는 구성을 통합하여 애플리케이션을 향상시키는 사용자 지정 Docker 이미지를 만드는 방법을 배웁니다.
이번 실습 전반에 걸쳐 파일 편집을 위해 WebIDE(VS Code)를 사용합니다. WebIDE는 파일 편집을 위한 친숙하고 사용자 친화적인 인터페이스를 제공하여 구성 파일 및 코드 작업을 더 쉽게 만들어 줍니다.
프로젝트 환경 설정
먼저 프로젝트 디렉토리를 생성하고 해당 디렉토리로 이동해 보겠습니다.
이번 실습 전반에 걸쳐 파일 편집을 위해 WebIDE(VS Code)를 사용합니다. WebIDE는 파일 편집을 위한 친숙하고 사용자 친화적인 인터페이스를 제공하여 구성 파일 및 코드 작업을 더 쉽게 만들어 줍니다.
- WebIDE에서 터미널을 엽니다. 상단 메뉴에서 "Terminal"을 클릭한 다음 "New Terminal"을 선택하면 됩니다.
- 터미널에서 다음 명령어를 실행합니다:
mkdir -p ~/project/docker
cd ~/project/docker

이 명령어는 ~/project 폴더 내에 docker라는 새 디렉토리를 생성하고 현재 작업 디렉토리를 해당 폴더로 변경합니다.
- 올바른 디렉토리에 있는지 확인합니다:
pwd
출력 결과로 /home/labex/project/docker가 표시되어야 합니다.
명령어 설명:
mkdir -p: 디렉토리를 생성하는 명령어입니다.-p플래그를 사용하면 상위 디렉토리가 존재하지 않을 경우 함께 생성할 수 있습니다.cd: 현재 디렉토리를 변경하는 명령어입니다.pwd: 현재 작업 디렉토리를 출력하는 명령어입니다.
간단한 Docker 이미지 생성
이제 Nginx 웹 서버를 실행하는 간단한 Docker 이미지를 만들어 보겠습니다.
- WebIDE에서 파일 탐색기(보통 왼쪽 사이드바의 첫 번째 아이콘)로 이동합니다.
- 파일 탐색기 창에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다. 이름을
Dockerfile로 지정합니다(대문자 'D'로 시작하며 파일 확장자는 없습니다). - 파일 탐색기에서
Dockerfile을 클릭하여 엽니다. 다음 내용을 추가합니다:
FROM nginx
COPY index.html /usr/share/nginx/html/
이 Dockerfile은 공식 Nginx 이미지를 기반으로 하는 새 이미지를 정의하며, index.html 파일을 Nginx의 기본 문서 루트 디렉토리로 복사합니다.
Dockerfile 설명:
FROM nginx: 빌드할 기반 이미지를 지정합니다. 여기서는 공식 Nginx 이미지를 사용합니다.COPY index.html /usr/share/nginx/html/:index.html파일을 컨테이너의 웹 루트 디렉토리로 복사합니다.
- 같은 디렉토리에
index.html이라는 새 파일을 생성합니다. 파일 탐색기 창에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택하면 됩니다. index.html을 열고 다음 내용을 추가합니다:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello Docker!</title>
</head>
<body>
<h1>Hello Docker!</h1>
<p>This is a custom Docker image.</p>
</body>
</html>
이것은 Nginx 서버에 의해 서비스될 간단한 HTML 페이지입니다.
- WebIDE에서 터미널을 열고(이전 터미널을 닫았다면 Terminal -> New Terminal) 다음 명령어를 사용하여 Docker 이미지를 빌드합니다:
docker build -t my-nginx .
이 명령어는 my-nginx라는 태그로 새 Docker 이미지를 빌드합니다.
명령어 설명:
docker build: Docker 이미지를 빌드하는 명령어입니다.-t my-nginx:-t플래그는 이미지에my-nginx라는 이름을 지정합니다..: 빌드 컨텍스트(Dockerfile이 포함된 디렉토리)를 현재 디렉토리로 지정합니다.
- 빌드가 완료되면 이미지가 성공적으로 생성되었는지 확인합니다:
docker images
출력 결과에 my-nginx 이미지가 표시되어야 합니다.
사용자 지정 이미지 실행 및 테스트
새 이미지를 기반으로 컨테이너를 실행하고 테스트해 보겠습니다.
- WebIDE 터미널에서 다음 명령어를 사용하여 컨테이너를 시작합니다:
docker run -d -p 8080:80 --name my-nginx-container my-nginx
명령어 설명:
docker run: 새 컨테이너를 생성하고 시작하는 명령어입니다.-d: 컨테이너를 분리 모드(백그라운드)로 실행합니다.-p 8080:80: 호스트의 8080 포트를 컨테이너의 80 포트에 매핑합니다.--name my-nginx-container: 컨테이너에 이름을 할당합니다.my-nginx: 컨테이너를 생성하는 데 사용할 이미지의 이름입니다.
- 컨테이너가 실행 중인지 확인합니다:
docker ps
출력 결과에 my-nginx-container가 표시되어야 합니다. 이 명령어는 실행 중인 모든 컨테이너를 보여줍니다.
- 웹 페이지 내용을 보려면
curl명령어를 사용합니다:
curl http://localhost:8080
터미널에 index.html 파일의 HTML 내용이 표시되어야 합니다.
curl이 무엇인지 궁금하다면, 이는 서버와 데이터를 주고받는 도구입니다. 여기서는 웹 서버에서 콘텐츠를 가져오는 데 사용하고 있습니다.
또한 LabEx VM 상단으로 이동하여 + 버튼을 클릭해 새 웹 서버를 만들고, 포트 8080을 입력하여 콘텐츠를 확인할 수도 있습니다.

이미지에 사용자 지정 소프트웨어 추가
이 단계에서는 추가 소프트웨어를 포함하도록 Docker 이미지를 수정합니다. 기본 nginx 이미지에는 포함되어 있지 않은 nano 텍스트 편집기를 예로 들어 추가해 보겠습니다.
- WebIDE에서
Dockerfile을 엽니다. 파일 탐색기 창에서Dockerfile을 클릭하면 됩니다. Dockerfile의 내용을 다음과 같이 수정합니다:
FROM nginx
RUN apt-get update && apt-get install -y nano
COPY index.html /usr/share/nginx/html/
이 Dockerfile은 패키지 인덱스를 업데이트하고 apt-get 패키지 관리자를 사용하여 nano 패키지를 설치하는 새로운 RUN 명령어를 추가합니다.
새로운 라인 설명:
RUN apt-get update && apt-get install -y nano: 패키지 목록을 업데이트(apt-get update)한 다음nano를 설치(apt-get install -y nano)합니다.-y플래그는 설치 중 발생하는 모든 프롬프트에 자동으로 "yes"라고 응답합니다.
- WebIDE에서 Ctrl+S(Mac의 경우 Cmd+S)를 눌러 파일을 저장합니다.
- WebIDE 터미널에서 새 태그로 Docker 이미지를 다시 빌드합니다:
docker build -t my-nginx-nano .
이 명령어는 nano 편집기가 포함된 my-nginx-nano 태그의 새 Docker 이미지를 빌드합니다.
- 새 이미지가 생성되었는지 확인합니다:
docker images
출력 결과에 my-nginx-nano 이미지가 표시되어야 합니다.
Nano가 포함된 사용자 지정 이미지 테스트
이 단계에서는 새 이미지를 기반으로 컨테이너를 실행하고 내부에서 nano 패키지를 사용할 수 있는지 확인합니다.
- WebIDE 터미널에서 다음 명령어를 사용하여 새 컨테이너를 시작합니다:
docker run -d --name nano-container my-nginx-nano
이 명령어는 my-nginx-nano 이미지를 기반으로 새 컨테이너를 시작하고 이름을 nano-container로 지정합니다.
- 다음 명령어를 실행하여 컨테이너 내부에 설치된
nano버전을 확인합니다:
docker exec nano-container nano --version
이 명령어는 실행 중인 컨테이너 내부에서 nano --version을 실행하여 패키지가 설치되었는지 확인합니다.
명령어 설명:
docker exec: 실행 중인 컨테이너에서 명령어를 실행합니다.nano-container: 컨테이너의 이름입니다.nano --version: 컨테이너 내부에서 설치된nano버전을 출력합니다.
GNU nano로 시작하는 출력이 표시되어야 하며, 이는 사용자 지정 이미지에 편집기가 포함되었음을 확인해 줍니다.
이미지에서 환경 변수 사용
이 단계에서는 사용자 지정을 위해 환경 변수를 사용하도록 Docker 이미지를 수정합니다.
WebIDE에서
Dockerfile을 다시 엽니다.Dockerfile의 내용을 다음과 같이 수정합니다:
FROM nginx
ENV NGINX_PORT 9000
RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html/
이 Dockerfile은 NGINX_PORT 변수를 9000으로 설정하는 ENV 명령어를 추가합니다. 또한 Nginx 구성을 수정하여 이 포트를 사용하도록 하는 RUN 명령어도 포함합니다.
새로운 라인 설명:
ENV NGINX_PORT 9000:NGINX_PORT환경 변수를9000으로 설정합니다.RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf:sed를 사용하여 Nginx 구성 파일에서 기본 포트(80)를 환경 변수 값으로 바꿉니다.
WebIDE에서 파일을 저장합니다.
WebIDE 터미널에서 새 태그로 Docker 이미지를 다시 빌드합니다:
docker build -t my-nginx-env .
- 새 이미지를 기반으로 컨테이너를 실행합니다:
docker run -d -p 9000:9000 --name env-container my-nginx-env
이 명령어는 my-nginx-env 이미지를 기반으로 새 컨테이너를 시작하고 호스트의 9000 포트를 컨테이너의 9000 포트에 매핑합니다. 환경 변수는 이미 Dockerfile에 설정되어 있으므로 docker run 명령어에서 다시 설정할 필요는 없습니다.
- 웹 서버가 지정된 포트에서 실행 중인지 확인합니다:
curl http://localhost:9000
터미널에 index.html 파일의 HTML 내용이 표시되어야 합니다.
Dockerfile에서 ENTRYPOINT 사용
이 단계에서는 Dockerfile에서 ENTRYPOINT 명령어를 사용하는 방법과 다른 포트(9100)를 사용하는 방법을 배웁니다.
WebIDE에서
Dockerfile을 다시 엽니다.Dockerfile의 내용을 다음과 같이 수정합니다:
FROM nginx
COPY index.html /usr/share/nginx/html/
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]
이 Dockerfile은 환경 변수와 sed 명령어를 제거합니다. 대신 ENTRYPOINT 스크립트를 사용하여 런타임에 구성을 처리합니다. 이렇게 하면 이미지가 더 유연해집니다.
- 같은 디렉토리에
start.sh라는 새 파일을 생성하고 다음 내용을 추가합니다:
#!/bin/bash
## Set a default port if NGINX_PORT is not set
export NGINX_PORT=${NGINX_PORT:-9100}
## Replace the port in the nginx configuration
sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
echo "Starting Nginx on port $NGINX_PORT"
nginx -g 'daemon off;'
이 스크립트는 기본 포트를 설정하고, 컨테이너 시작 시 Nginx 구성을 수정하며, Nginx가 실행될 포트를 보여주는 메시지를 출력한 다음 Nginx를 시작합니다.
WebIDE에서 두 파일을 모두 저장합니다.
WebIDE 터미널에서 새 태그로 Docker 이미지를 다시 빌드합니다:
docker build -t my-nginx-entrypoint .
- 새 이미지를 기반으로 컨테이너를 실행합니다. 환경 변수를 사용하여 포트를 9100으로 설정합니다.
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
- 컨테이너 로그를 확인하여 시작 메시지를 확인합니다:
docker logs entrypoint-container
출력 결과에 "Starting Nginx on port 9100"이라는 메시지가 표시되어야 합니다.
- 웹 서버가 새 포트에서 올바르게 실행 중인지 확인합니다:
curl http://localhost:9100
터미널에 index.html 파일의 HTML 내용이 표시되어야 합니다.
요약
이번 실습에서는 애플리케이션의 가치를 높이는 사용자 지정 Docker 이미지를 만드는 방법을 배웠습니다. 웹 서버가 포함된 간단한 이미지를 만드는 것으로 시작하여, 사용자 지정 소프트웨어를 추가하고 구성을 위해 환경 변수를 사용하는 단계로 진행했습니다. 실습 전반에 걸쳐 WebIDE(VS Code)를 사용하여 파일을 편집함으로써 더 직관적이고 사용자 친화적인 방식으로 작업을 수행했습니다.
수행한 작업 요약:
- 프로젝트 환경을 설정하고 기본적인 터미널 명령어를 익혔습니다.
- Nginx와 사용자 지정 HTML 페이지가 포함된 간단한 Docker 이미지를 생성했습니다.
- Docker 컨테이너를 빌드하고 실행하며 포트 매핑과 컨테이너 이름 지정에 대해 배웠습니다.
- 추가 소프트웨어(curl)를 포함하도록 Docker 이미지를 수정했습니다.
docker exec를 사용하여 컨테이너 내부에서 명령어를 실행했습니다.- 더 쉬운 구성을 위해 Docker 이미지에 환경 변수를 통합했습니다.



