docker에서 jupyter notebook 접속하기
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