직관적인느낌

Docker 명령어 정리 – 실전 가이드 본문

공학/시스템 설치 및 설정

Docker 명령어 정리 – 실전 가이드

범슐랭 2025. 2. 20. 08:15
728x90
반응형

Docker를 사용하다 보면 컨테이너 실행, 관리, 이미지 저장 및 전송 등 여러 작업을 수행하게 됩니다. 이번 포스트에서는 실제로 사용했던 Docker 명령어들을 정리하고, 각 명령어의 역할과 사용 방법을 자세하게 소개합니다.


1. 컨테이너 실행 및 사용자 설정

1.1 기본 컨테이너 실행

Ubuntu 22.04 이미지를 사용하여 컨테이너를 실행할 때는 아래와 같이 실행합니다.

sudo docker run -it --name my_ubuntu -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix ubuntu:22.04 bash
  • -it: 인터랙티브 모드와 터미널 연결
  • --name: 컨테이너에 이름 부여
  • -e DISPLAY=$DISPLAY & -v /tmp/.X11-unix:/tmp/.X11-unix: X11 GUI 애플리케이션 실행을 위한 설정

1.2 루트가 아닌 사용자(예: robot) 생성 및 전환

보안을 위해 루트가 아닌 일반 사용자로 작업하는 것이 좋습니다. 컨테이너 내부에서 아래 명령어로 사용자를 생성합니다.

# 컨테이너 내부 (root 상태)
adduser robot
 

 

생성 후, 필요한 경우 robot 사용자에게 sudo 권한을 부여합니다.

apt update && apt install -y sudo
usermod -aG sudo robot
echo 'robot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

 

 

그 후, 사용자를 전환합니다.

su - robot
 

2. 컨테이너 관리 명령어

2.1 컨테이너 종료하기

컨테이너 내부에서 단순히 쉘을 종료하려면:

exit
 

 

또한, 호스트에서 컨테이너 전체를 종료할 때는:

sudo docker stop my_ubuntu

2.2 컨테이너 삭제하기

종료한 컨테이너를 완전히 삭제하려면:

sudo docker rm my_ubuntu

 

 

실행 중인 컨테이너를 강제로 삭제하려면:

sudo docker rm -f my_ubuntu

2.3 실행 중인 컨테이너 목록 확인

현재 실행 중이거나 종료된 컨테이너 목록을 보려면:

sudo docker ps -a

3. 이미지 생성 및 관리

3.1 컨테이너를 이미지로 커밋(저장)하기

현재 컨테이너의 상태를 새로운 Docker 이미지로 저장하려면 docker commit을 사용합니다.

sudo docker commit <컨테이너_ID> <새_이미지_이름>

 

예시:

sudo docker commit 975fc8b2e8d0 ubuntu_slamnav2_v2

3.2 이미지 목록 확인

저장된 Docker 이미지 목록을 확인하려면:

sudo docker images

3.3 이미지 파일로 저장하여 내보내기

Docker 이미지를 tar 파일로 내보내 Windows 등 다른 환경으로 전송할 수 있습니다.

sudo docker save -o ubuntu_slamnav2_v2.tar ubuntu_slamnav2_v2

3.4 이미지 파일 로드하기

다른 시스템(예: Windows)에서 이미지를 가져오려면 다음 명령어를 사용합니다.

docker load -i "C:\Users\lbj14\Documents\ubuntu_slamnav2_v2.tar"

※ Windows에서 파일 경로가 정확한지, 파일 소유권과 권한에 문제가 없는지 확인하세요.

3.5 사용하지 않는 이미지 삭제

불필요한 이미지를 삭제하여 디스크 공간을 확보할 수 있습니다.

sudo docker rmi <이미지_이름>

 

예시:
sudo docker rmi ubuntu_slamnav2_v2

 

또는 모든 중지된 컨테이너 및 사용하지 않는 이미지를 한 번에 정리하려면:
sudo docker system prune -a

4. 컨테이너 리소스 및 환경 최적화

실시간 SLAM, Navigation과 같이 성능이 중요한 애플리케이션에서는 Docker 컨테이너의 오버헤드가 거의 없지만, 몇 가지 최적화 옵션을 적용할 수 있습니다.

4.1 CPU 및 메모리 할당 제한

컨테이너에 특정 CPU나 메모리 리소스를 할당하여 다른 프로세스와의 간섭을 줄일 수 있습니다.

docker run --cpuset-cpus="0,1" --cpu-shares=1024 ...

4.2 네트워크 및 I/O 최적화

실시간성이 중요하다면 --network host 옵션을 사용하여 네트워크 오버헤드를 줄일 수 있습니다.

docker run --network host ...

 


5. USB 카메라 연결 및 스트리밍 테스트

실시간 센서 데이터 처리가 중요한 경우, USB 카메라와 같은 장치도 Docker 컨테이너에 연결하여 사용할 수 있습니다.

5.1 USB 카메라 장치 확인 (호스트)

먼저 호스트에서 카메라 장치 확인:

ls /dev/video*

5.2 컨테이너 실행 시 USB 장치 마운트

예를 들어, /dev/video4와 /dev/video5를 전달하려면:

sudo docker run -it --name my_slamnav2 \ --device /dev/video4:/dev/video4 \ --device /dev/video5:/dev/video5 \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ ubuntu_slamnav2 bash

5.3 실시간 영상 스트리밍 테스트 (ffmpeg)

컨테이너 내부에서 ffmpeg를 설치한 후 스트리밍을 테스트합니다.

sudo apt update
sudo apt install -y ffmpeg
ffmpeg -f v4l2 -i /dev/video0 -vf "scale=640:480" -f sdl "Live Camera"
 

 

또는 GStreamer를 사용할 수도 있습니다.

sudo apt install -y gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink

6. 컨테이너 로그 외부 저장 방법

실행되는 애플리케이션의 로그를 컨테이너 내부가 아닌 호스트에 저장하려면 두 가지 방법이 있습니다.

6.1 호스트 디렉토리 마운트

컨테이너 실행 시 로그 저장 디렉토리를 마운트합니다.

 
sudo docker run -it --name my_slamnav2 \ 
	-e DISPLAY=$DISPLAY \ 
    -v /tmp/.X11-unix:/tmp/.X11-unix \ 
    -v /home/lee/docker_logs:/home/robot/slamnav2/logs \ 
    ubuntu_slamnav2 bash

컨테이너 내부에서 생성되는 /home/robot/slamnav2/logs 파일은 호스트의 /home/lee/docker_logs에 실시간으로 저장됩니다.

6.2 표준 출력 리디렉션

컨테이너 실행 시 표준 출력을 파일에 기록하는 방법도 있습니다.

 
sudo docker run -it --name my_slamnav2 \ 
	-e DISPLAY=$DISPLAY \ 
    -v /tmp/.X11-unix:/tmp/.X11-unix \ 
    ubuntu_slamnav2 bash | tee /home/lee/docker_logs/slamnav2_output.log

※ 단, 이 경우에는 호스트에 /home/lee/docker_logs 디렉토리가 미리 생성되어 있어야 합니다.


7. 마무리 및 참고 사항

이번 포스트에서는 Docker를 사용하여 Ubuntu 기반 SLAM/Navigation 환경을 구축하는 과정과 함께,

  • 컨테이너 실행 및 사용자 설정
  • 컨테이너 종료, 삭제 및 이미지 커밋
  • 이미지 저장 및 Windows 전송 방법
  • 리소스 최적화 및 USB 장치 연결, 영상 스트리밍 테스트
  • 컨테이너 로그를 외부에 저장하는 방법

등을 자세하게 다루었습니다.

Docker는 가상 머신보다 오버헤드가 적어 실시간 애플리케이션에도 거의 네이티브 수준의 성능을 제공하지만,
리소스 제한, 네트워크 설정, I/O 최적화 등 몇 가지 추가 설정을 통해 보다 안정적인 운영 환경을 구축할 수 있습니다.

이 글이 Docker 기반 로봇 애플리케이션 개발 및 운영에 도움이 되길 바랍니다. 질문이나 추가 논의가 필요하다면 댓글이나 메일로 연락주세요!

728x90
반응형