에러수정

docker에서 jupyter notebook 접속하기

햇농nongnong 2022. 12. 8. 12:38

Docker 에서 jupyter notebook 접속 불가 에러 수정


 

docker 에서 주피터 노트북을 실행하기 위해서는 인터넷 연결과 방화벽이 필요합니다. 

 

 

먼저 docker 의 container 에 들어간 이후, jupyter notebook 을 실행해봅시다.

 

# 도커 컨테이너 접속
sudo docker start hy_fairseq
sudo docker attach hy_fairseq

# 주피터 노트북 설치
pip install --upgrade pip
pip install jupyter

# 주피터 노트북 실행
jupyter notebook --no-browser --allow-root --ip=0.0.0.0 --port=8888

# --no-browser 는 별도의 브라우저를 띄우지 않겠다는 의미
# --allow-root 는 root 접속을 허용하겠다는 의미 (컨테이너 기본 계정이 root)
# --ip=0.0.0.0 은 모든 IP 에 대해서 접속권한 부여
# --port 는 Jupyter notebook 을 실행할 포트 번호

 

위의 코드를 입력하면 아래와 같이 접속하라고 하지만,

 

 

실제로 주소를 입력해 접속해보면 아래와 같이 접속이 안됩니다.

 

이를 해결하기 위해 먼저 컨테이너에 IP 주소를 할당시켜주고, iptables 을 통해 접근을 허용해주어야 합니다.

 

하나씩 해봅시다.

 

컨테이너의 IP 확인 및 연결

먼저 컨테이너에 IP 주소를 할당시켜주고, iptables 을 통해 접근을 허용해주어야 합니다.

컨테이너의 ID 해쉬 값을 넣어서 컨테이너의 IP를 확인할 수 있습니다.

위에서 접속했던 docker 에서 exit 을 통해 나간 후, docker ps -a 를 통해 컨테이너의 ID 값을 얻어냅니다.

exit
sudo docker ps -a

제가 사용하는 도커 컨테이너 이름은 "hy_fairseq" 이고, ID 는 위의 첫번째 열 "0bd8b248a2e7" 입니다.

도커 컨테이너 ID 를 알았으면, docker inspect 를 통해 해당 컨테이너의 IP 주소를 확인해봅시다.

 

sudo docker inspect 0bd8b248a2e7 | grep IPAddress

 

아직은 IP 를 할당시켜주지 않았으므로 아래와 같이 "" 빈칸으로 나타나게 됩니다.

 

다시 도커에서 나와 docker run 을 통해 컨테이너 포트를 호스트 포트와 연결시켜줍니다.

sudo docker run -it -p 8888:8888 ubuntu

docker run 의 포트를 지정학 위해 "-p [Hostport:ContainerPort]" 를 넣어주는 과정입니다.

위의 코드는 8888 포트에 연결하여 ubuntu 를 실행한다는 명령입니다. 

 

그 이후, 다른 창에서 아래와 같이 docker start, docker attach 를 통해 도커 컨테이너에 접속해줍니다.

 

 

 

도커 접속 이후에, docker inspect 를 통해 다시 IPAddress 를 확인해보면, 이제 주소가 할당된 것을 확인할 수 있습니다.

 

sudo docker inspect 0bd8b248a2e7 | grep IPAddress

 

 

Firewall 설정

host에서 컨테이너로 연결하기 위해서 ufw 비활성화 상태여야합니다.

sudo ufw status verbose

위 명령어를 입력하여 아래와 같이 inactive 상태인지 확인합니다.

 

이제 iptables 를 통해서 host 에서 컨테이너로 연결합니다.

sudo iptables -A DOCKER -p tcp --dport 8888 -j ACCEPT -d 172.17.0.6

위 명령어를 통해 아까 컨테이너의 IP주소에 대해서 접근을 허용해줍니다.

--dport {사용하는 jupyter 의 port}

--d {컨테이너의 IP 주소}

 

iptables -nL 을 통해 정상적으로 방화벽에 적용되었는지 확인합니다.

sudo iptables -nL

 

아래와 같이 Chain DOCKER 에 destination 이 잘 적용된 것을 확인할 수 있습니다.

 

그 이후, 실제 포트를 변경해주기 위해 docker 에 dnat 를 설정해주고, postrouting 에 masquerade 를 설정해줍니다.

sudo iptables -t nat -A DOCKER -p tcp --dport 8888 -j DNAT --to 172.17.0.6:8888
sudo iptables -t nat -A POSTROUTING -p tcp --dport 8888 -j MASqUERADE -s 172.177.0.6 -d 172.17.0.6

 

 

 

 

 

 

 

 Reference