Ubuntu 환경 구축을 위한 Docker 설치 및 핵심 운영 가이드

Docker 환경은 현대 소프트웨어 배포의 핵심으로, 주로 세 가지 주요 구성 요소로 이루어집니다.

  • 이미지 (Image): 시스템 파일 시스템과 같은 스냅샷입니다. 예를 들어 ubuntu:latest 이미지는 특정 버전의 리눅스 최소 시스템을 포함하고 있습니다.
  • 컨테이너 (Container): 정적인 정의인 이미지가 실제 실행되는 인스턴스입니다. 생성, 시작, 중지, 삭제 등의 수명 주기를 가집니다.
  • 레지스트리 (Repository): 이미지를 저장하고 관리하는 중앙 집중식 저장소 역할을 합니다.

이해해야 할 중요한 점은 이미지와 컨테이너가 분리되어 있다는 것입니다. run 명령어로 이미지를 시작하면 컨테이너가 생성되며, start 명령으로는 중지된 컨테이너만 재개할 수 있습니다. 또한 이미지 식별자와 컨테이너 식별자는 서로 다릅니다.

1. 환경 설정 및 설치 절차

Ubuntu 기반 시스템에서는 먼저 패키지 목록을 최신화한 후 도커를 설치합니다.

apt update && apt upgrade -y

1.1 Docker 엔진 설치

공식 문서에 따라 설치 패키지를 추가합니다. 이후 테스트 명령어를 통해 설치가 정상인지 확인합니다.

curl -fsSL https://get.docker.com | sh \
  --mirror Aliyun
# 혹은 공식 스크립트 사용
wget -qO- https://get.docker.com/ | sh

1.2 레지스트리 대역폭 최적화

속도 향상을 위해 로컬 또는 지역 캐시를 사용하는 도커 데몬 설정을 수정합니다.

cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

설정이 적용되도록 서비스를 다시 시작합니다.

systemctl daemon-reload
systemctl restart docker

1.3 사용자 권한 부여

루트 없이 도커 명령어를 실행하려면 현재 사용자를 도커 그룹에 등록해야 합니다. docker 사용 계정을 예시로 사용합니다.

id dev_user
usermod -aG docker dev_user

그룹 멤버십을 즉시 적용하려면 로그인을 다시 수행하거나 그룹을 새로고침해야 합니다.

newgrp docker

이제 다음 명령어를 통해 설치 완료 여부를 확인할 수 있습니다.

docker run hello-world

2. 주요 컴포넌트 제어 및 명령어

생성된 컨테이너나 이미지를 효과적으로 관리하기 위한 필수 명령어입니다.

2.1 컨테이너 수명 주기 관리

# 실행 중인 컨테이너 확인
docker ps -l

# 모든 상태의 컨테이너 나열
docker ps -a

# 지정된 컨테이너 중지 (SIGTERM)
docker stop container_id_1

# 중지된 컨테이너 시작
docker start container_id_1

# 컨테이너 강제 종료 후 제거
docker rm container_id_1

# 기존 이미지 제거 (사용되지 않을 경우)
docker rmi image_tag_v1

2.2 상호 작용 및 로그 조회

# 실행 중인 컨테이너 내부 터미널 진입
docker exec -it running_container_id bash

# 컨테이너 stdout/stderr 출력 확인
docker logs -f container_id_1

# 컨테이너 내부 프로세스 상태 확인
docker top container_id_1

2.3 이미지 조작 및 버전 관리

# 이미지 태그 변경 (재명명)
docker tag old_image_hash new_repository/new_image:v1.0

# 컨테이너를 새로운 이미지로 커밋
docker commit -m "업데이트 반영" container_id_2 custom_app:beta

# 백업을 위한 압축 저장
docker save -o backup_archive.tar image_name:v1.0

# 아카이브 파일 복원
docker load -i backup_archive.tar

2.4 컨테이너 내보내기 및 가져오기

# 실행 중인 컨테이너 파일시스템 덤프 (파일 형식: tar)
docker export container_id_3 > snapshot.tar

# 덤프된 파일을 새 이미지로 로드
docker import snapshot.tar new_source_image:v1

3. 데이터 영속성 및 외부 통신

3.1 볼륨 마운팅 주의사항

호스트 디렉토리를 컨테이너 경로에 연결할 때 경로 중첩 문제로 인해 파일 접근 오류가 발생할 수 있습니다. 호스트의 /var/data 를 컨테이너의 /mnt 에 매핑하면 호스트 디렉토리가 덮어써질 위험이 있으므로 명시적으로 서브폴더를 지정해야 합니다.

# 잘못된 예시 (디렉토리 덮어쓰기 발생 가능)
docker run -v /host/project:/root

# 권장 예시 (명확한 하위 경로 사용)
docker run -v /host/logs:/app/logs container_img

권한 문제는 유비티드 (UID) 불일치로 발생합니다. 컨테이너 내부에서 호스트 사용자 UID 와 일치하도록 사용자를 수정할 수 있습니다.

# 컨테이너 내에서 UID 확인
id

# 컨테이너 내 사용자 UID 변경 (호스트 기준 1000 을 가정)
usermod -u 1000 app_user

3.2 파일 전송 메커니즘

컨테이너 간에는 직접 전송이 불가능하며, 반드시 호스트를 경유해야 합니다.

# 호스트 -> 컨테이너 복사
docker cp ./local_config.txt container_target:/config/local_config.txt

# 컨테이너 -> 호스트 복사
docker cp container_target:/config/app.ini ./backup/app.ini

3.3 네트워크 포트 노출

외부 접근을 위해 포트 매핑이 필요합니다. -p 플래그를 사용하여 다양한 바인딩 옵션을 선택할 수 있습니다.

# 모든 인터페이스에서 포트를 매핑 (호스트:포트 => 컨테이너:포트)
docker run -p 8080:80 nginx:latest

# 로컬 루프백 인터페이스만 제한하여 매핑
docker run -p 127.0.0.1:3000:80 nginx:latest

# 호스트 IP 주소 지정 매핑
docker run -p 192.168.1.50:5000:8080 nginx:latest

4. 기타 시스템 통합

4.1 시간 동기화

컨테이너 내부 시간이 호스트와 다르게 설정될 경우 문제가 발생할 수 있으며, zoneinfo 파일을 복사하여 해결할 수 있습니다.

docker cp /usr/share/zoneinfo/Asia/Seoul container_id:/etc/localtime

4.2 자동 시작 서비스 연동

시스템 부팅 시 자동으로 관련 스크립트가 실행되도록 설정하려면 초기화 스크립트를 등록합니다.

# ~/.bashrc 또는 rc.local 에 해당 라인 추가
. /etc/init.d/docker_start_script.sh

4.3 GPU 드라이버 지원

NVIDIA GPU 가속이 필요한 환경에서는 커널 모듈 충돌 가능성이 존재합니다. nvidia-uvm 모듈이 로드된 상태로 검출되면 CUDA 프로그램이나 X 서버와의 충돌로 보고됩니다. 이러한 이슈는 커널 업데이트나 드라이버 버전 매칭을 통해 해결해야 하며, 컨테이너 환경에서는 device-mapper 모드를 점검하는 것이 좋습니다.

태그: docker ubuntu linux Containerization system-admin

8월 18일 08:38에 게시됨