도커 명령어 정리: 상태 확인부터 무중단 배포까지
미니PC에 서비스를 올리면서 실제로 쓴 도커 명령어를 정리했습니다. 각 항목은 설명 아래에 명령어를 두었습니다.
모든 docker compose 명령은 compose.yml이 있는 폴더(/Docker/nginx)에서 실행합니다. 명령 속 app1, nginx 같은 이름은 compose.yml의 서비스 이름입니다.
1. 이동과 상태 확인
Compose 폴더로 이동
cd /Docker/nginx
실행 중인 모든 컨테이너 보기
docker container ls
이 Compose 파일의 컨테이너 상태 보기
docker compose ps
멈춘 컨테이너까지 모두 보기
docker compose ps -a
Compose 파일에 있는 서비스 이름 목록 보기
docker compose config --services
컨테이너 이름만 골라 특정 이름 찾기
docker ps --format '{{.Names}}' | grep cloudflared
2. 실행, 재시작, 중지
이미지를 새로 빌드하고 바뀐 컨테이너만 다시 만들기 (앱 3대가 한꺼번에 바뀔 수 있음)
docker compose up -d --build
위와 같고, Compose 파일에서 지운 서비스의 컨테이너도 삭제
docker compose up -d --build --remove-orphans
설정을 다시 읽지 않고 컨테이너만 재시작 (nginx 설정 파일을 고친 뒤 등)
docker compose restart nginx
compose.yml이나 env_file 내용을 바꾼 뒤, 특정 서비스를 새 설정으로 다시 만들기
docker compose up -d --force-recreate app1
특정 서비스 멈추기
docker compose stop app2
특정 서비스 다시 켜기
docker compose start app2
컨테이너를 강제로 멈추고 삭제
docker rm -f nginx-cloudflared-1
3. 로그 보기
특정 서비스의 최근 로그 50줄
docker compose logs --tail=50 app1
최근 3분 동안의 로그만 보기
docker compose logs --since=3m nginx
로그를 실시간으로 계속 보기 (Ctrl+C로 종료)
docker compose logs -f app1 app2 app3
앱 3대가 정상으로 떴는지 확인 (3줄이 나오면 정상)
docker compose logs app1 app2 app3 | grep "Started Project0Application"
4. 컨테이너 안에서 명령 실행
nginx 설정 문법 검사
docker compose exec nginx nginx -t
접속을 끊지 않고 nginx 설정 다시 읽기
docker compose exec nginx nginx -s reload
nginx 컨테이너에서 앱에 직접 요청해 보기
docker compose exec nginx curl -sI http://app1:8082/
DB 백업 (/root에 저장됨)
docker exec my_mariadb sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" --all-databases' > ~/backup-$(date +%F).sql
5. 정보 확인
컨테이너별 Docker 내부 IP 보기 (X-Upstream 헤더의 IP가 어느 앱인지 확인할 때)
docker inspect -f '{{.Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker compose ps -q)
컨테이너의 재시작 횟수와 시작 시각
docker inspect -f '{{.RestartCount}} {{.State.StartedAt}}' nginx-app1-1
컨테이너를 띄운 Compose 파일 경로 보기
docker inspect -f '{{index .Config.Labels "com.docker.compose.project.config_files"}}' nginx-app1-1
6. 이미지
롤백용으로 현재 이미지에 다른 이름 붙이기
docker tag project0:local project0:previous
app1 서비스의 이미지만 빌드 (앱 3대가 같은 이미지를 씀)
docker compose build app1
쓰지 않는 이미지 정리 (디스크가 찼을 때)
docker image prune
7. 네트워크 진단
컨테이너에서 인터넷이 되는지 확인 (1분 걸림)
docker run --rm alpine ping -c 60 1.1.1.1 | tail -2
컨테이너에서 특정 포트로 TCP 연결이 되는지 확인
docker run --rm alpine sh -c 'nc -z -w 5 region1.v2.argotunnel.com 7844 && echo OK || echo FAIL'
8. 무중단 배포
소스 받기부터 앱 3대 순서대로 교체까지 실행
/Docker/nginx/deploy.sh
직전 이미지로 되돌리기
/Docker/nginx/deploy.sh rollback
참고: Docker 밖에서 도는 cloudflared
Tunnel은 Docker가 아니라 WSL의 서비스로 돌아갑니다. 그래서 docker 명령으로는 보이지 않고, systemctl로 관리합니다.
cloudflared 서비스가 돌고 있는지 확인
systemctl is-active cloudflared
cloudflared 최근 로그 20줄
journalctl -u cloudflared -n 20 --no-pager
cloudflared 재시작
systemctl restart cloudflared