Docker는 git하고 비슷한 성격을 가지고 있다.
Docker Image
Docker Image는 OS와 소프트웨어 환경(Library Dependency)들을 Container라는 형태로 저장이 되어서 가상공간 형태로 운영이 되도록 도와주는 형태입니다.
즉,
1) A…..Z라는 컴퓨터가 있다고 할때, 사용자에 따라 모든 OS환경과 Library Dependency가 다르다.
이에 linux OS 버전의 Docker Image를 통해서 로컬 컴퓨터안에 가상의 환경을 만들고 똑같은 OS버전으로 개발을 할 수 있다.
2) 또한 어떤 개발중인 Software가 있다고 가정을 할때, 다른 분들과 코업하기 위해서 테크리드가 개발중인 software OS버전과 Library Dependency를 공유를 해야할때, 개발환경을 Docker Image를 이용하여서 다른분들께 공유를 하여서, 도커 환경으로부터 동일한 개발환경에서 개발을 할 수 있다.
이것에 대한 이점은 개발환경에 맞게 모든 OS에 설치할 필요가 없고, 도커 이미지를 이용하여서 가상 개발환경에서 바로 시작할수 있다.
git처럼 docker에서 image를 공유하고 있기 때문에 docker서버에 사용하고자 하는 이미지가 존재 한다면
하면 된다.
또한 git repo처럼 누군가 만들어놓은 사용자의 image를 다운받아서 container로 바로 사용할 수 있다.(container는 docker image기반으로 생성된 가상환경 개발공간이다. 좀 있다 추가적인 설명을 할 것이다.)
Docker Image를 만드는 방법은 두가지가 있다. Docker Container로부터 이미지를 만드는 방법과 Dockerfile(shell script)으로 부터 도커 이미지를 만들수 있다.
Docker Container에서 추가적으로 개발이 되었던 애들을 image로 만들어 공유를 하는 방법과 shelll script type의 Dockerfile을 이용하여서 이미지를 만드는 방법이 있다.
첫번째 방법은 block box느낌의 image를 만드는 것이고, Dockerfile를 이용하여 이미지를 만드는 것은 일정 default 개발환경으로 만들어서 쓰는 것이다.
회사에서는 후자가 많이 쓰인다. 관리가 편하고 트래킹하기 쉽기 때문이다.
Image빌드하는 방법은 DockerFile일때
을 써주면 된다.
container에서 image를 만드는 방법은 구글링하면 많이 나오기 때문에 확인하여서 하면 될 것같다.
Docker Container
Docker Container는 VM과 같다. Docker Image로부터 Docker Container를 만들고, 로컬한 환경에서 개발을 하는 것이다.
로컬에서 개발된 container는 Docker Image를 만들거나 사용되었던 Dokcer Images간에 하나의 이미지로 Merge도 할 수 있고, 꾸준히 update할 수 있다.
Docker Container를 생성하고 실행하는 것은 쉽다.
생성
docker run -i -t --name test_env osrf/ros /bin/bash
실행
docker exec -t -i test_env /bin/bash
도커환경 설정은 생성할때도 –env를 이용하여서 컨터에너 configuration을 정할 수 있지만, 이후 container에 대한 configuration을 바꾸고 싶다면.
docker update "container id" --env
이런식으로 configuration을 바꿀수 있다.
기타
Docker Compose는 컨터에너 이름 및 속성을 설정할때 사용된다. dockerfile과 마찬가지로, 일정한 Container(개발환경)을 배포하기 위해서 사용이 된다.
그 외에 docker를 더 알아보고 싶다면 아래 링크를 보면 될 것이다.
Docker Tutorial
Docker Ros
심플 명령어
docker realsense ros
그외 잡다한 노트
Docker for Realsense
MAINTINER : CHANGYOLEE
CREATE DOCKERFILE SCRIPT FOR IMAGE OF REALSENSE SDK and (Optional REALSENSE ROS WRAPPER)
TAKE A LOOK AT DOCKERFILE SCRIPT AND LEVERAGE IT TO YOUR DOCKER IMAGE BUILD WORKSPACE
THANK YOU
HOW TO TEST
docker run --rm --net=host --privileged --volume=/dev:/dev -it osrf/ros:noetic-desktop-full /bin/bash -i -c 'roslaunch realsense2_camera rs_rgbd.launch enable_pointcloud:=true align_depth:=false depth_registered_processing:=true align_depth:=true'
If you would like to change ROS_MASTER_URI,
docker run --rm --net=host --privileged --volume=/dev:/dev -it osrf/ros:noetic-desktop-full /bin/bash -i -c 'rossetmaster TARGET_IP; roslaunch realsense2_camera rs_rgbd.launch enable_pointcloud:=true align_depth:=false depth_registered_processing:=true align_depth:=true'
run : execute
--rm : remove container id
# https://bluese05.tistory.com/38
-- net : host( 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게 된다)
# Privilige mode
https://tttsss77.tistory.com/153
# Volume
https://www.daleseo.com/docker-volumes-bind-mounts/
# -it
container id
# bin/bash
A Dockerfile for a database engine may run the database command by default. In that case, if you needed an interactive shell, you'll need to do docker run ... /bin/bash . In general, you can't assume that docker run will give you an interactive shell. It's safer to specify /bin/bash if you need a shell.
The key here is the -i argument which instructs bash to act as it has been invoked as an interactive shell. This causes bash to read initialization file ( bashrc files etc)
-c <-https://stackoverflow.com/questions/27631916/what-does-c-mean-as-an-argument-to-bash
## Tutorial
https://jmook.tistory.com/7
# FROM COMMAND MEAN IN DOCKERFILE
https://stackoverflow.com/questions/54000157/purpose-of-from-command-docker-file
https://sseongju1.tistory.com/38
sudo docker run --rm -it --name=test 2c58d7c12e71
// 맨뒤에는 docker image id
DOCKERFILE
FROM osrf/ros:noetic-desktop-full
# LABEL maintainer="changyolee changyolee@hyundai.com"
ENV ROS_DISTRO noetic
# RUN apt -q -qq update && \
# DEBIAN_FRONTEND=noninteractive apt install -y \
# software-properties-common \
# wget \
# apt-transport-https
RUN apt-get update && apt-get install -y git
RUN git clone https://id:passwords@gitserver.com/realsense_sdk.git
RUN cd realsense_sdk/RealsenseSDK
RUN chmod +x ./usr
RUN yes | cp -r realsense_sdk/RealsenseSDK/usr /
# APT INSTALL
# RUN apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
# RUN add-apt-repository -y "deb https://librealsense.intel.com/Debian/apt-repo xenial main"
# RUN apt-get update -qq
# RUN apt-get install librealsense2-dkms --allow-unauthenticated -y
# RUN apt-get install librealsense2-dev --allow-unauthenticated -y
#
######### TEST REALSENSE module[CAN SKIP IF ROS CAMERA DIRECTLY DEPLOY BY CI/CD]
######### WHICH MEANS ONLY INSTALL REALSENSE SDK ABOVE SCRIPT
######### SCRIPT THE BELOW IS TEST REALSENSCE ROS WRAPPER RUN OR FAIL BY OUR REALSENSE ROS WRAPPER
######### IF YOU WANT TO MAKE IMAGE OF BOTH OF REALSENSE SDK AND ROS-WAPPER THEN, USE BELOW SCRIPT
######### OTHERWISE SKIP
RUN apt-get -q -qq update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --allow-unauthenticated \
python3-rosinstall \
python3-catkin-tools \
ros-${ROS_DISTRO}-jsk-tools \
ros-${ROS_DISTRO}-rgbd-launch \
ros-${ROS_DISTRO}-image-transport-plugins \
ros-${ROS_DISTRO}-image-transport
RUN rosdep update
RUN mkdir -p /catkin_ws/src && cd /catkin_ws/src && \
git clone --depth 1 https://id:passwords@gitserver.com/realsense_ros_wrapper.git && \
git clone --depth 1 https://github.com/pal-robotics/ddynamic_reconfigure
RUN cd catkin_ws;
RUN mv /bin/sh /bin/sh_tmp && ln -s /bin/bash /bin/sh
RUN source /opt/ros/${ROS_DISTRO}/setup.bash; cd catkin_ws; catkin build -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
RUN rm /bin/sh && mv /bin/sh_tmp /bin/sh
RUN touch /root/.bashrc && \
echo "source /catkin_ws/devel/setup.bash\n" >> /root/.bashrc && \
echo "rossetip\n" >> /root/.bashrc && \
echo "rossetmaster localhost"
RUN rm -rf /var/lib/apt/lists/*
COPY ./ros_entrypoint.sh /
ENTRYPOINT ["/ros_entrypoint.sh"]
CMD ["bash"]