본문 바로가기

SmartHome. IoT/SmartHome 기본

라즈베리 초보자를 위한, Docker의 개념에 대한 이해.

728x90
반응형

안녕하세요? 레이군 입니다.

오늘 적어볼건, 라즈베리파이 사용자라면 많이 들어봤고, 시도도 해보고, 실패도 해보고 하는...

Docker 입니다.

글의 순서는 다음과 같습니다.

1. Docker 란 무엇인가?

2. Docker 에서 host OS의 폴더/파일 사용하기

3. Docker 컨테이너에 프로그램 설치하기

4. Docker 컨테이너의 파일 수정하기

5. 기타 응용

1. Docker 란 무엇인가?

우선 Docker 가 무엇인지 알아야겠죠?

Docker란, 일종의 가상머신(VM) 이라고 볼 수 있습니다.

윈도우라면 VMWARE 나 버추얼박스 같은 가상화용 솔루션과 비슷합니다.

다만, VM쪽과는 큰 차이가 있는데요, 그건 호스트의 하드웨어와 OS를 공유한다는 겁니다.

(단순화 해서 그렸습니다. 사실 저 중간에 이런저런것들이 더 들어갑니다만, 대략 느낌은 이런식입니다.)

VM환경 같은 경우는, 실행하고 있는 하드웨어나 OS가 뭐든 상관 없이 VM용 하드웨어를 새로 만듭니다.

그래서 인텔 CPU기반 윈도우에서 ARM CPU용 VM 하드웨어를 만들어서 리눅스를 올려볼수도 있죠.

장점은 사용중인 하드웨어 / OS상태에 별로 구애받지 않고 새로운 가상머신을 만들 수 있습니다.

그로인한 단점은, OS부터 새로 깔아야 한다는거죠.

Docker는 하드웨어와 OS(전체는 아니고, 커널부분) 을 공유하고, 그 외의 부분은 이미지에 따라 독립적으로 동작합니다.

그로인해 H/W와 OS 타입만 같다면 동일한 조건으로 동작시킬 수 있고,

그렇기 때문에 셋팅을 다 맞춰둔 이미지 형태로 배포 -> 이미지를 받아서 바로 적용하면 제작자가 의도한 상태로

해당 프로그램이 구동됩니다.

(라즈베리에 파이썬을 3.5를 쓰던, 3.7을 쓰던, env가 제대로 동작이 안되던 상관없이 같은 환경으로 동작됩니다)

물론 단점은 H/W마다 docker 이미지가 다를 수 있기 때문에 해당부분을 사전에 잘 확인해야 한다는거죠.

(보통 라즈베리파이는 도커 이미지 어딘가에 rpi 라고 붙어있는 경우가 많습니다. 라즈베리파이 용 도커 이미지 인거죠)

Docker는, '본인이 사용중인 OS위에서 돌아가는 기본 설정을 맞춰서 만들어둔 가상머신 패키지' 같은 개념입니다.

Docker에서 저장한 이미지를 구동시키는 단위를 '컨테이너' 라고 부릅니다.

Docker(부두) 에 쌓여있는 컨테이너 를 떠올리시면 됩니다.

부두는 고정되어 있지만, 모든 컨테이너가 공유하고... 각 컨테이너는 독립되어 있지요.

자 여기까지가 docker란 어떤 녀석인가에 대한거구요.. 이제 조금 더 깊이 들어가 보겠습니다.

2. Docker 에서 host OS의 폴더/파일 사용하기

Docker로 무언갈 처음 설정하게 되면, 가장 많이 겪는 문제가 '어떤 가이드에서 xxx하라고 했는데 나는 안 된다' 입니다.

그리고 이때 참조한 가이드란, 아마도 Docker 기반이 아닌 OS단에서 설정하는 가이드 일겁니다.

Docker에서 동작되는 컨테이너는 호스트의 OS를 공유하지만, 이건 말 그대로 구동에 필요한 최소만 공유할뿐..

나머지는 완전히 별개로 동작합니다.

가령, letsencrypt 인증서 발급 - HA 적용을 위하여 configuration.yaml 파일 수정(pem파일 경로 지정) 을 한다고 칩시다.

(제가 처음에 개념도 없는 상태에서 Docker에 HA를 올려서 쓰는 와중에 구글홈 연동해보려고 삽질할때의 기억이...)

docker가 아닌 로컬에서 동작시킨다면, 기본 가이드대로 했다면 아마 /etc/letsencrypt/live/도메인 내에 pem 파일이 있을겁니다.

하지만 HA를 Docker에 올렸다면, configuration.yaml 파일에 지정을 해도 오류만 뿜어냅니다.

왜?

letsencrypt 에서 발행한 인증서는 'host OS'에 저장되어 있기 때문이죠.

도커 컨테이너는 host OS의 가장 기본(구동에 필요한 최소, 커널영역) 만 공유합니다.

그렇기 때문에 host OS에서 발행 - 저장한 파일이나 폴더등은 엑세스 할 수 없는거죠.

그러면, Docker에서는 로컬 파일들 못써요? 인증서 어떻게 해요?? 다른 설정들은요??

설마...그러면 누가 도커를 쓸까요.. 다 방법이 있습니다~

그것은 바로, docker run 명령을 할때 포함된 -v xxxx:yyyy 형태의 명령줄 입니다.

docker run 명령을 내릴때 여러가지(네트워크라던지, 포트 매칭, 컨테이너 이름 지정, 이미지 지정 등) 을 포함합니다.

그중 -v 옵션은, 'host OS' 에 있는 특정 폴더 or 파일을 -> 컨테이너의 폴더 or 파일에 마운트 하는 명령 입니다.

Docker로 HA를 올리셨다면, docker run 명령 중간에 다음과 같은 내용을 보실 수 있습니다.

-v /etc/home-assistant:/config -v /etc/localtime:/etc/localtime:ro

-v(볼륨 마운트) host OS의 절대경로:도커 컨테이너의 절대경로

-v /etc/home-assistant:/config -> host OS의 /etc/home-assistan 폴더를 도커 컨테이너의 /config 폴더에 마운트한다.

-v /etc/localtime:/etc/localtime:ro -> host OS의 /etc/localtime 폴더를 /etc/localtime 폴더에 읽기전용으로 마운트

자... 이제 조금씩 보이시죠?

위에서 발행한 letsencrypt 인증서를 도커에 올린 HA에서 쓰려면 어떻게 해야 할까요?

-v /etc/letsencrypt:/cert(폴더명은 편한걸로) -> host OS의 /etc/letsencrypt 폴더를 /cert 폴더로 마운트한다.

그런다음 configuration.yaml 파일에서 다음과 같이 지정해주면, pem파일을 로드할 수 있게 됩니다!

http:

  ssl_certificate: /cert/live/도메인/fullchain.pem

  ssl_key: /cert/live/도메인/privkey.pem 

  base_url: https://도메인

오호... 드디어 잘 동작되는군요...!

이정도만 되어도 docker로 무언갈 구동할때 설명대로 했는데 왜 안될까요? 의 절반은 원인을 찾을 수 있을겁니다.

이제 여기서 더 앞으로 나가볼까요?

3. Docker 컨테이너에 프로그램 설치하기

컨테이너에 host OS에 있는 파일이나 폴더를 마운트 하는 방법을 익혔습니다.

하지만, 해당 컨테이너에서 지원하지 않는 명령어를 내리고 싶을때가 있습니다.

전 HA에 PC를 켜고/끄고 스위치를 만들어 두었습니다.

이중 켜기는 WOL로 동작되고, 끄기의 경우 net rpc shutdown 명령어로 동작합니다.

하지만 제가 쓰는 HA의 도커 이미지 에서는 해당 명령을 인식하지 못합니다.

왜?

안 깔려 있으니까요...(net 이라는 명령이 기본적인거 같아도.. 없더라구요)

자 그러면 docker 컨테이너에 프로그램을 깔아보도록 하겠습니다.

컨테이너 내부에 무언갈 할려면, 컨테이너 문을 따고 들어가야겠죠?

docker가 구동되는 상태에서 다음 명령어를 입력하세요

docker exec -it 컨테이너이름 /bin/bash

docker 로 실행 -실행상태유지 컨테이너명 의 /bin/bash(윈도우의 cmd와 비슷)

이런식으로 치시면 설정한 컨테이너 내부의 /bin/bash 를 실행시켜서 명령 입력이 가능한 환경이 됩니다.

(물론 HA같은 이미지가 아닌 certbot 이나 portainer 등은 /bin/bash 가 없어서 실행이 안 됩니다. 이미지에 따라 다름)

Putty 또는 VNC환경에서 해당 명령을 치면, pi@raspberrypi:~ $ 에서

root@raspberrypi:/# 형태로 바뀔겁니다. 그러면 이제 도커 컨테이너 내부에 들어왔어요!

한번 net 이라고 쳐보세요. 아마 커맨드를 찾을 수 없다고 뜰겁니다.

이 상태로 net 명령을 설치해 보겠습니다.

net 이라는 명령은, 단독으로 설치가 안 되더라구요..

samba 를 설치하면 같이 딸려서 설치가 됩니다. 그래서 전 그냥 samba를 설치하는데요~

기본 상태에서는 samba 설치도 안됩니다... 왜냐면 패키지를 못 불러오거든요.

apt-get update

apt-get upgrade -y

두 명령어를 날려주면 업데이트와 업그레이드를 진행합니다.

완료된 다음 삼바를 설치해 줍니다.

apt install samba

다 완료되고 나면!

net 이라고 쳐보세요... 이젠 해당 명령에 대한 안내가 나옵니다...!

저는 net 을 했지만...

다른것들도 설치할 수 있어요!

가령 HA에 주기적으로 SSL인증서 갱신기간을 체크하는 명령을 내리려면 ssl-cert-check 라는걸 설치해야 합니다.

apt install ssl-cert-check

를 입력하면 해당 패키지가 설치되요! 그러면 Docker에서 구동중인 HA에서도 SSL인증서 갱신기간을 확인할 수 있습니다.

4. Docker 컨테이너의 파일 수정하기

이정도만 해도 충분히 복잡하죠...?

저도 이정도면 충분할줄 알았는데....헐~ 아닙니다요...ㄷㄷ

docker 내부에 있는 파일을 수정해야 하는 경우도 있어요.

제가 아는 방법은 2가지 인데, 일단 컨테이너 내에서 직접 수정하는걸 알려드리겠습니다.

마찬가지로 docker exec 명령을 쓸거고, /bin/bash 가 지원되지 않는다면 다른방법으로 해야 합니다.

docker exec -it 컨테이너이름 /bin/bash

도커 컨테이너 접속이 완료되면, 수정할 파일을 nano 로 불러주면 되는데...

제가 쓰는 도커 이미지 에는 nano가 없네요 ㅋㅋㅋ

그러면 일단 nano 를 설치!

apt install nano

설치가 완료되면~

그 뒤로는 간단하죠?

nano /경로명/파일명

헤헷...쉽게 끝났네요!

5. 기타 응용

이제 조금 다른 명령어와 함께 응용을 해보도록 하겠습니다.

이 부분은 저도 모르고 있었는데, 얼마전 zigbee2mqtt 를 적용하면서 삽질끝에 알게되었네요..

4번 챕터에서 파일 수정에 2가지 방법이 있다고 말씀드렸죠?(사실 더 많겠지만... 전 2가지 밖에 모르..ㄷㄷ)

그 두번째 방법은, 도커 컨테이너에 있는 파일을 host OS 로 복사 -> 수정 -> -v 명령으로 마운트 입니다.

예를들어, zigbee2mqtt 컨테이너에 구동중인 파일중 /app/lib/extension/homeassistant.js 을 수정해보려 합니다.

host OS에는 해당 컨테이너의 데이터를 보관할 /docker/zigbee2mqtt 라는 폴더를 이미 만들어 두었습니다.

docker cp zigbee2mqtt:/app/lib/extension/homeassistant.js /docker/zigbee2mqtt/homeassistant.js

docker 카피 컨테이너이름:절대경로 -> host OS의 절대경로 로 복사

이렇게 하면, /docker/zigbee2mqtt에 homeassistant.js 라는 파일이 복사됩니다.

해당 파일을 nano를 쓰던 samba를 쓰던 수정을 해주세요.

그런다음 docker rm zigbee2mqtt 로 해당 컨테이너를 삭제 하고

docker run 명령(최초 실행할때 설정한 커맨드 그대로) 을 치면서 중간에 다음 행을 추가합니다.

-v /docker/zigbee2mqtt/homeassistant.js:/app/lib/extension/homeassistant.js

그러면 host OS에 있는 /docker/zigbee2mqtt/homeassistant.js 파일을 컨테이너의 /app/lib/extension/homeassistant.js

파일로 마운트 시키므로 host OS에서 해당 파일을 수정하면 바로 컨테이너에 반영됩니다.

한번 수정하면 끝이다 = 4번 챕터처럼 컨테이너 내부에서 수정

자주 수정한다, 컨테이너에 /bin/bash 가 포함되어 있지 않아 접속이 안 된다 = 5번 챕터 진행

후아.........끄읕!!

저도 막 이미지도 넣고 캡쳐도 하고 하면서 진행하고 싶은데.......이게 쉽지 않네요 ㅋㅋㅋ

많은 글자의 압박이 있지만! 다 읽으셨다면 기본적인 도커 사용법은 익히신거예요~~~~~

(-e 명령으로 실행시 변수를 넣는다던지 하는건....제가 보기엔 고급기능 같아요 ㄷㄷ)

자 이제 새로운 도커 컨테이너 설치하러 가시죠!!!

위 툴은 portainer 라는 Docker 관리용 툴 입니다. 도커를 주력으로 쓰신다면 무조건 설치하시는거 추천!

728x90
반응형