본문 바로가기
에러수정

docker에서 jupyter notebook 접속하기

by 햇농nongnong 2022. 12. 8.

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

 

댓글