1. 기본 명령어 (Host에서 실행)

  • 도커 이미지 리스트 확인
    $ sudo docker images
    
  • 도커 컨테이너 리스트 확인
    $ sudo docker ps -a     # 모든 컨테이너 리스트
    $ sudo docker ps        # 실행 중인 컨테이너 리스트
    
  • 도커 컨테이너 이름 변경
    $ sudo docker rename ${변경 전 이름} ${변경 후 이름}
    
  • 도커 이미지 삭제
    $ sudo docker image rm ${삭제할 이미지}
    
  • 도커 컨테이너 삭제
    $ sudo docker container rm ${삭제할 이미지}
    
  • 도커 GUI 가능하도록 설정
    $ sudo apt install x11-server-utils
    $ xhost +
    


2. 도커 이미지 빌드

(1) Dockerfile 생성

도커파일을 만들어 빌드하면 이미지를 생성할 수 있다.

확장자명 없이 Dockerfile_ros_noetic과 같이 원하는 파일명으로 도커파일을 생성한다.

아래 파일 내용은 ROS Noetic이 설치된 도커 이미지를 만드는 파일이다.

FROM ubuntu:20.04

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

RUN apt update && apt install -y apt-utils gedit git locales lsb-release gnupg2 curl tmux vim

# Install ROS Noetic
RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
RUN apt update && apt install -y ros-noetic-desktop-full python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

RUN rosdep init
RUN rosdep update

RUN mkdir -p /root/ros_ws/src

RUN echo "" >> /root/.bashrc
RUN echo "### ros" >> /root/.bashrc
RUN echo "source /opt/ros/noetic/setup.bash" >> /root/.bashrc
RUN echo "source ~/ros_ws/devel/setup.bash" >> /root/.bashrc
RUN echo "" >> /root/.bashrc
RUN echo "alias cw='cd ~/ros_ws'" >> /root/.bashrc
RUN echo "alias cs='cd ~/ros_ws/src'" >> /root/.bashrc
RUN echo "alias cm='cd ~/ros_ws && catkin_make && source ~/.bashrc'" >> /root/.bashrc
RUN echo "" >> /root/.bashrc
RUN echo "export ROS_HOSTNAME=localhost" >> /root/.bashrc
RUN echo "export ROS_MASTER_URI=http://localhost:11311" >> /root/.bashrc

CMD ["/bin/bash"]

(2) Dockerfile 빌드

아래 명령어를 실행하여 도커파일을 빌드한다.

$ docker build -t ${생성할 이미지 이름} -f ${도커파일 이름} .
$ docker build -t smkang0521/ros:noetic -f Dockerfile_ros_noetic .      # 예시

(3) 도커허브에 이미지 업로드

도커허브에 이미지를 업로드 해두면 항상 도커파일을 빌드할 필요 없이 다운로드 받아 사용할 수 있다.

a. 도커허브 로그인

업로드 하기 전에 아래 명령어를 통해 도커허브에 로그인한다.

$ docker login

로그아웃은 아래 명령어를 입력한다.

$ docker logout

b. 이미지 업로드

이미지를 업로드 하기 전에 이미지의 tag를 변경해야 하는 경우에 아래와 같이 수정한다.

도커허브에 업로드 하기 위해서는 계정이름/저장소:태그 형식으로 만들어 올려야 한다.

$ docker tag ${기존 이미지 이름} ${변경할 이미지 이름}
$ docker tag ros:foxy smkang0521/ros:foxy       # 예시

아래 명령어를 실행하여 이미지를 업로드 한다.

$ docker push ${이미지 이름}
$ docker push smkang0521/ros:foxy       # 예시

도커허브에서 이미지를 다운받기 위해서는 아래 명령어를 실행한다.

$ docker pull ${이미지 이름}
$ docker pull smkang0521/ros:foxy       # 예시


3. 도커 컨테이너 생성

도커 컨테이너는 docker run 명령어를 통해 생성한다.

docker run을 실행하면 이미지가 로컬에 없는 경우에 자동적으로 이미지를 다운로드 후에 컨테이너를 만든다.

이때, 넣을 수 있는 옵션이 많기 때문에 스크립트로 만들어 사용하는 것이 편하다.

기본적인 도커 컨테이너를 생성하는 docker_run.sh 파일 예시는 아래와 같다.

#!/bin/bash

CONTAINER_NAME=ros_noetic           # 생성할 컨테이너 이름
IMAGE_NAME=smkang0521/ros:noetic    # 사용할 이미지 이름

docker run --name=${CONTAINER_NAME} --ipc=host --net=host --privileged -it \
--gpus all \                                # NVIDIA GPU 사용시에 옵션
--device /dev/snd \
-e DISPLAY=$DISPLAY \
-e NVIDIA_VISIBLE_DEVICES=all \             # NVIDIA GPU 사용시에 옵션
-e NVIDIA_DRIVER_CAPABILITIES=all \         # NVIDIA GPU 사용시에 옵션
-e QT_X11_NO_MITSHM=1 \
-e PULSE_SERVER=unix:${XDG_RUNTIME_DIR}/pulse/native \
-v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native \
-v /home/${USER}/.config/pulse/cookie:/root/.config/pulse/cookie \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /dev:/dev \
--group-add $(getent group audio | cut -d: -f3) \
${IMAGE_NAME} /bin/bash
  • Jetson에서 컨테이너 생성할 때는 --gpus all 옵션을 빼고 실행한다.
  • 내장 GPU를 연결하기 위해서는 NVIDIA 관련 옵션을 빼고 --device /dev/dri --group-add=$(stat -c "%g" /dev/dri/render*) 옵션을 넣는다.
  • WSL2에서 내장 GPU를 연결하기 위해서는 NVIDIA 관련 옵션을 빼고 --device /dev/dxg -v /usr/lib/wsl:/usr/lib/wsl 옵션을 넣는다.


Updated: