Ubuntu 20.04 버전 기준 아래 명령어로 간단 설치가 가능합니다.
# 패키지 목록 갱신 후 docker.io와 net-tools 설치
sudo apt update && sudo apt install -y docker.io net-tools
# 현재 사용자($USER)를 docker 그룹에 추가
# (추가해야 sudo 없이 docker 명령을 실행할 수 있음)
sudo usermod -aG docker $USER
# 변경 사항 적용을 위해 시스템 재부팅
sudo reboot
도커 기본 명령
아래는 기본적으로 알아두어야 할 도커 명령어 입니다.
| 컨테이너 실행 | docker run [옵션] <이미지> [명령] | 새 컨테이너 실행 | docker run -it ubuntu bash |
| 컨테이너 조회 | docker ps | 실행 중인 컨테이너 목록 확인 | docker ps |
| docker ps -a | 중지된 컨테이너 포함 전체 목록 확인 | docker ps -a | |
| 상세정보 확인 | docker inspect <컨테이너> | 컨테이너 상세 정보(JSON) 출력 | docker inspect my_container |
| docker stats | CPU/메모리/네트워크 등 실시간 자원 사용량 확인 | docker stats | |
| 로깅 | docker logs <컨테이너> | 컨테이너 로그 확인 | docker logs my_container |
| docker logs -f <컨테이너> | 실시간 로그 스트리밍 | docker logs -f my_container | |
| 명령 전달 | docker exec <컨테이너> <명령> | 실행 중 컨테이너에 명령 전달 | docker exec my_container bash |
| 호스트 ↔ 컨테이너 파일 복사 | docker cp <호스트 경로> <컨테이너>:<경로> | 호스트 → 컨테이너 파일 복사 | docker cp test.txt my_container:/root/ |
| docker cp <컨테이너>:<경로> <호스트 경로> | 컨테이너 → 호스트 파일 복사 | docker cp my_container:/root/test.txt ./ | |
| 중단/재개/삭제 | docker stop <컨테이너> | 실행 중인 컨테이너 중단 | docker stop my_container |
| docker start <컨테이너> | 중단된 컨테이너 실행 | docker start my_container | |
| docker restart <컨테이너> | 컨테이너 재시작 | docker restart my_container | |
| docker rm <컨테이너> | 컨테이너 삭제 | docker rm my_container | |
| Interactive 모드 | docker run -it <이미지> <명령> | 터미널 상호작용 모드 실행 | docker run -it ubuntu bash |
| exit | 컨테이너 내부에서 빠져나오기 | - |
도커 파일 작성
Docker는 Dockerfile을 보고 이미지를 만듭니다.
이 이미지는 나중에 컨테이너로 실행될 수 있습니다.

가장 기본적인 명령어들을 알아봅시다!
- FROM: 베이스 이미지를 지정합니다.
- RUN: 컨테이너 내에서 명령어를 실행합니다.
- CMD: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
- COPY: 파일을 호스트 시스템에서 이미지로 복사합니다.
- ENV: 이미지의 환경변수를 지정합니다.
- WORKDIR
- Dockerfile 내에서 작업 디렉토리를 설정합니다.
- 이후의 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령어는 이 디렉토리를 기준으로 실행됩니다.
- 디렉토리가 존재하지 않으면 자동으로 생성되며 절대경로나 상대경로 모두 사용 가능합니다.
다음과 같은 시나리오를 예로 들 수 있겠죠
hello.py
import os # 운영체제 환경 변수 접근을 위한 모듈
import sys # 실행 시 전달되는 인자(argv)를 다루기 위한 모듈
# 환경 변수 my_ver을 가져옴 (Dockerfile에서 ENV로 설정 예정)
my_ver = os.environ["my_ver"]
# 실행 시 첫 번째 인자를 가져옴 (python hello.py <arg> 형태)
arg = sys.argv[1]
# 결과 출력
print("hello %s, my version is %s!" % (arg, my_ver))
여기서 핵심은 환경 변수(my_ver)와 실행 인자(guest)를 모두 다룬다는 점입니다.
이를 도커 컨테이너에서 실행하기 위해 Dockerfile을 작성합니다.
Dockerfile
# 베이스 이미지 지정: Ubuntu 20.04 사용
FROM ubuntu:20.04
# 패키지 목록 업데이트 후 curl과 python-dev 설치
# python-dev는 Python 개발 관련 헤더파일(2.x 계열에서 주로 사용)
RUN apt-get update \
&& apt-get install -y \
curl \
python-dev
# 컨테이너 내 작업 디렉토리 설정
WORKDIR /root
# 현재 디렉토리의 hello.py를 컨테이너 내부 /root 로 복사
COPY hello.py .
# 환경 변수 my_ver 설정 (hello.py에서 읽음)
ENV my_ver 1.0
# 컨테이너 시작 시 실행할 기본 명령 지정
# python hello.py guest 실행
CMD ["python", "hello.py", "guest"]
여기서 ENV my_ver 1.0은 컨테이너 내부 환경 변수를 설정하는 부분이고,
CMD는 컨테이너 실행 시 기본적으로 실행되는 명령입니다.
Dockerfile을 작성했다면 이제 빌드해야 합니다.
# 이미지 빌드
docker build . -t hello:1
성공적으로 빌드되면 hello:1 이라는 이름의 이미지가 생성됩니다.
이제 실행해보겠습니다.
docker run hello:1
# hello guest, my version is 1.0!
docker run hello:1 echo "hello world!"
# hello world!
docker run hello:1 cat hello.py docker run hello:1 pwd
# /root
docker run -e my_ver=1.5 hello:1
# hello guest, my version is 1.5!
여기서 주의할 점은 CMD는 기본 실행 명령일 뿐, docker run 뒤에 명령을 붙이면 override된다는 점입니다.
또한 컨테이너 안의 파일을 확인하거나 현재 디렉토리를 출력할 수도 있습니다.
그리고 -e 옵션을 사용하면 환경 변수를 덮어쓸 수 있습니다.
Dockerfile 심화
ARG
ARG는 빌드 시점에 값을 전달할 수 있는 변수입니다.
즉, 이미지를 만들 때 값을 정하고 싶을 때 사용합니다.
ARG my_ver=1.0
위와 같이 도커파일이 작성 되었을 때,
docker build . -t hello:2 --build-arg my_ver=2.0
docker run hello:2
# hello guest, my version is 2.0!
실행 시점에 arg옵션으로 덮어씌우기가 가능합니다.
ENTRYPOINT
ENTRYPOINT는 실행 명령을 강제로 고정시킵니다.
즉, docker run 뒤에 다른 명령을 줘도 무시됩니다.
ENTRYPOINT ["python", "hello.py", "guest"]
docker run hello:3
# hello guest, my version is 1.0!
docker run hello:3 echo "hello"
# hello guest, my version is 1.0! ← 무조건 hello.py 실행
하지만 ENTRYPOINT에서 guest를 제거하면 실행 인자를 받을 수 있습니다.
ENTRYPOINT ["python", "hello.py"]
docker run hello:4 new-guest
# hello new-guest, my version is 1.0!
정리하면
- CMD: 기본 실행 명령, docker run 인자로 쉽게 덮어쓸 수 있음
- ENTRYPOINT: 실행 명령 고정, 파라미터만 전달 가능
도커 실행 고급
Network
컨테이너는 기본적으로 독립된 네트워크 환경을 가집니다.
-p 옵션을 사용하면 호스트 포트와 컨테이너 포트를 연결할 수 있습니다.
docker run -p 5000:80 -d nginx
curl localhost:5000
# Nginx 환영 페이지 출력
nginx의 기본 환영 페이지는 80포트에 열려있지만
위 -p옵션으로 5000포트와 연결시켜 컨테이너 내부의 80포트와 맵핑시킬 수 있습니다.
Volume
-v 옵션을 사용하면 호스트와 컨테이너 간에 디렉토리를 공유할 수 있습니다.
이 기능을 사용하면 컨테이너가 종료되어도 데이터가 유지됩니다.
docker run -p 6000:80 -v $(pwd):/usr/share/nginx/html/ -d nginx
echo hello! >> $(pwd)/hello.txt
curl localhost:6000/hello.txt
# hello!
Entrypoint
ENTRYPOINT는 강력하지만, 가끔은 명령을 덮어쓰고 싶을 때가 있습니다.
그럴 땐 --entrypoint 옵션을 활용합니다.
FROM ubuntu:18.04
ENTRYPOINT ["echo"]
docker run lets-echo hello
# hello
docker run lets-echo cat /etc/passwd
# cat /etc/passwd (문자열 그대로 출력됨)
docker run --entrypoint=cat lets-echo /etc/passwd
# 실제 파일 내용 출력
User
보안 강화를 위해 컨테이너 실행 시 기본 유저를 root가 아닌 일반 사용자로 바꿀 수도 있습니다.
FROM ubuntu:18.04
RUN adduser --disabled-password --gecos "" ubuntu
USER ubuntu
docker run -it my-user bash
ubuntu@컨테이너:/$
apt update
# Permission denied (root 권한 없음)
docker run --user root -it my-user bash
root@컨테이너:/$
apt update
# 정상 실행
유저의 따른 권한으로 컨테이너 내부의 권한 지정이 가능해지지요.
마무리
도커에 대해 알아봤습니다.
쿠버네티스는 이러 도커 특징을 잘 이용해 단순 하나의 서버에 뿐만 아니라,
여러 서버에 여러 컨테이너를 어떻게 잘 실행시킬 것인지 집중합니다.
다음 글부턴 본격적으로 쿠버네티스에 대해 알아보겠습니다.
# 모든 컨테이너 삭제
docker rm $(docker ps -aq) -f
# 모든 이미지 삭제
docker rmi $(docker images -q) -f
'개발 > DevOps' 카테고리의 다른 글
| [Kubernetes] 쿠버네티스 설치 과정 및 트러블슈팅 정리 (0) | 2025.09.16 |
|---|---|
| [Kubernetes] 쿠버네티스란? (0) | 2025.09.09 |
| [Kubernetes] Docker 기초 1 - 개념정리 (0) | 2025.09.08 |
| [DevOps] Raspberry로 서버 구축하기 (0) | 2025.07.05 |