Docker를 처음 접해도
웹서버까지 직접 실행할 수 있습니다
이미지 · 컨테이너 · 포트 연결 · Nginx · Dockerfile
Docker는 애플리케이션을 필요한 실행 환경과 함께 패키징하고 컨테이너로 실행할 수 있도록 도와주는 플랫폼입니다. 개발 환경을 구성하거나 웹서버를 배포할 때 자주 사용되지만, 처음 배우는 사람에게는 이미지와 컨테이너의 차이, Docker Engine의 역할, 포트 연결 방식 등이 낯설 수 있습니다. 이 글에서는 Docker의 기본 개념을 이해한 다음 Docker Desktop 설치, 핵심 명령어 실습, Nginx 웹서버 실행, HTML 파일 연결, Dockerfile을 이용한 이미지 제작까지 순서대로 살펴봅니다.
📦 이미지와 컨테이너
🌐 Nginx 웹서버
⌨️ CLI 실습
개념 이해
이미지와 컨테이너의 관계를 알아봅니다.
환경 구축
Docker 설치와 정상 실행 여부를 확인합니다.
웹서버 실행
Nginx를 컨테이너로 실행합니다.
직접 제작
Dockerfile로 나만의 이미지를 만듭니다.
Docker로 Nginx 웹서버를 실행하고 웹브라우저에서 http://localhost:8080에 접속해 페이지를 확인합니다. 이후 직접 작성한 HTML 파일을 연결하고 Dockerfile로 사용자 정의 웹서버 이미지를 만들어 봅니다.
이 글의 주요 실습은 Docker Engine이 정상 실행되고 있다는 전제에서 진행합니다. Windows에서는 Docker Desktop과 WSL 2 구성이 필요할 수 있습니다. 또한 -p 8080:80 명령은 기본적으로 호스트의 여러 네트워크 인터페이스에 포트를 게시할 수 있으므로, 로컬 실습에서는 127.0.0.1:8080:80처럼 루프백 주소를 지정해 외부 노출을 줄이는 방식을 사용합니다.
📋 목차
Docker란 무엇인가? 컨테이너와 가상머신 차이
Docker를 이해하려면 먼저 컨테이너가 어떤 문제를 해결하는지 알아야 합니다. Docker는 개발자가 애플리케이션과 실행에 필요한 구성 요소를 일관된 형태로 배포하도록 도와줍니다.
Docker의 기본 개념
Docker는 애플리케이션을 이미지로 패키징하고 이를 컨테이너로 실행하는 플랫폼입니다. 애플리케이션 실행에 필요한 파일과 라이브러리, 기본 설정 등을 이미지에 포함할 수 있습니다.
예를 들어 웹서버를 직접 설치하려면 운영체제에 맞는 패키지 설치와 설정 작업이 필요합니다. 반면 Docker를 이용하면 미리 준비된 Nginx 이미지를 내려받아 컨테이너를 실행할 수 있습니다.
이 방식은 개발 환경과 테스트 환경의 차이를 줄이는 데 도움이 됩니다. 다만 운영체제 커널, CPU 아키텍처, 네트워크, 저장소, 환경 변수 등 실행 환경의 모든 차이가 자동으로 사라지는 것은 아닙니다.
Docker는 단순히 프로그램을 압축하는 도구가 아니라 이미지 관리, 컨테이너 실행, 네트워크와 저장소 설정 등을 함께 제공하는 기술입니다.
컨테이너는 어떻게 동작할까요?
컨테이너는 애플리케이션 프로세스를 다른 프로세스와 일정 수준 격리하여 실행하는 환경입니다.
Linux 컨테이너는 네임스페이스와 cgroups 등 운영체제 기능을 활용해 프로세스, 네트워크, 파일 시스템, 자원 사용 등을 분리하거나 제한할 수 있습니다.
각 컨테이너가 별도의 완전한 운영체제 커널을 가지는 것은 아닙니다. 일반적인 Linux 컨테이너는 호스트의 Linux 커널을 공유합니다.
Windows나 macOS의 Docker Desktop에서는 Linux 컨테이너를 실행하기 위해 경량 가상화 환경을 사용할 수 있습니다. 따라서 모든 플랫폼에서 컨테이너가 가상화 기술 없이 직접 실행된다고 이해하면 정확하지 않습니다.
컨테이너는 서로 격리되지만 완전한 보안 경계로 무조건 신뢰해서는 안 됩니다. 권한, 이미지 출처, 네트워크 노출 등을 함께 관리해야 합니다.
Docker와 가상머신(VM)의 차이
가상머신은 일반적으로 하이퍼바이저 위에서 별도의 게스트 운영체제를 실행합니다. 따라서 각 가상머신은 자체 운영체제와 커널을 가질 수 있습니다.
반면 일반적인 Linux 컨테이너는 Linux 커널을 공유하면서 애플리케이션 프로세스를 격리합니다.
이러한 구조 덕분에 컨테이너는 전체 게스트 운영체제를 실행하는 방식보다 가볍게 구성할 수 있는 경우가 많습니다.
다만 실제 메모리 사용량과 시작 속도는 이미지 크기, 실행하는 애플리케이션, 호스트 환경에 따라 달라집니다.
컨테이너가 가상머신을 완전히 대체하는 것은 아닙니다. 서로 다른 커널이 필요하거나 강한 운영체제 수준의 분리가 필요한 환경에서는 가상머신이 더 적합할 수 있습니다.
Docker가 활용되는 대표적인 상황
Docker는 개발 환경을 빠르게 준비하거나 여러 애플리케이션을 일관된 방식으로 배포할 때 유용합니다.
웹서버, 데이터베이스, 캐시 서버, 백엔드 API, 개발용 도구 등을 컨테이너로 실행할 수 있습니다.
팀 프로젝트에서는 Dockerfile과 구성 파일을 공유해 다른 개발자가 유사한 환경을 재현하도록 도울 수 있습니다.
CI/CD 환경에서는 이미지를 빌드하고 테스트한 후 배포하는 자동화 과정에 Docker를 활용할 수 있습니다.
다만 데이터 보존, 비밀 정보 관리, 보안 업데이트, 백업, 모니터링은 Docker 사용 여부와 관계없이 별도로 설계해야 합니다.
| 비교 항목 | 컨테이너 | 가상머신 |
|---|---|---|
| 실행 단위 | 격리된 프로세스 환경 | 게스트 운영체제 |
| 커널 | 일반적으로 호스트 커널 공유 | 별도 게스트 커널 |
| 실행 부담 | 상대적으로 가벼운 경우가 많음 | 게스트 OS 자원 필요 |
| 주요 활용 | 앱 배포·개발 환경 | OS 격리·서버 가상화 |
Docker는 애플리케이션을 이미지로 준비하고, 그 이미지를 바탕으로 컨테이너라는 실행 환경을 만드는 기술이라고 기억하면 좋습니다.
Docker 이미지와 컨테이너의 핵심 개념
Docker 입문에서 가장 중요한 두 단어는 이미지(Image)와 컨테이너(Container)입니다. 두 개념은 밀접하게 연결되어 있지만 같은 의미는 아닙니다.
Docker 이미지란 무엇인가요?
Docker 이미지는 컨테이너를 생성할 때 사용하는 읽기 전용 계층 기반의 패키지입니다.
이미지에는 애플리케이션 실행 파일, 라이브러리, 필요한 파일, 기본 설정 등이 포함될 수 있습니다.
예를 들어 nginx:alpine 이미지는 Alpine Linux 기반으로 구성된 Nginx 이미지 계열을 가리킵니다.
이미지 이름 뒤의 :alpine은 태그입니다. 태그는 특정 이미지 변형이나 버전을 가리키는 데 사용되지만 항상 불변의 내용을 보장하지는 않습니다.
배포 결과를 엄격하게 재현해야 한다면 변경될 수 있는 태그만 사용하기보다 이미지 다이제스트 고정 등을 검토할 수 있습니다.
Docker 컨테이너란 무엇인가요?
컨테이너는 이미지를 바탕으로 생성한 실행 인스턴스입니다.
하나의 이미지로 여러 개의 컨테이너를 생성할 수 있습니다.
예를 들어 같은 Nginx 이미지에서 서로 다른 이름과 포트를 가진 웹서버 컨테이너를 여러 개 실행할 수 있습니다.
컨테이너에는 이미지의 읽기 전용 계층 위에 쓰기 가능한 계층이 추가됩니다.
컨테이너 내부에서 변경한 파일은 해당 컨테이너의 쓰기 가능한 계층에 저장될 수 있지만, 컨테이너를 삭제하면 그 계층의 데이터도 일반적으로 사라집니다.
따라서 데이터베이스나 업로드 파일처럼 보존해야 하는 데이터에는 볼륨 또는 적절한 외부 저장소를 사용해야 합니다.
Docker Hub와 이미지 저장소 이해하기
Docker 이미지는 로컬 컴퓨터에 저장하거나 레지스트리(Registry)라는 이미지 저장소에서 내려받을 수 있습니다.
대표적인 공개 이미지 레지스트리로 Docker Hub가 있습니다.
Docker Hub에는 Nginx, Redis, PostgreSQL 등 다양한 소프트웨어 이미지가 등록되어 있습니다.
이미지를 내려받을 때는 공식 이미지 여부, 게시자, 유지보수 상태, 지원 버전 등을 확인해야 합니다.
출처가 불분명한 이미지는 악성 파일이나 취약한 설정을 포함할 수 있으므로 주의가 필요합니다.
Docker Hub는 이미지 배포 장소이며, 실제 컨테이너 실행은 로컬 Docker Engine이나 별도의 서버에서 수행합니다.
이미지와 컨테이너의 관계를 예시로 이해하기
이미지를 설계도 또는 실행용 원본 패키지에 비유할 수 있습니다.
컨테이너는 그 이미지를 사용해 만들어진 실제 실행 환경입니다.
예를 들어 Nginx 이미지를 한 번 다운로드한 뒤 web-a, web-b라는 이름으로 두 컨테이너를 생성할 수 있습니다.
각 컨테이너는 서로 다른 포트와 설정으로 실행할 수 있으며, 한 컨테이너를 중지하더라도 다른 컨테이너는 계속 실행될 수 있습니다.
이미지를 삭제하려고 할 때 해당 이미지를 사용하는 컨테이너가 남아 있다면 삭제가 제한될 수 있습니다.
nginx:alpine
web-a
web-b
| 구분 | 이미지 | 컨테이너 |
|---|---|---|
| 개념 | 실행용 패키지 | 이미지 기반 실행 인스턴스 |
| 대표 명령 | docker pull | docker run |
| 조회 | docker image ls | docker ps -a |
| 삭제 | docker image rm | docker rm |
이미지는 컨테이너를 만들기 위한 원본입니다. 웹서버가 실제로 동작하려면 해당 이미지를 사용해 컨테이너를 생성하고 실행해야 합니다.
Docker 설치 및 기본 명령어 익히기
Docker를 사용하려면 Docker Engine이 실행되는 환경과 명령어를 입력할 수 있는 Docker CLI가 필요합니다. 초보자가 Windows나 macOS에서 시작한다면 Docker Desktop을 활용할 수 있습니다.
Windows에서 Docker Desktop 설치하기
Windows에서는 공식 Docker Desktop 설치 페이지를 통해 설치 파일을 받을 수 있습니다.
Docker Desktop Windows 설치 공식 안내
설치 전 Windows 버전과 CPU 아키텍처, 가상화 기능, WSL 2 지원 여부 등 최신 시스템 요구 사항을 확인합니다.
WSL 2 기반 Linux 컨테이너를 사용하는 경우 Windows 기능과 가상화 설정이 적절히 구성되어 있어야 합니다.
Docker Desktop 설치를 마친 뒤 프로그램을 실행하고 Docker Engine이 준비될 때까지 기다립니다.
기업 및 조직에서 사용하는 경우 Docker Desktop의 라이선스 조건도 확인해야 합니다. 모든 업무 환경에서 무료로 사용할 수 있는 것은 아닙니다.
Docker 설치 상태 확인하기
Windows PowerShell, Windows Terminal 또는 명령 프롬프트를 실행합니다.
다음 명령으로 Docker CLI 버전을 확인합니다.
이 명령은 주로 Docker CLI 설치 여부를 확인합니다.
Docker Engine 연결 상태까지 확인하려면 다음 명령을 실행합니다.
Docker Engine이 정상 실행 중이면 클라이언트 및 서버 환경에 대한 정보가 표시됩니다.
서버에 연결할 수 없다는 오류가 발생한다면 Docker Desktop이 실행 중인지 확인합니다.
Windows에서는 Docker Desktop이 Linux 컨테이너 모드로 구성되어 있는지도 확인해야 합니다.
hello-world 이미지로 첫 번째 컨테이너 실행하기
Docker의 기본 실행 흐름을 확인하기 위해 hello-world 이미지를 사용합니다.
로컬 컴퓨터에 hello-world 이미지가 없다면 Docker가 기본 레지스트리에서 이미지를 내려받으려고 시도합니다.
이미지를 사용할 수 있게 되면 컨테이너를 생성하고 실행합니다.
정상적으로 실행되면 Docker 설치가 동작하고 있음을 알려주는 안내 메시지가 표시됩니다.
hello-world 컨테이너는 안내 메시지를 출력한 뒤 종료되므로 계속 실행 중인 컨테이너 목록에는 나타나지 않을 수 있습니다.
종료된 컨테이너까지 확인하려면 docker ps -a를 사용합니다.
처음 알아야 할 Docker 기본 명령어
Docker를 사용하면서 자주 입력하는 명령어는 이미지 다운로드, 컨테이너 실행, 목록 확인, 중지, 삭제와 관련되어 있습니다.
다음 명령어를 먼저 익혀두면 이후 웹서버 실습을 이해하기 쉽습니다.
docker image ls
docker ps
docker ps -a
docker pull nginx:alpine
docker logs 컨테이너이름
docker stop 컨테이너이름
docker start 컨테이너이름
docker rm 컨테이너이름
docker image ls는 로컬에 저장된 이미지를 조회합니다.
docker ps는 현재 실행 중인 컨테이너를 보여주며, docker ps -a는 종료된 컨테이너를 포함해 조회합니다.
docker pull은 이미지를 내려받고, docker logs는 컨테이너 로그를 확인합니다.
docker stop과 docker start는 기존 컨테이너를 중지하거나 다시 실행할 때 사용합니다.
docker rm은 컨테이너를 삭제하는 명령이므로 보존할 데이터가 있는지 확인한 뒤 사용해야 합니다.
| 명령어 | 기능 | 주의 사항 |
|---|---|---|
| docker pull | 이미지 다운로드 | 출처 확인 |
| docker run | 컨테이너 생성·실행 | 포트·볼륨 확인 |
| docker ps | 실행 중 목록 | -a로 전체 조회 |
| docker logs | 실행 로그 확인 | 민감 정보 출력 주의 |
| docker stop | 컨테이너 중지 | 서비스 중단 |
| docker rm | 컨테이너 삭제 | 데이터 보존 확인 |
Docker CLI와 Docker Engine의 기본 연결이 동작한다고 볼 수 있습니다. 이제 Nginx 이미지를 사용해 웹브라우저에서 확인할 수 있는 웹서버를 실행해 보겠습니다.
Docker로 Nginx 웹서버 실행하기
Docker의 기본 개념과 명령어를 익혔다면 실제 웹서버를 실행해 볼 차례입니다. 이번 실습에서는 Nginx 이미지를 사용합니다. Nginx는 정적 웹페이지 제공, 리버스 프록시 등 다양한 용도로 활용되는 웹서버입니다.
Nginx 이미지 다운로드하기
터미널에서 다음 명령을 입력합니다.
이 명령은 Docker Hub에서 nginx:alpine 이미지를 가져옵니다.
다운로드가 완료되면 다음 명령으로 로컬 이미지 목록을 확인합니다.
목록에서 nginx 이미지와 alpine 태그를 확인할 수 있습니다.
이미지 다운로드만으로 웹서버가 실행되는 것은 아닙니다. 다음 단계에서 이미지를 바탕으로 컨테이너를 생성해야 합니다.
실제 운영 환경에서는 이미지의 유지보수 상태와 보안 업데이트 여부도 주기적으로 확인해야 합니다.
docker run으로 웹서버 컨테이너 실행하기
다음 명령을 입력합니다.
docker run -d --name my-nginx -p 127.0.0.1:8080:80 nginx:alpine
이 명령에는 여러 옵션이 포함되어 있습니다.
docker run은 이미지에서 새 컨테이너를 생성하고 실행합니다.
-d는 컨테이너를 백그라운드 모드로 실행합니다.
--name my-nginx는 컨테이너 이름을 my-nginx로 지정합니다.
-p 127.0.0.1:8080:80은 호스트의 루프백 주소 8080번 포트를 컨테이너의 80번 포트에 연결합니다.
nginx:alpine은 사용할 이미지입니다.
컨테이너가 정상적으로 실행되면 긴 컨테이너 ID가 출력됩니다.
이미 같은 이름의 컨테이너가 존재한다면 이름 충돌 오류가 발생할 수 있으므로 기존 컨테이너 목록을 확인해야 합니다.
localhost:8080에서 웹페이지 확인하기
컨테이너가 실행되었다면 웹브라우저 주소창에 다음 주소를 입력합니다.
정상적으로 연결되면 Nginx의 기본 환영 페이지가 표시됩니다.
이 화면이 나타났다면 호스트의 8080번 포트를 통해 컨테이너 내부 Nginx 웹서버에 접근할 수 있다는 의미입니다.
컨테이너 상태를 확인하려면 다음 명령을 실행합니다.
출력 결과에서 my-nginx와 포트 연결 정보를 확인합니다.
웹페이지가 열리지 않는다면 Docker Engine 상태, 컨테이너 실행 상태, 포트 충돌, 로컬 방화벽 등을 확인해야 합니다.
웹서버 중지·재시작·삭제하기
웹서버 실습을 마친 뒤에는 컨테이너를 중지할 수 있습니다.
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
docker stop은 실행 중인 컨테이너를 중지합니다.
docker start는 중지된 컨테이너를 다시 실행합니다.
docker restart는 실행 중인 컨테이너를 재시작할 때 사용할 수 있습니다.
컨테이너를 완전히 삭제하려면 먼저 중지한 뒤 다음 명령을 실행합니다.
컨테이너를 삭제하더라도 이미지 자체는 일반적으로 로컬에 남아 있습니다.
단, 컨테이너의 쓰기 가능한 계층에만 저장된 데이터는 컨테이너 삭제와 함께 사라질 수 있습니다.
HTML 파일 연결과 Dockerfile 이미지 제작
기본 Nginx 페이지를 확인했다면 이번에는 직접 작성한 HTML 파일을 웹서버에 연결해 보겠습니다. 이어서 Dockerfile을 작성해 사용자 정의 이미지를 만드는 과정까지 실습합니다.
웹페이지 프로젝트 폴더 만들기
원하는 위치에 docker-web이라는 폴더를 생성합니다.
그 안에 index.html 파일을 만듭니다.
파일에는 다음과 같은 간단한 HTML 코드를 입력합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<title>Docker 첫 웹서버</title>
</head>
<body>
<h1>Docker 웹서버 실행 성공!</h1>
<p>Nginx 컨테이너에서 제공하는 페이지입니다.</p>
</body>
</html>
파일을 UTF-8 인코딩으로 저장하면 한글이 정상적으로 표시되는 데 도움이 됩니다.
Windows 파일 탐색기에서는 확장자 표시 기능을 켜고 파일이 index.html.txt로 저장되지 않았는지 확인합니다.
프로젝트 폴더에서 터미널을 열면 다음 명령을 편리하게 실행할 수 있습니다.
Bind Mount로 HTML 파일 연결하기
Docker에서는 호스트 컴퓨터의 폴더를 컨테이너 내부 경로에 연결할 수 있습니다.
이를 Bind Mount라고 합니다.
먼저 기존 my-nginx 컨테이너가 8080번 포트를 사용하고 있다면 중지합니다.
그다음 docker-web 폴더에서 PowerShell을 열고 다음 명령을 실행합니다.
docker run -d --name my-web -p 127.0.0.1:8080:80 --mount "type=bind,source=$($PWD.Path),target=/usr/share/nginx/html,readonly" nginx:alpine
위 명령은 Windows PowerShell 기준이며, 현재 폴더 경로를 Nginx의 기본 정적 파일 디렉터리에 읽기 전용으로 연결합니다.
다른 셸에서는 현재 경로를 표현하는 문법이 다를 수 있습니다.
웹브라우저에서 http://localhost:8080에 접속하면 직접 작성한 HTML 페이지가 표시됩니다.
Bind Mount를 사용하면 호스트의 HTML 파일을 수정했을 때 컨테이너를 새로 빌드하지 않고도 변경 내용을 확인할 수 있습니다. 브라우저 새로고침이 필요할 수 있습니다.
다만 호스트 파일 접근 권한이나 Docker Desktop의 파일 공유 설정에 따라 마운트가 제한될 수 있습니다.
Dockerfile 작성으로 사용자 정의 이미지 만들기
Bind Mount는 개발 중 파일을 빠르게 수정할 때 유용합니다.
반면 배포할 웹페이지 파일을 이미지에 포함하려면 Dockerfile을 사용할 수 있습니다.
docker-web 폴더에 확장자가 없는 Dockerfile 파일을 생성합니다.
다음 내용을 입력합니다.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
FROM nginx:alpine은 기본 이미지로 Nginx를 사용한다는 의미입니다.
COPY는 프로젝트의 HTML 파일을 이미지 내부 경로에 복사합니다.
EXPOSE 80은 컨테이너가 80번 포트를 사용하도록 설계되었다는 정보를 나타냅니다.
중요한 점은 EXPOSE 명령만으로 호스트 포트가 외부에 게시되는 것은 아니라는 사실입니다. 실제 포트 연결은 컨테이너 실행 시 -p 옵션 등으로 설정해야 합니다.
Dockerfile을 이용하면 웹페이지 파일이 이미지에 포함되므로 다른 Docker 환경으로 이미지를 전달해 실행할 수 있습니다.
docker build로 이미지 제작하고 실행하기
Dockerfile과 index.html이 들어 있는 프로젝트 폴더에서 다음 명령을 실행합니다.
-t 옵션은 이미지 이름과 태그를 지정합니다.
마지막의 점(.)은 현재 폴더를 빌드 컨텍스트로 사용한다는 의미입니다.
이미지 빌드가 완료되면 docker image ls 명령으로 my-first-web 이미지를 확인합니다.
이전에 실행한 my-web 컨테이너가 8080번 포트를 사용하고 있다면 중지합니다.
docker stop my-web
docker run -d --name my-built-web -p 127.0.0.1:8080:80 my-first-web:1.0
웹브라우저에서 http://localhost:8080에 접속해 직접 만든 페이지가 표시되는지 확인합니다.
이번에는 호스트 폴더를 마운트하지 않았습니다. HTML 파일이 이미지 내부에 포함되어 있기 때문입니다.
따라서 호스트의 index.html 파일을 수정하더라도 기존 이미지에는 자동 반영되지 않습니다. 수정된 파일을 포함하려면 이미지를 다시 빌드하고 새 컨테이너로 실행해야 합니다.
프로젝트 폴더 구성 예시
├── Dockerfile
└── index.html
정적 HTML 웹서버의 가장 기본적인 이미지 제작 구조입니다. CSS와 JavaScript 파일을 추가한다면 Dockerfile의 COPY 구성을 해당 파일 구조에 맞게 변경해야 합니다.
Dockerfile의 명령이나 이미지에 포함된 파일을 통해 비밀 정보가 노출될 수 있습니다. 실제 서비스에서는 Docker의 비밀 정보 관리 기능 또는 실행 환경의 안전한 비밀 변수 관리 방식을 사용해야 합니다. 또한 신뢰할 수 있는 기본 이미지를 사용하고 보안 업데이트를 주기적으로 확인하는 것이 중요합니다.
Docker 실행 오류와 관리 명령어 정리
Docker 실습 중 오류가 발생했다면 무작정 재설치하기보다 오류 메시지와 컨테이너 상태를 먼저 확인하는 것이 좋습니다. 특히 Docker Engine 연결 문제, 포트 충돌, 컨테이너 이름 중복은 초보자가 자주 경험하는 문제입니다.
Cannot connect to the Docker daemon 오류
다음과 비슷한 오류가 나타날 수 있습니다.
이 오류는 Docker CLI가 Docker Engine에 연결하지 못할 때 발생할 수 있습니다.
Windows에서는 Docker Desktop이 실행 중인지 먼저 확인합니다.
Docker Desktop의 엔진 시작이 완료되었는지 확인하고, WSL 2 기반 환경이라면 WSL 구성과 가상화 지원 상태도 점검합니다.
다음 명령으로 서버 연결 정보를 확인할 수 있습니다.
Docker CLI 버전이 출력된다고 해서 Docker Engine까지 정상 동작하는 것은 아니므로 서버 연결 상태를 별도로 확인해야 합니다.
Port is already allocated 오류 해결하기
8080번 포트를 다른 프로그램이나 컨테이너가 사용하고 있다면 포트 충돌이 발생할 수 있습니다.
먼저 실행 중인 Docker 컨테이너를 확인합니다.
기존 컨테이너가 8080번 포트를 사용하고 있다면 중지하거나 다른 포트를 선택합니다.
예를 들어 호스트 포트를 8081로 변경하려면 다음과 같이 실행할 수 있습니다.
이 경우 접속 주소는 http://localhost:8081입니다.
기존 컨테이너의 포트 연결을 바꾸려면 일반적으로 새로운 포트 설정으로 컨테이너를 다시 생성해야 합니다.
컨테이너가 바로 종료될 때 로그 확인하기
컨테이너가 실행 직후 종료되는 경우에는 메인 프로세스가 정상 종료되었거나 오류로 중단되었을 수 있습니다.
먼저 종료된 컨테이너까지 목록에 표시합니다.
그다음 컨테이너 로그를 확인합니다.
컨테이너 이름은 실제 문제가 발생한 컨테이너 이름으로 바꿔 입력합니다.
로그에서 설정 파일 오류, 실행 파일 누락, 권한 문제 등을 확인할 수 있습니다.
컨테이너의 종료 코드와 상세 상태를 확인하려면 docker inspect 명령도 사용할 수 있습니다.
단순한 hello-world 컨테이너처럼 원래 작업을 마친 뒤 종료되도록 설계된 경우에는 종료 상태가 반드시 오류를 의미하지 않습니다.
불필요한 이미지와 컨테이너 정리하기
Docker를 계속 사용하면 테스트용 컨테이너와 이미지가 누적될 수 있습니다.
먼저 사용량을 확인합니다.
중지된 컨테이너 중 불필요한 항목을 정리하려면 다음 명령을 사용할 수 있습니다.
사용하지 않는 이미지 등을 정리하는 명령도 있지만 삭제 대상이 넓어질 수 있으므로 신중해야 합니다.
docker system prune은 중지된 컨테이너, 사용하지 않는 네트워크, 댕글링 이미지, 사용하지 않는 빌드 캐시 등을 정리할 수 있습니다.
옵션에 따라 더 많은 이미지나 볼륨이 삭제될 수 있으므로 운영 중인 환경에서는 명령어의 삭제 범위를 충분히 확인해야 합니다.
특히 --volumes 옵션을 무분별하게 사용하면 보존해야 할 데이터에 영향을 줄 수 있습니다.
| 증상 | 가능한 원인 | 점검 방법 |
|---|---|---|
| Docker daemon 연결 실패 | Engine 미실행 | Docker Desktop · docker info |
| 8080 포트 충돌 | 다른 프로세스 사용 | docker ps · 포트 변경 |
| 컨테이너 이름 중복 | 기존 컨테이너 존재 | docker ps -a |
| 컨테이너 즉시 종료 | 프로세스 종료·실행 오류 | docker logs · inspect |
| 디스크 사용량 증가 | 이미지·캐시 누적 | docker system df |
Docker Engine 상태를 확인한 뒤 컨테이너 목록, 포트 연결, 로그, 이미지와 마운트 설정 순서로 점검하세요. 문제가 발생했다고 모든 이미지와 컨테이너를 삭제할 필요는 없습니다.
Docker 입문 자주 묻는 질문 Q&A
핵심 요약 및 Docker 실습 체크리스트
Docker를 처음 배울 때는 이미지와 컨테이너의 차이를 정확히 이해하는 것이 중요합니다. 이미지는 애플리케이션을 실행하기 위한 패키지이고, 컨테이너는 그 이미지를 바탕으로 생성한 실행 환경입니다. Docker CLI 명령어를 사용하면 이미지를 내려받고 컨테이너를 생성하거나 실행 상태를 관리할 수 있습니다.
이번 실습에서는 Nginx 이미지를 내려받고 컨테이너를 실행해 http://localhost:8080에서 웹페이지를 확인했습니다. 이어서 Bind Mount를 사용해 호스트의 HTML 파일을 연결하고, Dockerfile로 웹페이지를 포함한 사용자 정의 이미지를 만들었습니다. 이러한 과정을 이해하면 다른 웹 애플리케이션을 Docker로 패키징하고 실행하는 방법도 확장해서 학습할 수 있습니다.
| 핵심 항목 | 명령어 또는 개념 |
|---|---|
| 1. Docker 설치 확인 | docker –version |
| 2. Engine 연결 확인 | docker info |
| 3. 첫 컨테이너 실행 | docker run hello-world |
| 4. 이미지 다운로드 | docker pull nginx:alpine |
| 5. 웹서버 실행 | docker run -d -p 127.0.0.1:8080:80 nginx:alpine |
| 6. 실행 목록 확인 | docker ps |
| 7. 로그 확인 | docker logs 컨테이너이름 |
| 8. 사용자 이미지 빌드 | docker build -t my-first-web:1.0 . |
| 9. 컨테이너 중지 | docker stop 컨테이너이름 |
✅ Docker 입문 최종 체크리스트
☐ Docker와 컨테이너의 기본 개념 이해하기
☐ 이미지와 컨테이너의 차이 구분하기
☐ Docker Desktop 또는 Docker Engine 설치하기
☐ docker –version 명령으로 CLI 확인하기
☐ docker info로 Engine 연결 확인하기
☐ docker run hello-world 실행하기
☐ nginx:alpine 이미지 다운로드하기
☐ Nginx 컨테이너 실행하기
☐ localhost:8080에서 웹페이지 확인하기
☐ docker ps와 docker logs 사용하기
☐ index.html 파일 직접 작성하기
☐ Bind Mount로 HTML 파일 연결하기
☐ Dockerfile 작성 및 이미지 빌드하기
☐ 컨테이너 중지와 삭제 명령어 이해하기
☐ 포트 노출과 데이터 보존 주의 사항 확인하기
Docker 입문 단계에서는 복잡한 오케스트레이션 도구부터 공부하기보다 이미지 다운로드, 컨테이너 실행, 포트 연결, 로그 확인, Dockerfile 빌드 과정을 직접 반복해 보는 것이 좋습니다. 기본 흐름을 익힌 다음 Docker Compose, 볼륨, 사용자 정의 네트워크, 다중 컨테이너 애플리케이션, 이미지 보안 및 배포 자동화로 학습 범위를 넓혀 보세요.
📚 Docker 공식 참고 자료
Docker 설치, 이미지와 컨테이너, 명령어, Dockerfile, 네트워크 및 저장소에 관한 최신 설명은 다음 공식 문서에서 확인할 수 있습니다.
- Docker Get Started — Docker 입문 및 기본 실습
- What is a Container? — 컨테이너 기본 개념
- What is an Image? — 이미지 개념과 역할
- Docker Desktop Windows 설치 — 설치 조건 및 설정
- Docker CLI Reference — Docker 명령어 참고
- Dockerfile Reference — 이미지 빌드 명령어
- Docker Bind Mounts — 호스트 폴더 연결 방법
- Docker Port Publishing — 포트 게시 및 네트워크 노출
- Docker Hub Nginx 이미지 — 공식 Nginx 이미지 정보
- Docker 요금 및 구독 안내 — Docker Desktop 라이선스 확인
※ 본 글은 Docker의 기본 개념과 Nginx 웹서버 실행을 설명하는 입문용 가이드입니다. Docker Desktop의 설치 요구 사항, 지원 운영체제, 구독 조건, 이미지 태그, CLI 동작은 버전과 실행 환경에 따라 달라질 수 있습니다. Windows PowerShell용 Bind Mount 예제는 해당 셸의 경로 표현을 사용하므로 macOS, Linux, WSL 셸에서는 경로 문법을 조정해야 합니다. 실습에서는 외부 노출을 줄이기 위해 루프백 주소로 포트를 게시하지만, 실제 운영 환경에서는 방화벽, 인증, HTTPS, 데이터 백업, 이미지 업데이트 및 접근 제어를 별도로 구성해야 합니다.
Docker 입문, Docker 초보자 가이드, 도커 사용법, Docker 설치, Docker Desktop, Docker Engine, Docker CLI, Docker 이미지, Docker 컨테이너, Docker Image, Docker Container, Docker Hub, Docker Registry, Docker 가상머신 차이, Docker VM 비교, Docker 명령어, docker run, docker pull, docker ps, docker image ls, docker logs, docker stop, docker start, docker restart, docker rm, docker inspect, docker system df, docker build, Dockerfile 작성, Dockerfile FROM, Dockerfile COPY, Dockerfile EXPOSE, Docker Nginx, Nginx 컨테이너, Docker 웹서버, Docker 웹서버 띄우기, Docker localhost 8080, Docker 포트 연결, Docker Port Mapping, Docker Port Publishing, Docker Bind Mount, Docker Volume, Docker HTML 배포, Docker 정적 웹페이지, Docker WSL2, Docker Windows 설치, Docker daemon 오류, Docker 포트 충돌, Docker 컨테이너 삭제, Docker 이미지 빌드, Docker 개발 환경, Docker 배포, Docker Compose 기초, Docker 보안, Docker Tutorial 2026