컨테이너는 코드와 그 종속성을 하나로 묶어, 어느 환경에서나 똑같이 돌아가게 해주는 표준 단위입니다. 그 관리를 단순하게 만들어주는 대표 런타임이 Docker죠. 설치부터 기본 명령어까지 정리해 둘게요.
설치 (Ubuntu)
Docker 공식 저장소를 등록해서 설치합니다. 예전 문서들이 focal(20.04) 같은 코드명을 하드코딩해두는 경우가 많은데, 아래처럼 $(. /etc/os-release && echo "$VERSION_CODENAME") 를 쓰면 배포판 버전에 상관없이 동작합니다.
apt-get update
apt-get install -y ca-certificates curl gnupg
# 공식 GPG 키 등록
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# 저장소 등록 (현재 배포판 코드명 자동 사용)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
참고:
apt-key를 쓰는 오래된 방식은 더 이상 권장되지 않습니다. 위처럼signed-by키링 방식을 쓰세요.
이미지 다루기
docker search [이미지명] # 이미지 검색
docker pull [이미지명]:[태그] # 이미지 받기 (태그 생략 시 latest)
docker images # 받은 이미지 확인
컨테이너 생성과 실행
docker create 로 만들고 docker start 로 실행하는 게 기본 흐름이지만, 보통은 둘을 합친 docker run 을 씁니다.
주요 옵션은 이렇습니다.
| 옵션 | 설명 |
|---|---|
--name [이름] | 컨테이너 이름 지정 |
-p [호스트:컨테이너] | 포트 바인딩 (예: -p 8080:80) |
-v [호스트:컨테이너] | 볼륨 마운트 |
-e [변수=값] | 환경 변수 지정 |
-d | 백그라운드 실행 |
-i | 표준 입력 유지 (interactive) |
-t | 터미널 할당 (TTY) |
예시로 MySQL 컨테이너를 하나 띄워보면:
docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=[비밀번호] -d -p 3306:3306 mysql
컨테이너를 다시 시작하거나 재기동할 때는 docker start [이름], docker restart [이름] 을 씁니다.
상태 확인과 접속
docker ps # 실행 중인 컨테이너
docker ps -a # 중지된 것까지 전부
docker logs [컨테이너] # 로그 출력
# 컨테이너 내부에서 명령 실행
docker exec -it [컨테이너] /bin/bash
docker exec -it --user root [컨테이너] /bin/sh # 루트로 접속
docker attach 로 실행 중인 컨테이너에 붙어 로그를 실시간으로 볼 수도 있는데, 이때 컨테이너를 멈추지 않고 터미널만 빠져나오려면 Ctrl + P, Ctrl + Q 를 누릅니다. 그냥 exit 하면 컨테이너가 같이 종료될 수 있으니 주의하세요.
중지와 삭제
docker stop [컨테이너] # 실행 중인 컨테이너 중지
docker rm [컨테이너] # 컨테이너 삭제
docker container prune # 중지된 컨테이너 일괄 삭제
docker system prune # 중지 컨테이너 + 미사용 이미지 삭제
docker system prune --volumes # 미사용 볼륨까지 삭제
prune 계열은 편하지만 한 번에 많이 지우니, 특히 --volumes 는 데이터가 날아갈 수 있어 실행 전에 무엇이 지워지는지 꼭 확인하세요.
여기까지가 매일 쓰는 기본기입니다. 다음 글에서는 이미지를 직접 만드는 Dockerfile로 넘어갑니다.