.. Cover Letter

공부#Robotics#자율주행/docker

2. docker를 활용하는 방향으로 초점을 맞춰 배워보자.

BrainKimDu 2023. 3. 25. 00:55

pinkLab의 pinkwink 강사님 강의자료 (https://pinkwink.kr/)를 바탕으로 작성되었습니다.

우선 설치방법은 이전의 글을 참고하면 됩니다.


docker를 사용하기 위해서는 꼭 sudo 권한을 주어야한다.

sudo docker ps

해당 명령어를 사용하면 현재 실행 중인 도커 리스트 혹은 컨테이너를 조회할 수 있다. 

sudo docker image - docker images

다음의 명령어를 사용하면 현재 실행 중인 docker image를 조회할 수 있다.

hello-world는 처음 실행할때 켜보았던 그 이미지인 것으로 보입니다.

 

 

여튼 docker를 통해서 ubuntu 18.04를 받아와서 run을 시켜봅시다.

sudo docker pull ubuntu:18.04
sudo docker images
sudo docker run -it --name demo1 ubuntu:18.04 /bin/bash
  1. sudo: "superuser do"의 약어로, 시스템의 최고 권한인 슈퍼유저 권한으로 명령어를 실행할 수 있도록 해주는 명령어입니다.
  2. docker: 컨테이너 기반 가상화를 지원하는 오픈소스 프로젝트입니다.
  3. run: Docker 컨테이너를 실행하는 명령어입니다.
  4. -it: i는 컨테이너와 상호작용을 위한 표준 입력(stdin)을 활성화하고, t는 가상 터미널을 할당하여 명령어를 입력하고 출력할 수 있도록 해줍니다.
  5. --name demo1: 생성되는 컨테이너의 이름을 demo1으로 지정합니다.
  6. ubuntu:18.04: Docker Hub에서 제공하는 공식 ubuntu 이미지 중 18.04 버전을 사용합니다.
  7. /bin/bash: 실행할 명령어로, 컨테이너 내부에서 Bash 셸을 실행하도록 지정합니다.

이제 다시 터미널을 하나더 켠 후에

sudo docker ps

해당 명령어를 통해서 실행중인 docker 를 확인해보면 다음과 같습니다.

 

그래서 종료하는 방법은 두 가지가 있습니다. 도커를 실행한 터미널에서 exit로 종료하거나 다른 터미널로 docker의 이름을 통해 정지 시키거나 할 수 있습니다.

exit 
혹은
sudo docker stop demo1

 

이제 나만의 도커 이미지를 한 번 만들어봅시다. 이전에 했던 내용과 비슷하게 진행을 할 것입니다. 

우선 폴더를 하나 만들어봅시다. 이름은 docker-pracrice 라는 폴더입니다.

그러면 이제 Dockerfile이라는 파일을 하나 만듭시다. 이전에 배웠듯이 docker에대한 정보를 담고 있는 파일입니다.

이 상태에서  VScode를 실행합니다. 이제 코드를 작성해봅시다.

FROM ubuntu:18.04
RUN apt-get update
CMD ["echo", "Hello World"]

한줄 한줄 설명을 하자면
base image를 ubuntu 18.04로 설정합니다. 그럼 여기서 base image가 뭔가요? 컨테이너 이미지를 생성할 때 기반이 되는 이미지를 의미한다. Docker 이미지의 시작점이 되며, 이 이미지 위에 추가적인 레이어를 쌓아서 필요한 패키지, 라이브러리, 응용 프로그램 등을 설치하고 수정한 후 최종적으로 하나의 컨테이너를 만든다.

그래서 이러한 Base image는 공식 이미지나 커뮤니티에서 제공하는 이미지를 뜻하면서 대표적인 예로는 Ubuntu, centOS, Debian등의 Base image가 있습ㄴ다.

apt-get update 명령을 실행합니다.

DOCKER CONTAINER가 시작될 때, Hello World를 출력합니다.

 

 

여튼 이제 빌드를 해봅시다.

sudo docker build -t my-image:v1.0.0 .

맨뒤에 찍힌 .은 현재경로를 의미합니다. 그래서 결국 현재경로의 Dockerfile로 부터 my-image라는 이름과 v1.0.0이라는 태그로 이미지를 빌드하겠습니다. 라는 뜻입니다. 

sudo docker images

그래서 방금 만든 이미지가 만들어졌습니다. 그러면 이걸 이제 실행을 하면 다음과 같아집니다.

sudo docker run my-image:v1.0.0

 

 


그러면 이제 현실적인 예시를 들어가봅시다. 우선 제 컴퓨터는 ubuntu20.04가 설치되어 있으니 ubuntu22.04에서만 동작하는 프로그램인 ROS2 humble버전을 설치해봅시다.

sudo docker pull osrf/ros:humble-desktop

설치가 끝날때까지 기다립니다. 설치가 완료되면 바로 실행을 때립니다.

이 상태에서 turtlesim을 실행시켜 봅시다.

ros2 run turtlesim turtlesim_node

다음처럼 에러가 나와야합니다. 이 경우에 터미널을 하나 열어서 xhost를 docker와 연결시킵니다.

xhost +local:docker

또한 도커에서 외부display 자원을 빌려달라고 요청을 해야합니다. 다른 터미널에서 다음처럼 입력합니다.

sudo docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --network=host --name humble osrf/ros:humble-desktop

이렇게 실행을 한 후에 tutlesim을 실행시켜봅니다.
혹시 위의 명령어를 진행하다가 중간에 꺼버렸다면 다음의 명령어로 다시 들어올 수 있습니다.

중간에 --network=host가 중요한 키워드입니다. docker와 local의 네트워크는 서로 격리가 되어있는데, 이를 같은 네트워크 상으로 묶는 방법입니다. 이렇게 해주어야 Ros통신이 가능합니다. 

chatgpt의 말로는 네트워크를 동일하게 해야 한다고 합니다 그래서 다음의 옵션을 명령어 뒤에 추가하는 것이 어떻는가 합니다.

--network=host
sudo docker exec -it humble /bin/bash

 

이제 터틀봇을 구동시켜봅시다.

ros2 run turtlesim turtlesim_node

이제 다른  터미널을 열어서 ros2 node list를 입력하면 나온다.

sudo docker run -it osrf/ros:humble-desktop

그러면 지금현재 docker 상에서 ros 세상으로 node가 보이고 있다는 건데, 그러면 나의 터미널 foxy에서는 보일까?

보이지 않는다. 이걸 어떻게 해야하는 것일까? ros 도메인을 맞춰주어야한다. 그러기 위해서는 다음의 과정이 필요하다 도커에서 nano 에디터를 다운받은 후에 진행하자

sudo apt update
sudo apt install nano

여기서 ros_entrypoint.sh 를 건들여야한다. 

이 상태에서 ROS_DOMAIN을 추가해주자. 뒤에 숫자는 bashrc와 같게 해주어야한다.

export "ROS_DOMAIN_ID=13"

 

그 후 다시 실행을 시킨다.

source ros_entrypoint.sh

그래서 도커humble에서 실행시키고 foxy환경에서 node 를 확인할 수 있었습니다.

 

 

여기서 한가지 주의할 점은 설정을 변경한 도커이미지를 닫으면 내가 그동안 진행한 설정이 지워집니다. 그래서 실행 중인 도커를 종료하지 말고, 이미지를 commit해주어야합니다.

다른 터미널에서 진행을 합니다. 다음의 명령어를 입력합니다. 

sudo docker commit 585c5c9285df tmp_humble:0.1

 

그러면 이제 확인을 해보자. docker image ls를 통해서 방금 저장한 이미지를 확인한다.

방금 저장한 이미지가 보인다. 이제 방금 저장했던 이미지를 실행시켜보자.

sudo docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --name my_humble tmp_humble:0.1

다음처럼 입력하면된다. 

 

이런식으로 활용이 가능하다.


참고자료 및 참고 도서
pinkLab의 pinkwink 강사님 강의자료 (https://pinkwink.kr/)
Docker Documentaion https://docs.docker.com/get-started/ 

 

PinkWink

한 변두리 공학도의 블로그입니다. 재미있어 보이는 것들을 모두 기초스럽게 접근하는 블로그이며... 그보다 더욱 소중한 우리 아가 미바뤼의 발자취를 남겨두는 블로그이기도 합니다.

pinkwink.kr