빠른 흐름
docker run \
--name web \
-d \
-p 8080:80 \
-e NGINX_HOST=example.com \
--rm \
nginx:alpine기본 흐름
어떤 docker run 옵션을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 백그라운드 서버 실행 | -d |
| 셸로 직접 들어가 디버깅 | -it |
| 외부에서 접근 가능한 포트 열기 | -p |
| 런타임 설정 주입 | -e, --env-file |
| 테스트 후 컨테이너 자동 삭제 | --rm |
포트 바인딩 — 호스트포트:컨테이너포트 순서로 외부 접근 경로를 연다
-p 8080:80은 호스트의 8080 포트를 컨테이너 내부의 80 포트와 연결합니다. 브라우저에서 localhost:8080으로 접속하면 컨테이너의 80 포트로 전달됩니다. 호스트 포트와 컨테이너 포트를 같게 쓸 필요는 없으며, 여러 -p 플래그로 포트를 여러 개 바인딩할 수 있습니다.
# 호스트 8080 → 컨테이너 80
docker run -p 8080:80 nginx:alpine
# 여러 포트 바인딩
docker run -p 80:80 -p 443:443 nginx:alpine
# 특정 인터페이스에만 바인딩 (외부 노출 제한)
docker run -p 127.0.0.1:8080:80 nginx:alpine환경변수 전달 — -e와 --env-file로 런타임 설정을 주입한다
-e KEY=VALUE로 환경 변수를 하나씩 전달하거나, --env-file 플래그로 파일에서 여러 변수를 한 번에 주입할 수 있습니다. 앱 설정, 데이터베이스 URL, API 키 같은 런타임 값은 이미지에 하드코딩하지 않고 환경 변수로 주입하는 것이 기본 패턴입니다.
# 개별 환경변수 주입
docker run -e NODE_ENV=production -e PORT=3000 my-app
# .env 파일에서 일괄 주입
docker run --env-file ./.env my-app
# .env 파일 형식
# NODE_ENV=production
# DATABASE_URL=postgres://db:5432/mydbinteractive 모드(-it)와 detached 모드(-d) — 목적에 따라 실행 방식을 나눈다
-d는 백그라운드에서 컨테이너를 실행하고 즉시 터미널로 돌아옵니다. -it는 -i(stdin 연결)와 -t(가상 터미널 할당)를 합친 플래그로, 컨테이너와 직접 상호작용할 때 씁니다. 셸에 접속하거나 일회성 명령을 실행할 때는 -it를, 웹 서버처럼 백그라운드로 계속 돌아야 할 때는 -d를 씁니다.
# 백그라운드 실행 (서버, DB 등)
docker run -d nginx:alpine
# 대화형 셸 접속 (탐색, 디버깅)
docker run -it alpine sh
# 일회성 명령 실행 후 자동 삭제
docker run --rm alpine echo "hello"run, start, exec는 비슷해 보여도 쓰는 시점이 다르다
새 컨테이너를 만들고 실행하는 것은 docker run이고, 이미 존재하지만 멈춰 있는 컨테이너를 다시 띄우는 것은 docker start입니다. 실행 중인 컨테이너 안에서 추가 명령을 넣는 것은 docker exec입니다. 셋을 구분하지 못하면 새 컨테이너를 계속 만들거나, 기대하던 상태를 이어받지 못하는 실수가 생깁니다.
# 새 컨테이너 생성 + 실행
docker run --name web -d nginx:alpine
# 같은 컨테이너 다시 시작
docker stop web
docker start web
# 실행 중인 컨테이너 안에서 셸 실행
docker exec -it web sh체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 백그라운드로 서버 실행 | -d |
| 셸 접속, 디버깅 | -it |
| 외부에서 컨테이너 포트 접근 | -p 호스트포트:컨테이너포트 |
| 런타임 설정 주입 | -e KEY=VALUE 또는 --env-file |
| 테스트 후 자동 삭제 | --rm |
주의할 점
docker run은 항상 새 컨테이너를 만든다. 같은 이름(--name)으로 반복 실행하면 이름 충돌 오류가 발생한다. 이미 중지된 컨테이너를 다시 시작하려면 docker start를 써야 하며, 새로 만들 때는 기존 컨테이너를 먼저 docker rm으로 제거해야 한다.
docker run --name web -d nginx:alpine
docker stop web
docker run --name web -d nginx:alpine
# docker: Error response from daemon:
# Conflict. The container name "/web" is already in use ...참고 링크
2 sources