【docker】Windows10에서 원격서버의 docker container에 접속하기

  • 최종결과 화면
    image-20210329204418671
  • 꼭 reference 사이트에 들어가서 순서대로 따라할 것.
  • 사이트 내부의 내용을 모두 정리하지 않을 계획이다.

Windows10에서 원격서버의 docker container에 접속하기

1. Reference

  1. https://www.44bits.io/ko/post/wsl2-install-and-basic-usage
  2. https://hwan-shell.tistory.com/182
  3. https://seokhyun2.tistory.com/42
  4. https://seokhyun2.tistory.com/48

2. WLS 및 docker desktop 설치

  • 참고 : https://www.44bits.io/ko/post/wsl2-install-and-basic-usage
  • WLS2와 docker desktop을 설치한다. 이 과정이 꼭 필요한 과정인지는 모르겠다. vscode에서 attach container를 하면 make sure docker deamon is running 이라는 에러가 났다. 이 문제를 해결하기 위해서 docker desktop을 설치해야하는 듯 했다.
  • windows home을 사용하기 때문에 WLS2를 설치해야만 docker desktop을 설치할 수 있었다.
  • 사이트 순서를 정리하면 다음과 같다
    1. Windows Terminal 설치하기
    2. WSL 활성화를 위해서 PowerShell에서 두개의 명령어를 복붙 처주기
    3. WSL 설치하기 = MS store에서 Ubuntu 설치하기
    4. WSL1을 2로 업데이트 시켜주기 (커널을 설치해주고 PowerShell에서 $ wsl --set-version/default 처리 해주기 )
    5. Docker Desktop 설치하기 (windows home이지만, WSL2를 설치해놨기에 docker가 잘 설치가 되었다.)
    6. Docker 세팅 바꿔서 Ubuntu Terminal in window10에서도 docker 사용할 수 있게 만들기

3. VScode에서 SSH-remote 연결하기

  • Remote - Docker Containers extension만 설치하면 안된다. 우선 SSH 연결이 필요하다

  • 따라서 아래의 사이트를 참고 해서 다음의 과정을 진행해준다.

  • 순서 정리

    1. window vscode에서 Remote Development extention 설치 (Remote 관련 extention 다 설치된다)

    2. Ubuntu Server 아래의 명령어 실행

      • $ sudo apt-get update
        $ sudo apt-get install ssh
        $ sudo apt-get install openssh-server
        $ sudo nano /etc/ssh/sshd_config # port 22 만 주석 풀어주기
        $ sudo service ssh status
        $ sudo service ssh start
        방화벽
        $ sudo ufw enable
        $ sudo ufw allow 22
        $ sudo ufw reload
        
    3. 윈도우 agent 세팅해주기

      • 관리자모드 CMD - $ sc config ssh-agent start=auto
      • $ net start ssh-agent
    4. 윈도우에서 ssh-keygen해서 ubuntu에 넣어주기 (사이트)

      • Powershell : $ ssh-keygen -t rsa -b 4096
      • Powershell : $ Get-Content .\.ssh\id_rsa.pub - 그러면 출력되는 긴~~ 결과물이 있을텐데, 그것을 복사해서 메일로든 뭐든 저장해두기
      • Ubuntu : $ code /home/junha[=userName]/.ssh/authorized_keys - Ubuntu : $ chmod 644 /home/junha/.ssh/authorized_keys : 이렇게 설정해주면 윈도우에서 ssh연결할때 우분투 비밀번호 안물어본다.
      • 여기에 그~대로 key 복붙해서 저장해두기 (아래 이미지 참조) - (에러 발생 및 문제 해결) 같은 아이피를 사용하는 우분투 케이스를 바꿔서 다시 연결하려니 안됐다. 이때 해결책 : 윈도우에서 known_hosts파일 삭제하기. $ cd C:\Users\sb020\.ssh && rm ./known_hosts
    5. 윈도우 VScode ssh config

      • VScode -> ctrl+shift+p == F1 -> Remote-SSH: Connect to Host

      • Host server1
        	HostName 143.283.153.11 # 꼭! ifconfig해서 ip확인
        

        User junha

    IdentityFile ~/.ssh/id_rsa ```

    • 위와 같이 config 파일저장해두기

    • 그리고 SSH VScode로 연결해보면 아주 잘된다.
      image-20210329211438915 ```

4. Ubuntu Docker 설치 및 Container 실행

  1. Docker 설치 : 기본 Docker 를 설치해줘야 NVIDA docker로 업그레이드 가능

  2. 우분투에 NVIDA Driver 설치

  • $ sudo ubuntu-drivers devices
    • $ sudo ubuntu-drivers autoinstall
  • $ reboot
    • 꼭 드라이버 설치하고, $ nvida-smi 하기 전에, reboot 꼭 해보기.
    • $ nvidia-smi
  1. NVIDIA-Docker 설치

    • # 정리
      1$ curl https://get.docker.com | sh \
        && sudo systemctl --now enable docker
      2$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
         && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
         && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
      3$ sudo apt-get update
      4$ sudo apt-get install -y nvidia-docker2
      5$ sudo systemctl restart docker
      6test-$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
      
  2. ML workspace Docker Image 다운로드(pull) 및 container Run

    • $ sudo docker run -d \
          -p 8080:8080 \
          --name "8080ML" \
          --runtime nvidia \
          --env NVIDIA_VISIBLE_DEVICES="all" \
          -v "${PWD}/docker_ws:/workspace" \
        --env AUTHENTICATE_VIA_JUPYTER="junha" \
          --shm-size 512m \
          --restart always \
          mltooling/ml-workspace:0.12.1
      
    • ### 설명 추가
      $ sudo docker run -d \ # background 실행
          -p 8080:8080 \ # 앞 포트는 내 우분투 포트, 뒤 포트는 컨테이너 내부 우분투 포트, 실험에 의하면 host-port/container-port이며, host-port만 바꿔주고 container-port는 8080으로 고정해서 사용하자
          --name "8080ML" \ # 맘대로 해라
          --runtime nvidia \ # 이거 꼭! 
          --env NVIDIA_VISIBLE_DEVICES="all" \ # 이것도 꼭 
          -v "${PWD}/docker_ws:/workspace" \ # 터미널실행PWD=="${PWD}"/docker_ws 폴더 만들어 놓기
        --env AUTHENTICATE_VIA_JUPYTER="junha" \ # 비밀번호
          --shm-size 512m \ # 일단 해놈. 안해도 될듯 
        --restart always \ # 알지? 
          mltooling/ml-workspace:0.12.1 # docker-hub에 버전 참고
      

      ```

    ```

## 5. Docker Container 연결하기

  1. 참고

  2. VScode -> ctrl+shift+p == F1 -> Preferences: Open Settings (JSON)

  3.   {
        "docker.host": "ssh://junha@143.283.153.11"
      }
    
  4. 이렇게 수정해두기. 위에서 junha로 하는 대신 우분투에서 아래의 작업 진행

  5.   $ sudo usermod -aG docker junha
    
  6. VScode -> ctrl+shift+p == F1 -> Remote-Containers: Attach to Running Container

  7. 존버타고 있으면, 서버에 실행되고 있는 container 목록이 뜬다. 원하는거 선택하고 Open 및 설정이 완료되기까지 시간이 좀 걸린다.

  8. 그러면 최종 성공!
    image-20210329211903648

6. 완성!

  • Windows10

image-20210329213115925

  • Ubuntu

image-20210329213208677

7. VS code 환경설정

  1. 아래와 같이 Python Interpreter 설정을 해야한다.
  2. ML-workspace자체에 conda가 설치되어 있고, base env는 opt/conda/bin/python 에 존재한다. interpreter에 마우스 길게 갖다 대고 있으면 path가 나온다. 나의 window conda path와 겹칠일은 없겠지만 그래도 조심하자.
    image-20210329223237549

8. docker container에서 code 명령어 사용하기

  • reference site : The “code” command does not work when connecting to a Docker container remotely with VSCode

  • 종합적으로, 아래의 명령어를 docker container Terminal에 입력했다.

    $ ls ~/.vscode-server/bin # hash name 파악하기
    $ export PATH="$PATH:$HOME/.vscode-server/bin/<hash name>/bin/"
    (예시) $ export PATH="$PATH:$HOME/.vscode-server/bin/08a217c4d27a02a5bcde8555d7981bda5b49391b/bin/"`
      
    $ code ~/.bashrc
    (Addding in the file) export PATH="$PATH:$HOME/.vscode-server/bin/08a217c4d27a02a5bcde898555981bda5b49391b/bin/"` 
    

9. –shm-size 의 중요성

mmclassification 을 돌리면서 만난 에러가 다음과 같았다.
RuntimeError: DataLoader worker (pid 167565) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit

찾아보니 원인은 다음과 같았다.

  1. 도커로 컨테이너를 생성하게 되면 호스트와 컨테이너는 공유하는 메모리 공간이 생기게 되는데 이 공간에 여유가 없어서 발생되는 에러이다.(참조사이트)

  2. container $ df -h 명령어로, shm가 얼마인지 확인할 수 있다.

  3. container run 할 때 충분한 -shm-size 를 설정해주는 방법이 답이다.

  4. ML-workspace github 참조
    image

  5. 찾아보니, 대강 이 문제가 발생한 사람들은 docker run --shm-size=2G 설정한다. 어떤 글을 보니 docker run --ipc=host 이런식으로 설정해주는 사람도 있었다. 어떤 사람은 8G로 설정하는 경우도 있었다. (문제 안생기나?)

    # 최종 실행 터미널 코드
    $ sudo docker run -d -it      \
    --gpus all         \
    --restart always     \
    -p 8000:8080         \
    --name "mmcf"          \
    --shm-size 2G      \
    -v ~/docker/mmclf/mmclassification:/workspace   \
    -v ~/hdd1T:/dataset   \
    pytorch/pytorch:1.5.1-cuda10.1-cudnn7-devel
    
  6. 또한 $ watch -d- n 1 df -h 명령어를 사용해서 현재 container가 어느정도의 –shm-size를 사용하고 있는지 알 수 있다.

  7. 참조 사이트 : pytorch-issue, share-memory-8G

10. 새로운 windows로 원격 vscode 코드 열기

  1. vscode에서 단축키 변경으로 ctrl + k + s
  2. duplicateWorkspaceInNewWindowctrl+shift+n 으로 단축키 지정해주기
  3. 참조 사이트

11. permission denied

참고 나의 포스트

  • 핵심 : $ sudo chown -R junha:junha ./detectron2/

© All rights reserved By Junha Song.