Category: Docker

  • Docker에 Shiny Server 설치하기

    예전에는 잘 되었는데 오늘 해보니 자꾸 오류가 난다. 해결 방법은 처음부터 하나씩 설치하는 것이다.

  • 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에서 지원을 해줘서 지금은 그렇게 어렵지 않은 것 같다. 아래의 공식 링크를 참고했다.

    일단 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