Docker 개념 및 실행하는법 , 그리고 명령어 완벽정리
함께보면 좋은글
✅ 명령어
[개발 같이해요] - [ Vim ] vim 명령어 총정리 ( 파일 탐색, 편집, 검색 등 )
[개발 같이해요] - [ Linux ] 리눅스 명령어 모음 총정리 ( 파일 관리, 프로세스, 네트워크 등 )
[개발 같이해요] - [ nodejs ] 노드 명령어 총정리 모음 ( 프로젝트 생성, 패키지 관리, 실행 및 디버깅 등 )
✅ 개발환경 세팅
[개발 같이해요/UNITY] - [ 유니티 ] 맥북 M1 유니티 개발환경 세팅
[개발 같이해요/REACT] - [ React ] 리액트 개발환경 구축
[개발 같이해요/DB] - [ mongodb ] 몽고db 설치 및 개발환경 세팅
[개발 같이해요/JAVA - SPRING] - [ SpringBoot ] Visual Studio Code 에서 스프링부트 개발환경 세팅
[개발 같이해요/AI] - [ AI ] Windows에서 딥러닝 개발 환경 구축
[개발 같이해요] - [ ubuntu ] 우분투 20.04 에서 Nginx 설치 및 세팅
# 1. Docker 개념 및 실행하는 법
Docker란 무엇인가?
Docker는 애플리케이션을 컨테이너(Container)라는 표준화된 단위로 패키징, 배포, 실행할 수 있게 해주는 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션과 필요한 모든 의존성(라이브러리, 환경 설정 등)을 하나의 이미지로 묶어 운영 체제와 독립적으로 실행할 수 있도록 도와줍니다.
Docker의 주요 구성 요소
- 이미지 (Image)
- 컨테이너를 생성하기 위한 템플릿.
- 애플리케이션 실행에 필요한 환경(코드, 런타임, 라이브러리 등)을 포함.
- 예: Python 이미지에는 Python 실행 환경이 포함.
- 컨테이너 (Container)
- Docker 이미지를 기반으로 실행되는 독립된 실행 환경.
- 애플리케이션이 실행되는 "가상화된" 공간.
- 가볍고 빠르며, 호스트 OS의 커널을 공유.
- Docker Engine
- Docker의 핵심 실행 엔진으로, 컨테이너를 생성하고 관리.
- Docker Hub
- Docker 이미지를 공유할 수 있는 클라우드 기반 저장소.
Docker로 실행하면 어떻게 되는가?
Docker를 사용해 애플리케이션을 실행하면 다음과 같은 과정을 거칩니다.
- 이미지 가져오기 (Pull)
- Docker Hub나 다른 레지스트리에서 원하는 이미지를 다운로드.
- 예:
docker pull python:3.9
- 컨테이너 생성 및 실행
- 이미지를 기반으로 컨테이너를 생성하고 애플리케이션을 실행.
- 예:
docker run -d -p 5000:5000 my_app
- 애플리케이션 실행 환경 제공
- 독립적이고 일관된 실행 환경이 제공.
- 호스트 OS와 격리되며, 동일한 이미지를 사용하면 어디서나 동일하게 동작.
- 컨테이너 관리
- 컨테이너의 시작, 정지, 삭제 등을 쉽게 관리 가능.
- 예:
docker start, docker stop, docker rm
Docker를 사용할 때의 이점 ( 장점 )
- 이식성 (Portability)
- 동일한 컨테이너 이미지를 개발, 테스트, 배포 환경에서 동일하게 실행.
- 경량화
- 기존 가상머신(VM)에 비해 리소스 사용량이 적음.
- 빠른 시작 시간
- 가상머신보다 컨테이너 시작 속도가 매우 빠름.
- 일관성 유지
- "내 로컬에서는 잘 되는데..."라는 문제 해결.
- 효율적인 자원 활용
- 하나의 운영 체제에서 여러 컨테이너를 효율적으로 실행.
예제 : Docker로 간단한 Python 애플리케이션 실행
- Dockerfile 작성
FROM python:3.9 WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD ["python", "app.py"]
- 이미지 생성
docker build -t my_python_app .
- 컨테이너 실행
docker run -d -p 5000:5000 my_python_app
Docker로 컨테이너를 실행하는 것은 로컬에서 가상 서버를 만드는 것과 유사한 개념이라고 이해할 수 있습니다.
그럼, 무엇이 다른지 아래 표를 통해 알아보도록 하겠습니다.
Docker 컨테이너 vs 가상 서버 ( VM ) 차이점 한눈에 보기
특징 | Docker 컨테이너 | 가상 서버(VM) |
실행 방식 | 호스트 OS의 커널을 공유하며, 애플리케이션과 필요한 파일만 실행 | 호스트 OS 위에 별도의 운영 체제를 실행 |
속도 | 매우 빠르게 시작 (초 단위) | 부팅 시간이 필요 (분 단위) |
리소스 사용량 | 가볍고 효율적, 오버헤드 적음 | 무거움, 전체 운영 체제 자원 필요 |
격리 수준 | 프로세스 수준의 격리 | 하드웨어 수준의 격리 |
이식성 | 동일한 이미지로 어디서든 실행 가능 | OS와 하드웨어 의존성이 존재 |
크기 | 일반적으로 수십 MB에서 수백 MB 정도 | 수 GB 이상 |
Docker 컨테이너 를 '가벼운 가상서버' 라고 생각할 수 있는 이유
- 독립된 환경 제공
- Docker 컨테이너는 필요한 애플리케이션, 라이브러리, 설정 등을 포함하므로 로컬 환경과 독립적으로 실행됩니다.
- 마치 작은 서버처럼 동작하지만, 운영 체제 전체를 실행하지 않기 때문에 가볍습니다.
- 격리된 실행
- 각 컨테이너는 호스트 시스템의 다른 애플리케이션과 격리되어 동작합니다.
- 컨테이너 간에 영향을 주지 않으므로 여러 개의 컨테이너를 동시에 실행할 수 있습니다.
- 가상 네트워크
- Docker는 각 컨테이너에 가상 네트워크 인터페이스를 제공하여 컨테이너를 서버처럼 네트워크에서 접근할 수 있게 합니다.
- 예를 들어,
docker run -p 8080:80
을 사용하면 로컬에서 컨테이너가 8080 포트로 접속 가능한 서버처럼 동작합니다.
- 호스트와의 차이
- Docker 컨테이너 내부의 파일 시스템, 네트워크 설정, 프로세스는 호스트와 별도로 동작합니다.
- 하지만 여전히 호스트 OS의 커널을 사용하기 때문에 전통적인 VM보다 가볍습니다.
# 2. Docker 명령어 완벽 정리 및 예시
이미지 관련 명령어
명령어 | 설명 |
docker images | 로컬에 저장된 Docker 이미지 목록 보기 |
docker pull [이미지:태그] | Docker Hub에서 이미지 다운로드 |
docker build -t [이름:태그] . | Dockerfile을 기반으로 이미지 빌드 |
docker rmi [이미지 ID/이름:태그] | Docker 이미지 삭제 |
docker tag [이미지] [새 태그] | 이미지에 새 태그 추가 |
- docker images
- 설명: 로컬에 저장된 Docker 이미지 목록을 보여줍니다.
- 예시:
docker images
- 출력 예시:
- docker pull [이미지:태그]
- 설명: Docker Hub에서 이미지를 다운로드합니다.
- 예시:
docker pull python:3.9
- 결과: Python 3.9 이미지가 로컬에 다운로드됩니다.
- docker build -t [이름:태그] .
- 설명: 현재 디렉토리의 Dockerfile을 기반으로 이미지를 생성합니다.
- 예시:
docker build -t myapp:1.0 .
- 결과: myapp:1.0이라는 이름으로 이미지가 생성됩니다.
- docker rmi [이미지 ID/이름:태그]
- 설명: 특정 이미지를 삭제합니다.
- 예시:
docker rmi python:3.9
- 결과: python:3.9 이미지를 삭제합니다.
- docker tag [이미지] [새 태그]
- 설명: 이미지에 새 태그를 추가합니다.
- 예시:
docker tag python:3.9 python:latest
- 결과: python:3.9 이미지가 python:latest로 태그됩니다.
컨테이너 실행 및 관리
명령어 | 설명 |
docker run [옵션] [이미지:태그] | 컨테이너 실행 (이미지 없을 경우 자동으로 Pull) |
docker ps | 실행 중인 컨테이너 목록 보기 |
docker ps -a | 모든 컨테이너 목록 보기 (정지된 컨테이너 포함) |
docker stop [컨테이너 ID/이름] | 실행 중인 컨테이너 중지 |
docker start [컨테이너 ID/이름] | 정지된 컨테이너 다시 시작 |
docker rm [컨테이너 ID/이름] | 컨테이너 삭제 (정지 상태에서만 가능) |
docker exec -it [컨테이너 ID] [명령어] | 실행 중인 컨테이너에서 명령어 실행 (예: bash 접속) |
docker logs [컨테이너 ID/이름] | 컨테이너 로그 확인 |
docker restart [컨테이너 ID/이름] | 컨테이너 재시작 |
1. docker run [옵션] [이미지:태그]
- 설명: Docker 이미지를 기반으로 컨테이너를 생성하고 실행합니다. 이미지를 로컬에서 찾지 못하면 Docker Hub에서 자동으로 다운로드(Pull)합니다.
- 예시 1: 간단한 Python 컨테이너 실행
- 예시:
docker run -it python:3.9
- 결과: Python 3.9 컨테이너가 실행되고, 대화형 모드로 진입하여 Python 인터프리터가 실행됩니다.
- 출력 예시:
- 예시:
2. docker ps
- 설명: 실행 중인 컨테이너 목록을 확인합니다.
- 예시:
docker ps
- 출력 예시:
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 123abc456def nginx "/docker-entrypoint.…" Up 2 minutes 0.0.0.0:8080->80/tcp elegant_kapoor
- 출력 예시:
3. docker ps -a
- 설명: 모든 컨테이너(정지된 컨테이너 포함) 목록을 확인합니다.
- 예시:
docker ps -a
- 출력 예시:
- 출력 예시:
4. docker stop [컨테이너 ID/이름]
- 설명: 실행 중인 컨테이너를 중지합니다.
- 예시:
docker stop 123abc456def
- 결과: ID가 123abc456def인 컨테이너가 중지됩니다.
5. docker exec -it [컨테이너 ID/이름] [명령어]
- 설명: 실행 중인 컨테이너 내부에서 명령어를 실행합니다.
- 예시 1: Bash 쉘 접속
docker exec -it 123abc456def bash
- 결과: ID가 123abc456def인 컨테이너 내부에 접속하여 Bash 쉘을 사용할 수 있습니다.
- 결과: ID가 123abc456def인 컨테이너 내부에 접속하여 Bash 쉘을 사용할 수 있습니다.
- 예시 2: 단일 명령 실행
docker exec -it 123abc456def ls /usr/share/nginx/html
- 결과: Nginx 컨테이너 내부에서 /usr/share/nginx/html 디렉토리의 파일 목록이 출력됩니다.
- 출력 예시:
6. docker logs [컨테이너 ID/이름]
- 설명: 컨테이너의 로그를 확인합니다.
- 예시:
docker logs 123abc456def
- 결과: 컨테이너에서 발생한 로그가 출력됩니다.
7. docker restart [컨테이너 ID/이름]
- 설명: 컨테이너를 재시작합니다.
- 예시:
docker restart 123abc456def
- 결과: ID가 123abc456def인 컨테이너가 정지 후 재실행됩니다.
네트워크 관련 명령어
명령어 | 설명 |
docker network ls | Docker 네트워크 목록 확인 |
docker network create [네트워크 이름] | 새로운 네트워크 생성 |
docker network inspect [네트워크 이름] | 네트워크 세부정보 확인 |
docker network connect [네트워크 이름] [컨테이너 ID] | 컨테이너를 네트워크에 연결 |
docker network disconnect [네트워크 이름] [컨테이너 ID] | 네트워크에서 컨테이너 연결 해제 |
1. docker network ls (Docker 네트워크 목록 확인)
- 설명: Docker 네트워크 목록을 확인합니다.
- 예시:
docker network ls
- 출력 예시:
2. docker network create [네트워크 이름] (새로운 네트워크 생성)
- 설명: 사용자 정의 네트워크를 생성합니다.
- 예시:
docker network create my-custom-network
- 출력 예시: 생성된 네트워크의 ID가 출력됩니다.
- 생성된 네트워크 확인
docker network ls
- 출력 예시:
3. docker network inspect [네트워크 이름] (네트워크 세부정보 확인)
- 설명: 특정 네트워크의 세부 정보를 확인합니다.
- 예시:
docker network inspect my-custom-network
- 출력 예시:
4. docker network connect [네트워크 이름] [컨테이너 ID] (컨테이너를 네트워크에 연결)
- 설명: 특정 컨테이너를 네트워크에 연결합니다.
- 예시: 컨테이너를 실행한 후 네트워크에 연결:
docker run -d --name my-app nginx docker network connect my-custom-network my-app
- 결과 확인: 네트워크의 세부정보를 확인하면 컨테이너가 연결된 것을 볼 수 있습니다.
docker network inspect my-custom-network
5. docker network disconnect [네트워크 이름] [컨테이너 ID] (네트워크에서 컨테이너 연결 해제)
- 설명: 컨테이너를 특정 네트워크에서 분리합니다.
- 예시:
docker network disconnect my-custom-network my-app
- 결과 확인: 네트워크의 세부정보에서 컨테이너가 제거된 것을 확인:
docker network inspect my-custom-network
볼륨 관리
명령어 | 설명 |
docker volume ls | Docker 볼륨 목록 확인 |
docker volume create [볼륨 이름] | 새로운 볼륨 생성 |
docker volume inspect [볼륨 이름] | 볼륨 세부정보 확인 |
docker volume rm [볼륨 이름] | 볼륨 삭제 |
1. docker volume ls (Docker 볼륨 목록 확인)
- 설명: Docker에 생성된 모든 볼륨 목록을 확인합니다.
- 예시:
docker volume ls
- 출력 예시:
2. docker volume create [볼륨 이름] (새로운 볼륨 생성)
- 설명: 새로운 볼륨을 생성합니다.
- 예시:
docker volume create my-new-volume
- 출력 예시:
- 생성된 볼륨 목록 확인
docker volume ls
- 출력 예시:
3. docker volume inspect [볼륨 이름] (볼륨 세부정보 확인)
- 설명: 특정 볼륨의 세부 정보를 확인합니다.
- 예시:
docker volume inspect my-new-volume
- 출력 예시:
4. docker volume rm [볼륨 이름] (볼륨 삭제)
- 설명: 특정 볼륨을 삭제합니다.
- 예시:
docker volume rm my-new-volume
- 출력 예시:
- 삭제된 볼륨 확인:
docker volume ls
- 출력 예시:
이미지 및 컨테이너 정리
명령어 | 설명 |
docker system prune | 사용하지 않는 모든 리소스 정리 (컨테이너, 이미지, 네트워크 등) |
docker image prune | 사용하지 않는 이미지 정리 |
docker container prune | 사용하지 않는 컨테이너 정리 |
docker volume prune | 사용하지 않는 볼륨 정리 |
docker network prune | 사용하지 않는 네트워크 정리 |
1. docker system prune
- 설명: 사용하지 않는 모든 리소스(중지된 컨테이너, 사용되지 않는 이미지, 네트워크, 볼륨 등)를 정리합니다.
- 예시:
docker system prune
- 출력 예시:
2. docker image prune
- 설명: 사용하지 않는 이미지(태그 없는 이미지 등)를 정리합니다.
- 예시:
docker image prune
- 출력 예시:
3. docker container prune
- 설명: 사용하지 않는 컨테이너(중지된 컨테이너)를 정리합니다.
- 예시:
docker container prune
- 출력 예시:
4. docker volume prune
- 설명: 사용하지 않는 볼륨(컨테이너와 연결되지 않은 볼륨)을 정리합니다.
- 예시:
docker volume prune
- 출력 예시:
5. docker network prune
- 설명: 사용하지 않는 네트워크를 정리합니다.
- 예시:
docker network prune
- 출력 예시:
Docker Compose 명령어
명령어 | 설명 |
docker-compose up | docker-compose.yml 파일 기반으로 컨테이너 실행 |
docker-compose down | 실행 중인 Compose 애플리케이션 중지 및 정리 |
docker-compose ps | Compose로 실행된 컨테이너 목록 확인 |
docker-compose logs | Compose 애플리케이션 로그 보기 |
docker-compose build | Docker Compose 이미지 빌드 |
docker-compose stop | Compose로 실행된 컨테이너 정지 |
1. docker-compose up
- 설명: docker-compose.yml 파일을 기반으로 컨테이너를 생성하고 실행합니다.
- 예시: 아래와 같은 docker-compose.yml 파일이 있다고 가정합니다
- 실행 명령
docker-compose up
- 출력 예시:
2. docker-compose down
- 설명: 실행 중인 Compose 애플리케이션을 중지하고 생성된 리소스(컨테이너, 네트워크 등)를 정리합니다.
- 예시:
docker-compose down
- 출력 예시:
3. docker-compose ps
- 설명: Compose로 실행된 컨테이너 목록을 확인합니다.
- 예시:
docker-compose ps
- 출력 예시:
4. docker-compose logs
- 설명: Compose 애플리케이션의 로그를 확인합니다.
- 예시:
docker-compose logs
- 출력 예시:
- 특정 서비스의 로그만 확인
docker-compose logs app
- 출력 예시:
5. docker-compose build
- 설명: docker-compose.yml 파일에 정의된 서비스의 이미지를 빌드합니다.
- 예시:
docker-compose build
- 출력 예시:
6. docker-compose stop
- 설명: Compose로 실행된 컨테이너를 정지합니다. 네트워크와 컨테이너는 삭제되지 않습니다.
- 예시:
docker-compose stop
- 출력 예시:
유용한 단축 명령
명령어 | 설명 |
docker run --rm [이미지:태그] | 컨테이너 실행 후 종료 시 자동 삭제 |
docker run -d [이미지:태그] | 백그라운드에서 컨테이너 실행 |
docker run -p [호스트 포트]:[컨테이너 포트] | 컨테이너 포트를 로컬 호스트에 바인딩 |
docker exec -it [컨테이너 ID/이름] bash | 실행 중인 컨테이너의 bash 쉘에 접속 |
docker cp [파일] [컨테이너 ID]:[경로] | 로컬 파일을 컨테이너로 복사 |
1. docker run --rm [이미지:태그]
- 설명: 컨테이너를 실행한 후 종료 시 컨테이너를 자동으로 삭제합니다.
- 예시:
docker run --rm ubuntu echo "Hello, Docker!"
- 출력 예시:
- 실행 후, 컨테이너가 자동으로 삭제되므로
docker ps -a
에서 확인되지 않습니다.
2. docker run -d [이미지:태그]
- 설명: 컨테이너를 백그라운드에서 실행합니다.
- 예시:
docker run -d nginx
- 출력 예시:
- 컨테이너의 ID가 출력됩니다.
- 컨테이너의 ID가 출력됩니다.
- 실행 중인 컨테이너 확인:
docker ps
- 출력 예시:
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 123abc456def nginx "/docker-entrypoint.…" Up 2 seconds 80/tcp mystifying_turing
3. docker run -p [호스트 포트]:[컨테이너 포트]
- 설명: 컨테이너의 포트를 로컬 호스트에 바인딩하여 외부에서 접근 가능하게 설정합니다.
- 예시:
docker run -d -p 8080:80 nginx
- 출력 예시:
- 컨테이너의 ID가 출력됩니다.
- 컨테이너의 ID가 출력됩니다.
- 실행 중인 컨테이너 확인:
docker ps
- 출력 예시:
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 456def789ghi nginx "/docker-entrypoint.…" Up 5 seconds 0.0.0.0:8080->80/tcp epic_hypatia
- 브라우저에서
http://localhost:8080
에 접속하면Nginx
기본 페이지가 표시됩니다.
4. docker exec -it [컨테이너 ID/이름] bash
- 설명: 실행 중인 컨테이너에 접속하여 bash 쉘을 사용할 수 있습니다.
- 예시:
docker exec -it 123abc456def bash
- 출력 예시:
- 컨테이너 내부로 접속된 상태에서 bash 쉘이 활성화됩니다.
- 컨테이너 내부 작업 예시:
ls
- 출력 예시:
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
5. docker cp [파일] [컨테이너 ID]:[경로]
- 설명: 로컬 파일을 컨테이너 내부로 복사합니다.
- 예시:
echo "This is a test file" > test.txt docker cp test.txt 123abc456def:/root/test.txt
- 컨테이너 내부에서 파일 확인:
- 출력 예시:
test.txt
- 컨테이너 내부에서 파일 내용 확인:
cat /root/test.txt
- 출력 예시:
# 3. Docker 에 대한 간단한 FAQ
1. Docker란 무엇인가요?
Docker는 컨테이너 기술을 사용하여 애플리케이션과 그 의존성을 함께 패키징하고, 어디서나 일관된 환경에서 실행할 수 있도록 도와주는 플랫폼입니다.
2. Docker와 가상 머신(VM)의 차이점은 무엇인가요?
- Docker는 호스트 OS의 커널을 공유하며, 애플리케이션 실행에 필요한 최소한의 환경만 제공하는 반면,
VM은 하드웨어 가상화를 통해 완전한 운영 체제를 실행합니다. - Docker는 가볍고 빠르며 리소스 효율적입니다.
3. Docker 컨테이너란 무엇인가요?
Docker 컨테이너는 애플리케이션과 그 의존성을 포함하는 가벼운 실행 환경입니다.
컨테이너는 격리된 상태에서 실행되며, 애플리케이션이 어디서나 동일하게 동작할 수 있도록 지원합니다.
4. Docker 이미지는 무엇인가요?
Docker 이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿입니다.
애플리케이션 실행에 필요한 코드, 라이브러리, 설정 등을 포함하며, 컨테이너는 이 이미지를 기반으로 생성됩니다.
5. Docker를 사용하는 이유는 무엇인가요?
- 일관된 실행 환경 제공: "내 로컬에서는 되는데…" 문제 해결.
- 빠른 배포: 애플리케이션과 환경을 함께 패키징하여 어디서나 실행 가능.
- 효율적인 리소스 활용: VM보다 가볍고 실행 속도가 빠름.
- 이식성: 클라우드, 로컬, 서버 등 다양한 환경에서 동일하게 동작.
6. Docker를 설치하려면 어떻게 해야 하나요?
Docker 공식 웹사이트(https://www.docker.com/) 에서 운영 체제에 맞는 Docker Desktop 또는 Docker Engine을 다운로드하여 설치하면 됩니다.
7. Docker Hub란 무엇인가요?
Docker Hub는 Docker 이미지를 공유할 수 있는 클라우드 기반 레지스트리입니다.
사용자는 필요한 이미지를 검색하고 다운로드(Pull)하거나, 자신만의 이미지를 업로드(Push)할 수 있습니다.
8. Dockerfile이란 무엇인가요?
Dockerfile은 Docker 이미지를 생성하기 위한 설정 파일입니다.
애플리케이션 환경 설정, 설치할 패키지, 실행 명령어 등을 정의합니다.
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
9. Docker Compose란 무엇인가요?
Docker Compose는 여러 컨테이너를 함께 정의하고 실행할 수 있게 해주는 도구입니다.
docker-compose.yml 파일을 사용하여 컨테이너 간의 네트워크, 볼륨, 설정을 간단히 관리할 수 있습니다.
10. Docker를 배우기 위해 필요한 사전 지식은 무엇인가요?
- 기본적인 Linux/CLI 명령어 사용법 ( 리눅스 명령어 모음 바로가기 )
- 네트워킹(포트, IP 등) 개념 이해.
- 애플리케이션 배포와 서버 관리에 대한 기본적인 이해.
하지만 간단한 프로젝트는 바로 따라하면서 익힐 수 있습니다.