예전에는 잘 되었는데 오늘 해보니 자꾸 오류가 난다. 해결 방법은 처음부터 하나씩 설치하는 것이다.
Category: Docker
-
Jupyterlab, reverse proxy, nginx, subfolder
그러니까 NGINX를 reverse proxy로 사용하는 환경에서 Jupyterlab 을 사용하는 방법이다. Jupyterlab을 /에 이용하는 것은 어렵지 않다. 그런데 subfolder에 reverse proxy로 할당해서 이용하려면 설정이 대단히 복잡해 진다. 수십번의 시도 끝에 방법을 찾았다.
/sr 에 reverse proxy로 Jupyterlab을 연동시켜 보자. 우선 index.html 파일을 다음과 같이 설정한다.
<a href="sr/">Super Resolution</a><br>
다음에는 nginx 설정은 다음과 같이 했다.
upstream sr { server sr.medein:8888; } server { listen 80 default_server; listen [::]:80 default_server; root /var/www/blog; location /sr/ { client_max_body_size 0; proxy_pass http://sr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /sr/api/kernels/ { client_max_body_size 0; proxy_pass http://sr; proxy_set_header Host $host; # websocket support proxy_http_version 1.1; proxy_set_header Upgrade "websocket"; proxy_set_header Connection "Upgrade"; proxy_read_timeout 86400; } location /sr/terminals/ { client_max_body_size 0; proxy_pass http://sr; proxy_set_header Host $host; # websocket support proxy_http_version 1.1; proxy_set_header Upgrade "websocket"; proxy_set_header Connection "Upgrade"; proxy_read_timeout 86400; } }
그리고 Jupyterlab의 환경 설정 파일에서 다음과 같이 수정한다.
c.ServerApp.base_url = '/sr/'
Jupyterlab을 실행할 때 환경 파일을 정확하게 지정해 주는 것이 좋다.
jupyter lab --ip=* --no-browser --allow-root --ServerApp.config_file='/root/.jupyter/jupyter_lab_config.py'
-
Docker에서 GPU 사용
Docker에서도 딥러닝을 위한 GPU를 사용할 수 있다. 예전에는 꽤나 복잡한 모양이지만 NVIDIA에서 지원을 해줘서 지금은 그렇게 어렵지 않은 것 같다. 아래의 공식 링크를 참고했다.
Installation Guide — NVIDIA Cloud Native Technologies documentationThe NVIDIA Container Toolkit is available on a variety of Linux distributions and supports different container engines.일단 Docker가 설치되어 있다고 하고 설치를 따라해 보면 다음과 같다.
요약하면 nvidia-container-toolkit과 nvidida-docker2 를 설치하는 것이다.
그리고 Docker 재시작한다.
$ sudo systemctl restart docker
Docker에서 nvidia-smi 로 확인해 보기.
$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
여기서 nvidia-smi 화면이 나오면 일단은 잘 설치가 된 것이다.
그리고 gpu를 사용할 docker 의 container를 생성한다. 위 명령어를 보면 알겠지만 –gpus 라는 명령어를 이용해서 사용하도록 하면 된다.
$ sudo docker run -it --gpus all debian
이렇게 gpu를 사용하도록 만들어진 container는 docker inspect를 이용하면 해당 부분을 알 수 있다. 사용하지 않는 경우에는 결과 값이 []로 출력된다.
$ sudo docker inspect -f "{{ .HostConfig.DeviceRequests}}" python2 [{ -1 [] [[gpu]] map[]}]
사용하기 위해서는 nvidia-container-toolkit이 필요하다. 설치하기 위해서는 다음과 같이 하면 된다.
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
-
Docker에서 Let’s Encrypt 인증서 사용하기
시대의 흐름은 웹 서비스에서 HTTPS가 기본 적용으로 바뀌고 있다. HTTPS 서비스를 제공하기 위해서는 SSL 인증서가 필요한데, 이거 대부분 유료이다. Let’s Encrypt는 무료로 이용할 수 있는 SSL 인증서를 제공하고 있는데, 2가지 제약점이 있다.
첫 번째로, 와일드 카드가 적용이 되지 않는다. 하나의 도메인에 하나씩 발급이 되며, 외부로 공개된 도메인이어야 한다.
두 번째로, CertBot을 이용한 설치 과정에 있어 snap 을 이용한다. 그런데 snap이 Docker 내부에서는 동작하지 않는다.
다음 순서대로 일을 진행하도록 하자.
첫 번째. Docker 설치하기. Docker 홈페이지의 Debian 설치 부분을 참고하면 다음의 명령어들을 입력하면 된다.
sudo apt-get -y remove docker docker-engine docker.io containerd runc sudo apt-get -y update sudo apt-get -y install ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get -y update sudo apt-get -y install docker-ce docker-ce-cli containerd.io
두 번째. NGINX 설치하기. 특별히 컴파일 부터 시작해야 하는 경우가 아니면 apt나 apt-get을 이용하여 설치하면 된다.
sudo apt install nginx
다음으로 nginx.conf 파일을 수정한다. 대부분의 클라우드 환경은 SSH, HTTP, HTTPS 용 포트 3가지만을 기본적으로 외부에 개방하도록 되어 있다. 따로 추가 설정을 해주기 보다 되도록 기본에 묻어 가도록 해본다. NGINX 에서 리버스 프록시로 Docker 의 서비스에 연결을 할 수 있도록 한다.
이를 위하여 설정 파일을 수정한다. 위와 같이 설치하면 /etc/nginx 폴더에 관련 설정 파일이 저장된다. nginx.conf 파일에 보면 다음과 같은 부분이 있고, 이것은 하위 conf.d 폴더와 sites-enabled 폴더의 환경 설정 파일을 이용한다는 뜻이다.
include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
설치한 직후에는 두 폴더 중 sites-enabled 폴더에 default 파일이 하나만 있다. 그리고 이 파일은 sites-available 폴더의 default 파일의 심볼릭 링크이다. 그래서 sites-available 폴더의 default 파일의 내용을 다 삭제하고 다음과 같이 수정한다. Shiny는 기본적을로 3838 포트를 이용한다. 마지막에 슬래쉬 넣는 것 잊어먹지 말자.
server { location / { proxy_pass http://localhost:3838/; } }
세 번째. 사전에 업로드한 도커 이미지 파일을 불러와서 실행시킨다.
sudo docker load < cloud.tar sudo docker run -itd -p 3838:3838 --name demo cloud-demo
이렇게 해서 웹으로 접근을 하면 내부 도커로 HTTP를 이용하여 접근할 수 있는 것을 알 수 있다.
마지막 네 번째. 이제 Let’s Encrypt 홈페이지로 가서 snapd 를 설치하고 CertBot을 실행시켜서 인증서를 발급받는다. 그리고 다시 웹으로 접속하면 HTTPS로 접속할 수 있게 된다. 오늘 기준으로 다음의 명령어를 통하여 실행할 수 있다.
sudo apt-get -y install snapd sudo snap install core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot --nginx