Docker 기본 명령어
🔍 공통 팁 --help
-
대부분의 Docker 명령어에
--help
옵션을 붙이면 모든 사용 가능한 옵션을 확인할 수 있음.예: docker run —help, docker container ls —help
-
명령어 출력
- docker —help
-
옵션을 붙이면 상세 옵션 확인 가능
- docker ps —help
목차
📦 이미지
- 이미지 기본 명령어
- 이미지 목록 조회
- 생성
- 삭제
- 분석(inspect)
- 이미지 이름 지정 네이밍, 태그(tag)
- 이미지 배포
- 로그인
- 푸시
- 풀
🧱 컨테이너
- 실행 중인 / 중지된 컨테이너 목록 조회
- 컨테이너 기본 명령어
- 실행(run)
- 중지(stop)
- 재시작(start)
- 삭제(rm)
- 컨테이너 이름 지정 네이밍
Docker - 이미지 생성 & 실행 run, start
✅ docker run
- 새 컨테이너를 실행 (기본적으로 이미지 기반의 새 컨테이너 생성)
✅ docker start [컨테이너명 or ID]
- 중지된 컨테이너를 다시 시작
- 기존 컨테이너를 재활용할 수 있으므로, 이미지나 코드 변경이 없으면
run
대신start
사용 가능 docker start
는 터미널을 차단하지 않음 → 백그라운드 실행
컨테이너 동작 방식
구분 | Attached | Detached |
---|---|---|
터미널 제어 | 터미널 입력 중지 | 터미널 입력 자유로움 |
로그 출력 | 실시간 콘솔 출력 | 출력 없음 (별도 명령으로 확인 필요) |
컨테이너 실행 방식 비교
명령어 | 모드 | 설명 |
---|---|---|
docker run | Attached (기본값) | 새 컨테이너 생성 + 터미널 차단됨, 로그 실시간 출력 |
docker run -d | Detached | 새 컨테이너 생성 + 백그라운드 실행, 로그는 따로 봐야 함 |
docker start | Detached (기본값) | 중지된 기존 컨테이너를 재실행, 백그라운드로 동작 |
docker start -a | Attached | 중지된 컨테이너를 재실행하며 터미널에 연결 |
Python CLI 앱 Docker 구동 시키기
import random
min_val = int(input("Enter min value: "))
max_val = int(input("Enter max value: "))
if min_val > max_val:
print("Invalid range!")
else:
print("Random number:", random.randint(min_val, max_val))
Dockerfile
# https://hub.docker.com/
# Python 베이스 이미지 검색하기
FROM python:3
# Work Directory 변경
WORKDIR /app
# 파일 복사
COPY . /app
# 컨테이너 실행시 실행 시키기 전부 다 문자열
CMD [ "python", "rng.py" ]
이제 docker run
으로 실행하면 되지만,
주의할 점이 있습니다.
이 프로그램은 사용자 입력을 받아야 하기 때문에,
입력받을 수 있는 실행 옵션이 필요합니다.
입력을 받으려면 it
옵션이 필수
docker run -it python-rng
i
: 입력 가능하게 (stdin 유지)t
: TTY를 만들어서 터미널처럼 동작
중요 : 컨테이너를 생성하고 실행하기 때문에, 이후에 docker start로 -ai 옵션을 넣는다고 정상적으로 동작 하지 않습니다.
한 번 실행된 컨테이너는 종료됩니다.
하지만 docker ps -a
로 목록을 보면 확인할 수 있습니다
docker start -ai <컨테이너 이름>
a
: 실행 중인 출력을 터미널로 가져옴i
: 입력을 다시 받을 수 있도록 함
컨테이너 실행과 관련된 주요 명령어 정리
명령어 | 설명 |
---|---|
docker run -it | 새 컨테이너를 입력 가능한 상태로 실행 |
docker start -ai | 종료된 컨테이너를 입력/출력 가능하게 재실행 |
docker attach <이름> | 실행 중인 컨테이너에 다시 연결 |
docker logs -f <이름> | 로그만 실시간으로 보기 (입력 불가) |
Docker Container 상태 확인 PS
✅ docker ps
- 실행 중인 컨테이너 목록 확인
docker ps -a
: 중지된 컨테이너 포함 전체 목록 확인
컨테이너 상태를 확인하는 주요 명령어 정리
명령어 | 설명 |
---|---|
docker ps | 실행 중인 컨테이너 목록 확인 |
docker ps -a | 중지된 컨테이너 포함 전체 목록 |
docker stop <컨테이너명> | 컨테이너 중지 |
docker logs <컨테이너명> | 과거 로그 출력 확인 |
docker logs -f <컨테이너명> | 실시간 로그 follow 모드 |
docker attach <컨테이너명> | 실행 중인 컨테이너에 터미널 연결 |
Docker - 이미지 삭제 rm
컨테이너 삭제
- 실행 중인 컨테이너는 바로 삭제할 수 없습니다.
- 먼저 중지한 뒤에 삭제해야 합니다.
docker stop <컨테이너명>
docker rm <컨테이너명>
#컨테이너 여러 개를 한 번에 삭제하고 싶다면, 공백으로 구분하여 이름을 나열합니다.
docker rm container1 container2 container3
# 중지된 컨테이너 일괄 삭제
docker container prune
# 질문 없이 바로 제거
docker container prune -f
현재 보유 중인 이미지 목록 확인
docker images
이미지 삭제
- 해당 이미지가 컨테이너에서 사용 중이면 삭제할 수 없습니다.
- 컨테이너가 실행 중이든, 중지된 상태든 이미지와 연결되어 있으면 제거되지 않습니다.
- 이미지를 지우려면 먼저 해당 컨테이너를 삭제해야 합니다.
docker rmi <이미지 ID>
# 여러 개의 이미지도 한 번에 삭제할 수 있습니다.
docker rmi id1 id2 id3
사용하지 않는 이미지 한 번에 삭제 (prune)
- ※ prune : 가지치기
- 사용되지 않고 남아 있는 잔여 리소스를 정리하는 명령어
docker image prune
# 질문 없이 바로 제거
docker image prune -f
# etc prune
docker image prune: 사용되지 않는 이미지 가지치기
docker container prune: 중지된 컨테이너 가지치기
docker volume prune: 사용되지 않는 볼륨 가지치기
docker system prune: 위 모든 것을 한 번에 가지치기
컨테이너 자동 삭제 —rm
-rm
은 컨테이너가 종료될 때 자동으로 삭제되도록 만드는 옵션입니다.docker stop
또는 컨테이너 실행이 종료되면, 해당 컨테이너가 자동으로 시스템에서 제거됩니다.
docker run --rm ...
# 예시 실행 -> 중지 (자동 삭제)
docker run -d --rm -p 3000:80 my-image
# 컨테이너 중지하기
docker stop my-image
# 컨테이너 상태 확인하기
docker ps -a
- 개발 중 자주 컨테이너를 띄웠다 끌 때
- 테스트용 컨테이너를 반복 실행할 때
- 컨테이너 재사용이 필요 없는 일회성 작업일 때
- 변경된 코드를 기반으로 매번 새로 빌드/실행할 때
이미지 분석 명령어 - image inspect
docker image inspect <이미지 ID>
inspect
명령의 결과는 JSON 형식이며, 매우 많은 정보를 포함하고 있습니다.
항목 | 설명 |
---|---|
Id | 이미지의 전체 SHA 식별자 |
Created | 이미지가 생성된 날짜와 시간 |
ContainerConfig | 컨테이너 실행 시 기본 설정 정보 |
Env | 포함된 환경 변수 |
ExposedPorts | 자동으로 열리는 포트 (예: 80/tcp 등) |
Cmd / Entrypoint | 컨테이너가 실행될 때 실행되는 명령 |
Os / Architecture | 이미지의 운영 체제 및 아키텍처 (예: linux/amd64) |
RootFS → Layers | 이 이미지가 갖는 모든 레이어 목록 (순서대로 표시됨) |
컨테이너 로컬 파일 복사 - COPY
- 실행 중인 컨테이너와 로컬 시스템 간에 파일 또는 폴더를 복사할 수 있게 해줍니다.
docker cp <출발지> <도착지>
# 예제 1: 로컬 → 컨테이너로 파일 복사
docker cp ./dummy test-container:/test
# 예제 2: 컨테이너 → 로컬로 파일 복사
docker cp test-container:/test dummy
# 특정 파일만 복사
docker cp test-container:/test/test.txt ./dummy/test.txt
기능 | 명령어 |
---|---|
로컬 → 컨테이너 복사 | docker cp ./파일명 컨테이너:/경로 |
컨테이너 → 로컬 복사 | docker cp 컨테이너:/경로 ./폴더 |
- 로컬에서 컨테이너로 설정 파일 복사
- config 파일을 컨테이너에 동적으로 추가할 때
- 컨테이너에서 로그 파일 추출
docker logs
보다 더 상세한 로그 접근이 필요할 때
- 데이터 파일 복사
- SQLite, CSV 등의 결과 파일 백업할 때
⚠️ 주의할 점
- 컨테이너에 코드 파일을 복사하는 것은 추천하지 않습니다.
- 소스 코드 변경 시에는 보통 이미지를 다시 빌드하고, 새 컨테이너를 띄우는 것이 표준입니다.
- 잘못된 코드 복사로 인해 컨테이너 내부 상태가 불안정해질 수 있습니다.
- 컨테이너에서 실행 중인 프로세스의 핵심 파일을 교체할 수 없습니다.
- 예:
server.js
같은 파일은 실행 중인 상태에서 덮어쓸 수 없습니다.
- 예:
docker cp
는 컨테이너 재시작 없이 일시적으로 무언가를 수정하거나 확인해야 할 때 유용합니다.
컨테이너에 이름 지정 —name
docker run -d --rm --name goalsapp my-image
d
: detached 모드-rm
: 종료 시 컨테이너 자동 삭제-name goalsapp
: 컨테이너 이름을goalsapp
으로 지정
컨테이너를 중지하거나 다시 시작할 때 복잡한 ID 대신 사용 가능
docker stop goalsapp
docker logs goalsapp
이미지에 이름과 태그 지정하기
docker build -t 이름:태그 .
# 예시
docker build -t goals:latest .
# 이미지 ID 대신 사용하기
docker run --rm goals:latest
# 태그를 생략하면 Docker는 자동으로 latest 처리
# 동일하게 처리된다.
docker build -t myapp .
docker build -t myapp:latest .
태그(tag)의 개념과 활용
- 예시 ) Node 공식 이미지
node:latest
→ 가장 최신 버전node:18
→ Node 18 버전node:18-slim
→ 용량을 줄인 슬림 이미지node:18-alpine
→ Alpine 리눅스 기반 경량 이미지
구분 | 목적 | 명령어 |
---|---|---|
--name | 컨테이너에 이름 지정 | docker run --name myapp |
-t 이름:태그 | 이미지에 이름/태그 지정 | docker build -t myimg:latest . |
이름 기반 실행 | 이미지 ID 대신 태그 사용 | docker run myimg:latest |
이미지 버전 관리 | 다양한 버전 구분 가능 | goals:v1 , goals:prod , goals:test 등 |
주의!!!
테스트 용/임시 용 이미지만 정리
docker image prune
# ※ 주의 : 열심히 태그 붙여놓고 정리한 이미지들도 **다 사라짐.
#** "사용하지 않는 이미지"라는 기준으로 판단
# 컨테이너에서 안 쓰고 있으면 삭제 대상
docker image prune -a
# Git으로 버전 관리를 잘하고 있었다면, 불러와서 새로 이미지를 빌드 할 수 있음
# 그렇지 않았다면, 모두 날아갔음.
Docker 배포
소스코드 + Dockerfile로 공유하거나
완성된 이미지 자체를 배포
Docker 배포 Docker Hub
- https://hub.docker.com 에 가입합니다.
- 무료 요금제로 계정을 생성합니다.
- 저장소(Repository)를 생성합니다.
- 이름 예시:
node-hello-world
- 공개 또는 비공개 여부 설정 가능 (무료는 개인 저장소 1개만 가능)
- 이름 예시:
# 기존 이미지에 새 태그 부여
docker tag node-demo yourdockerid/node-hello-world
# 올바른 이름으로 빌드해서 사용하기
docker build -t yourdockerid/node-hello-world .
Docker 로그인
로그인 상태는 캐시되며, 반복 로그인 필요 없음
docker login
Docker 이미지 push
docker push yourdockerid/node-hello-world
- 이미지가 도커 허브에 업로드됩니다.
- 베이스 이미지(예:
node:18
)는 이미 존재하므로, 변경된 레이어만 푸시됩니다. - 도커 허브에서 저장소를 열면 푸시된 태그(
latest
,v1
, 등)를 확인할 수 있습니다. - 이 이미지는 다른 사용자가
docker pull
로 가져올 수 있습니다:
Docker 이미지 pull
docker pull yourdockerid/node-hello-world
본 문서는 Udemy 강의: Docker & Kubernetes : 실전 가이드 의 내용을 바탕으로 학습한 내용을 정리한 것입니다.
Last updated on