Infra/Docker

[Docker] 기본 명령어와 주요 옵션 정리

minseoki 2026. 4. 28. 16:26

[Docker] 기본 명령어와 주요 옵션 총정리

도커를 설치하고 나서 가장 먼저 마주치는 것들 — 컨테이너를 어떻게 만들고, 어떻게 관리하는지에 대한 기본 명령어와 자주 쓰는 옵션들을 정리해봤다.

Docker 설치

curl -fsSL https://get.docker.com -o get-docker.sh

도커 공식 홈페이지에서 설치 스크립트를 다운로드한다. 환경에 맞춰서 자동으로 설치해준다.

chmod +x get-docker.sh

+x : 실행 권한 추가

설치 후 ip a 명령으로 docker0 브릿지 IP가 올라와 있는지 확인한다.

  • IP가 올라와 있다 = 정상적인 상태
  • IP가 사라진 경우 = 비정상적인 상태 (컨테이너가 통신이 안됨)

비정상 상태라면 아래 명령으로 도커를 재시작하면 된다.

systemctl restart docker

도커 재시작 자동화 스크립트

IP가 사라졌을 때 자동으로 도커를 재시작하는 스크립트를 만들어두면 편하다.

tee /root/check_ip_and_restart_docker.sh<<EOF #!/bin/bash if ! ip add | grep -q 172.17; then systemctl restart docker fi EOF
chmod +x check_ip_and_restart_docker.sh
crontab -e
* * * * * /root/check_ip_and_restart_docker.sh

매분마다 스크립트를 실행하도록 크론탭에 등록한다.

systemctl enable docker

서버 재부팅 시에도 도커가 자동으로 시작되도록 설정.

우분투 IP 설정

vi /etc/netplan/50-cloud-init.yaml

우분투의 IP 설정 파일. IP를 211.183.3.100으로 수정한다.

netplan apply

변경사항 반영. systemctl restart network 와 같은 개념이다.

docker 기본 명령어

docker run

컨테이너를 생성하고 실행하는 명령어.
docker start, docker restart, docker stop 등과 함께 컨테이너 라이프사이클을 관리한다.

docker run nginx

nginx 이미지로 컨테이너를 run(생성 + 동작) 시키는 명령어.

컨테이너 이미지는 여러 개의 layer로 구성되어 있다.

ex) A 이미지 = 1+2+3, B 이미지 = 1+2+5 라면,
A 이미지를 갖고 있는 상태에서 B 이미지를 새로 구성할 때 5라는 레이어만 새로 받고, 1+2는 재활용한다.

AWS에서 AMI로 인스턴스를 만들어도 AMI 자체는 변하지 않는 것처럼, 컨테이너 이미지로 여러 개의 컨테이너를 만들어도 이미지 자체는 변하지 않는다.

docker ps

동작 중인 컨테이너를 조회한다. 컨테이너 ID나 이름으로 특정할 수 있다.

docker run 을 하면 컨테이너가 생성된다. --name 옵션으로 이름을 지정하지 않으면 angry_maxwell 같은 랜덤한 이름이 부여된다.

컨테이너 이미지 태그(tag)의 디폴트 값은 latest다. 태그를 명시하지 않으면 자동으로 latest로 설정된다.

옵션 없이 docker run을 하면 컨테이너 내부로 진입한다.
컨테이너가 잘 동작하려면 반드시 내부에서 foreground 상태인 프로세스가 존재해야 한다.

컨테이너 종류마다 foreground로 동작시키는 명령이 다르다.

  • 자바 컨테이너 : java -jar app.jar
  • 파이썬 컨테이너 : python manage.py runserver
  • nginx 컨테이너 : nginx -g "daemon off;"

모든 컨테이너 조회 : -a 옵션

컨테이너를 중지하면 docker ps 목록에서 사라진다.

docker ps -a

중지된 컨테이너까지 포함해서 모든 컨테이너를 볼 수 있다.

docker restart <컨테이너명>

중지된 컨테이너를 재시작할 수 있다.

컨테이너에서 나가기

Ctrl + PQ

  • 조용히 나가기
  • foreground 유지

Ctrl + PQ 로 빠져나와도 컨테이너가 잘 동작 중이다.
-it 옵션을 통해 상호작용을 함으로써 컨테이너가 잘 동작할 수 있다.

Ctrl + d

  • 강제로 나가기
  • 때에 따라서 컨테이너가 중지될 수도 있다.

Ctrl + d 로 빠져나오면 pid = 1 인 프로세스가 중지되기 때문에 컨테이너도 중지된다.

  • 처음에 bash로 직접 컨테이너를 만든 주인(PID 1)이라면 Ctrl + d 로 나가는 순간 주인이 죽어 컨테이너도 함께 종료된다.
  • 그러나 이미 돌아가는 서버에 exec로 나중에 들어간 손님이라면 Ctrl + d 로 나가도 주인(서버 프로세스)이 살아있어 컨테이너는 계속 유지된다.

모든 컨테이너 한 번에 삭제

docker rm -f $(docker ps -qa)

컨테이너의 ID를 변수로 받아와서 삭제한다. (컨테이너 전부 삭제)

docker rm

컨테이너를 삭제한다.

docker rm -f <컨테이너명>

동작 중인 컨테이너는 기본적으로 삭제가 안 되기 때문에 -f 옵션으로 강제 삭제한다.

--name

docker run 시 컨테이너의 이름을 직접 지정할 수 있다.

docker run --name mycon nginx

포어그라운드로 동작 중인 컨테이너에서 Ctrl + C 로 빠져나오면 포어그라운드 프로세스가 중지되면서 컨테이너도 함께 중지된다.

이미지 이름 오른쪽에 컨테이너 실행 시 수행할 command를 명시할 수 있다.

docker run --name mycon nginx /bin/bash

/bin/bash 명령으로는 특정 프로세스가 포어그라운드로 실행되지 않기 때문에 컨테이너는 바로 중지 상태가 된다.

docker run centos:7 sleep 60

sleep 60 이 바로 커맨드다. "컨테이너가 생기자마자 60초 동안 자라"는 명령을 수행한다. 60초가 지나면 업무가 끝났으므로 컨테이너는 종료된다.

도커 컨테이너는 운영체제 전체를 띄우는 게 아니라 딱 하나의 프로세스를 실행하기 위해 만들어진다.
command의 가장 큰 목적은 특정 프로세스를 foreground로 동작시켜 컨테이너 상태(state=up)를 유지하는 것이다.

docker inspect / docker exec

docker inspect ntest

ntest 컨테이너의 자세한 정보를 확인하는 명령. IP 값을 확인한 후 curl을 찍어 nginx가 잘 동작하는지 확인할 수 있다.

docker exec -it ntest bash

-it 옵션 : 실행 중인 컨테이너 안으로 접속한다.

주요 옵션

volume (-v) 매우 중요

컨테이너와 호스트를 마운트하는 개념.

mkdir /shared

마운트할 호스트 디렉토리 생성.

docker run -d --name con -v /shared:/remote nginx:latest

/shared(호스트) 와 /remote(컨테이너) 를 마운트한 컨테이너 생성.

echo vol-test > /shared/test.txt

호스트에 테스트 파일 생성.

docker exec con cat /remote/test.txt

컨테이너 내부에서 마운트된 파일 내용을 확인한다. 컨테이너를 삭제해도 호스트에는 파일이 남는다.

호스트와 컨테이너 양쪽에 파일이 있으면 어떻게 될까?

docker run -d --name vol nginx:latest docker exec -it vol bash

nginx 컨테이너 내부의 /usr/share/nginx/html 경로에는 기본 파일들이 존재한다.

docker run -d --name vol -v /shared:/usr/share/nginx/html nginx:latest

기존에 파일이 존재하는 디렉토리를 마운트 포인트로 지정하면,
호스트의 파일이 우선순위가 더 높다. 컨테이너에 있던 기존 파일은 무시된다.

publish (-p) 매우 중요

컨테이너를 외부에 노출, 배포(publish)시키는 옵션.
호스트를 외부, 컨테이너를 내부로 생각했을 때 DNAT(포트포워딩) 해주는 개념과 비슷하다.

docker run -d --name pub -p 8080:80 httpd:latest

-p 8080:80 설정을 통해 호스트의 8080 포트로 들어오는 모든 신호를 해당 컨테이너의 80 포트로 전달하도록 규칙을 정해놓는다. 그래서 IP를 따로 지정하지 않아도 된다.

도커를 설치하면 호스트 컴퓨터 안에 docker0 라는 가상 브릿지(Bridge)가 생긴다.
컨테이너를 실행할 때마다 도커는 이 브릿지로부터 172.17.0.x 대역의 내부 IP를 각 컨테이너에 자동으로 할당한다.
그래서 IP를 지정하지 않아도 도커가 알아서 지정해주기 때문에 충돌 없이 사용할 수 있다.

실습 예제 : 댕댕이 템플릿 퍼블리시

호스트의 /host_vol 경로에 무료 템플릿을 넣고 7979번 포트로 퍼블리시해보자.

wget -O dog.zip https://templatemo.com/download/templatemo_074_dog unzip dog.zip mkdir /host_vol cp -r templatemo_074_dog/* /host_vol
docker run -d --name web -v /host_vol:/usr/local/apache2/htdocs -p 7979:80 httpd:latest

-v-p 를 함께 사용해서 호스트의 파일을 컨테이너에 마운트하고 외부에 노출시킨다.

-e : 환경변수 구성

컨테이너 내부에 환경변수를 설정하는 옵션. 항상 키=값 형태로 작성한다.

docker run -d --name envcon -e ENVTEST=contest nginx:latest
docker exec -it envcon bash echo $ENVTEST # contest 출력

컨테이너 내부에 진입해서 실제로 환경변수가 구성됐는지 확인한다.

도커로 데이터베이스를 띄울 때 -e 옵션은 필수다.

docker run -d --name mydb mysql:8

환경변수 없이 DB 컨테이너를 생성하면 잘 동작하지 않는다.
데이터베이스 이미지들은 root 패스워드 설정이 안 되어 있기 때문에 컨테이너 생성 단계에서 환경변수로 설정해줘야 한다.

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=test123 mysql:8

환경변수로 root 암호를 설정하면 정상적으로 동작한다.

-w : 작업 디렉토리

  • 리눅스에서 pwd 명령을 입력한 가장 큰 목적은 내가 현재 어디 경로에 있는지를 확인하고 싶어서였다.
  • 컨테이너에서는 내가 현재 있는 경로를 고정시키기 위한 용도로 쓰인다.

/appmyapp.jar 파일을 두고 java -jar ./myapp.jar 명령으로 앱을 실행하려면 반드시 /app 경로에 있어야 한다.
-w 로 작업 디렉토리를 명시해두면 항상 그 경로에서 시작한다.

-w /app
docker run -d --name pwd -w /usr nginx:latest docker exec -it pwd bash # 접속하면 바로 /usr 경로에 위치한다

'Infra > Docker' 카테고리의 다른 글

Docker Swarm 에 대해서...  (1) 2026.05.05
[Docker] Compose 파일 작성법과 주요 옵션 총정리  (1) 2026.04.26