Docker 기본 개념과 명령어 정리

2026. 3. 25. 21:50·DevOps
반응형

개발하다 보면 "내 PC에서는 되는데 서버에서 안 된다"는 상황을 한 번쯤 겪는다. Java 버전이 다르거나, OS가 달라서 라이브러리가 없거나. Docker는 이 문제를 해결하기 위해 나온 도구이기도 하지만, 실제로 쓰다 보면 다른 이유들이 더 와닿는다. 

서버 관리가 단순해진다. 앱을 올리고 내리는 게 명령어 한 줄로 끝난다. 예전엔 프로세스 찾아서 kill하고, 다시 실행하고, 잘 떴는지 확인하고 이걸 반복했는데 docker stop, docker start 로 끝난다.

지금 뭐가 떠있는지 한눈에 보인다. docker ps 하면 현재 실행 중인 서비스가 전부 나온다. 언제 시작했는지, 포트는 뭔지, 상태는 어떤지 한 번에 확인 가능하다. 뭐 이거 이외에도 여러개의 이유들이 있겠지만 난 일단 그렇다.

 


Docker가 뭔지

Docker는 애플리케이션을 컨테이너라는 단위로 묶어서 실행하는 플랫폼이다.

컨테이너가 뭔지 쉽게 비유하면, 배에 실리는 화물 컨테이너랑 똑같다. 어떤 항구에 내려도 컨테이너 안에 뭐가 들었는지, 어떻게 쌓는지 규격이 정해져 있어서 어디서든 동일하게 처리된다. Docker 컨테이너도 마찬가지다. 안에 뭐가 들었든 어느 서버에 올려도 동일하게 동작한다. 라고 클로드가 설명 해줬는데 대강 맞는 말인 것 같다!

  조금 더 기술적(?)으로 말하면, 코드, 런타임, 라이브러리, 설정까지 전부 하나로 패키징한 실행 단위다. 이걸 그대로 서버에 올리면 환경이 달라도 똑같이 돌아간다고 보면 되겠다.

VM이랑 뭐가 다른지

VM(가상머신)도 비슷한 목적으로 쓰이는데, 둘의 차이가 크다.

항목 VM Docker 컨테이너

구조 OS 전체를 가상화 호스트 OS 커널 공유
용량 수 GB 수십 ~ 수백 MB
시작 시간 수십 초 ~ 수 분 1~2초
격리 수준 강함 약간 낮지만 실용적

VM은 OS 자체를 통째로 올리는 방식이라 무겁다. Docker는 호스트 OS의 커널을 공유하면서 프로세스만 격리하는 방식이라 훨씬 가볍고 빠르다.

VM 구조                          Docker 구조
+---------------------+          +---------------------+
|  App A   |  App B   |          |  App A   |  App B   |
+----------+----------+          +----------+----------+
|  Guest   |  Guest   |          |Container |Container |
|  OS      |  OS      |          +----------+----------+
+----------+----------+          |    Docker Engine    |
|     Hypervisor      |          +---------------------+
+---------------------+          |      Host OS        |
|      Host OS        |          +---------------------+
+---------------------+          |   Infrastructure    |
|   Infrastructure    |          +---------------------+
+---------------------+

핵심 개념 4가지

이미지 (Image)

컨테이너를 만들기 위한 설계도다. 어떤 OS 기반인지, 어떤 소프트웨어가 설치돼 있는지, 실행 명령어가 뭔지 등이 담겨있다.

  • 읽기 전용이라 직접 수정 불가
  • Docker Hub에 공개 이미지들이 올라와 있음 (nginx, mysql, redis 등)
  • Dockerfile로 직접 만들 수도 있음
# Docker Hub에서 이미지 받기
docker pull nginx:latest

# 로컬에 있는 이미지 목록 확인
docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    a72860cb95fd   2 weeks ago    192MB
mysql        8.0       a3b6608898d6   3 weeks ago    596MB

컨테이너 (Container)

이미지를 실제로 실행한 것이다. 이미지 하나로 컨테이너를 여러 개 만들 수 있다.

집에 비유하면 이미지는 건축 설계도, 컨테이너는 그 설계도로 지은 집이다.

# nginx 이미지로 컨테이너 실행
docker run -d --name my-nginx -p 80:80 nginx:latest

# 실행 중인 컨테이너 목록
docker ps

# 중지된 것 포함 전체 목록
docker ps -a

볼륨 (Volume)

컨테이너는 삭제하면 내부 데이터가 전부 날아간다. 볼륨은 데이터를 호스트에 영구적으로 보관하는 방법이다.

# 호스트 경로를 컨테이너에 마운트
docker run -d \
  -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  nginx:latest
호스트 파일 경로 : 컨테이너 내부 경로 : 옵션(ro=읽기전용)

컨테이너를 삭제하고 다시 만들어도 호스트에 파일이 남아있으니까 설정이 유지된다.

네트워크 (Network)

컨테이너끼리 통신하려면 같은 네트워크에 있어야 한다. 기본적으로 컨테이너는 격리된 네트워크를 가지고 있어서 명시적으로 연결해줘야 한다.

# 네트워크 생성
docker network create my-network

# 컨테이너를 특정 네트워크에 연결해서 실행
docker run -d --name app --network my-network my-app:latest
docker run -d --name db --network my-network mysql:8.0

# 이제 app 컨테이너 내부에서 db라는 이름으로 mysql에 접근 가능

같은 네트워크 안에서는 컨테이너 이름으로 통신이 된다. IP 대신 이름을 쓰면 되니까 관리가 편하다.


자주 쓰는 명령어 정리

이미지 관련

# 이미지 받기
docker pull nginx:latest

# 로컬 이미지 목록
docker images

# 이미지 삭제
docker rmi nginx:latest

# 이미지를 tar 파일로 추출 (폐쇄망 등에서 활용)
docker save -o nginx.tar nginx:latest

# tar 파일에서 이미지 로드
docker load -i nginx.tar

컨테이너 실행

docker run \
  -d \                           # 백그라운드 실행
  --name my-nginx \              # 컨테이너 이름 지정
  --restart always \             # 재부팅 시 자동 시작
  -p 80:80 \                     # 포트 매핑 (호스트:컨테이너)
  -v /host/path:/container/path \ # 볼륨 마운트
  nginx:latest

-p 8080:80 이면 호스트의 8080포트로 들어오면 컨테이너의 80포트로 연결된다는 뜻이다.

컨테이너 관리

# 실행 중인 컨테이너 목록
docker ps

# 전체 목록 (중지된 것 포함)
docker ps -a

# 컨테이너 중지
docker stop my-nginx

# 컨테이너 시작
docker start my-nginx

# 컨테이너 재시작
docker restart my-nginx

# 컨테이너 삭제 (중지 후 삭제)
docker stop my-nginx && docker rm my-nginx

# 실행 중인 컨테이너 강제 삭제
docker rm -f my-nginx

로그 및 디버깅

# 로그 확인
docker logs my-nginx

# 실시간 로그 스트리밍
docker logs -f my-nginx

# 컨테이너 내부 접속
docker exec -it my-nginx bash

# 컨테이너 내부에서 명령어 실행
docker exec my-nginx cat /etc/nginx/nginx.conf

docker exec -it 는 실행 중인 컨테이너 안으로 들어가는 명령어다. 컨테이너 안에서 뭔가 확인하거나 디버깅할 때 자주 쓴다.

정리 명령어

# 중지된 컨테이너 전체 삭제
docker container prune

# 사용하지 않는 이미지 전체 삭제
docker image prune

# 컨테이너, 이미지, 네트워크 전부 정리
docker system prune

실전 예시

nginx 컨테이너 띄우기

# 1. 이미지 받기
docker pull nginx:latest

# 2. 컨테이너 실행
docker run -d --name nginx --restart always -p 80:80 nginx:latest

# 3. 확인
docker ps
curl http://localhost:80

mysql 컨테이너 띄우기

docker run -d \
  --name mysql \
  --restart always \
  -e MYSQL_ROOT_PASSWORD=root1234 \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  -v /home/mysql/data:/var/lib/mysql \
  mysql:8.0

-e 옵션으로 환경변수를 넘길 수 있다. mysql 이미지는 이 환경변수로 초기 설정을 잡는다. -v /home/mysql/data:/var/lib/mysql 로 데이터를 호스트에 마운트해두면 컨테이너 삭제해도 DB 데이터가 날아가지 않는다.

컨테이너 안에서 확인하기

# mysql 컨테이너 안으로 접속
docker exec -it mysql bash

# mysql 접속
mysql -u root -p

# DB 확인
show databases;

명령어 한눈에 보기

명령어 설명

docker pull [이미지] 이미지 받기
docker images 이미지 목록
docker run [옵션] [이미지] 컨테이너 실행
docker ps 실행 중인 컨테이너 목록
docker stop [컨테이너] 컨테이너 중지
docker rm [컨테이너] 컨테이너 삭제
docker logs [컨테이너] 로그 확인
docker exec -it [컨테이너] bash 컨테이너 내부 접속
docker save -o [파일] [이미지] 이미지 tar 추출
docker load -i [파일] tar에서 이미지 로드

막연하게 docker를 쓰기만 했는데 기본부터 정리해보자 해서 갑자기 쓴 글이다! 나중에 까먹으면 다시 찾아봐야지!

다음에는 docker-compose를 정리해봐야겠다~~~

반응형

'DevOps' 카테고리의 다른 글

사내 서버에서 Jenkins CI/CD 구축하기 (Synology NAS + Spring Boot + Windows)  (0) 2026.03.24
폐쇄망 서버에 Docker 설치하기 (Rocky Linux 8)  (0) 2026.03.24
'DevOps' 카테고리의 다른 글
  • 사내 서버에서 Jenkins CI/CD 구축하기 (Synology NAS + Spring Boot + Windows)
  • 폐쇄망 서버에 Docker 설치하기 (Rocky Linux 8)
fkqlaus
fkqlaus
안녕하세요 Java, Spring boot 공부하는 주니어 개발자입니다
  • fkqlaus
    개발자가 끄적끄적 블로그
    fkqlaus
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • Spring boot (3)
      • 프레임워크 (3)
      • Java (6)
      • DevOps (3)
      • DB (1)
      • CS (1)
      • GIS (1)
      • 알고리즘 문제풀이 (9)
      • 알고리즘 (0)
  • 인기 글

  • 태그

    프로그래머스
    데이터베이스
    서버
    spring
    cs
    iterator
    DevOps
    list
    collection
    개발
    컴퓨터
    db
    docker
    완전탐색
    개발자
    SWEA
    코딩테스트
    D2
    Java
    알고리즘
  • hELLO· Designed By정상우.v4.10.3
fkqlaus
Docker 기본 개념과 명령어 정리
상단으로

티스토리툴바