본문 바로가기
삽질/Docker

[ 도커 삽질 ] 도커 컨테이너로 접속 안될때, Docker exec 안될때

by SteadyForDeep 2021. 3. 20.
반응형

//1

자세한 내용은

2021.03.19 - [딥러닝/개인 환경 구축 기록] - [ 자취방 워크스테이션 ] #18 도커에서 주피터 열어서 외부접속 해보기

 

[ 자취방 워크스테이션 ] #18 도커에서 주피터 열어서 외부접속 해보기

//1 도커를 깔았다. 그런데 뭐 하는 건지 아직 감이 안 잡힌다. (정상이다) 백문이 불여일타라고 한번 해보자. //2 우선 도커는 UNIX소캣에 물린 서로 다른 가상의 작은 컴퓨터들로 이해한다고 했었

davi06000.tistory.com

여기에 설명이 되어있다.

이하는 거의 동일한 설명을 조금 더 간략히 핵심만 추려서 하겠다.

 

 

 

 

//2

도커는 앱의 개발을 위해서 사용된다기 보다는

개발이 끝난 앱의 배포와 버전 관리를 위해서 사용한다고 보는 것이 좋다.

따라서 도커 컨테이너를 빌드하는 이미지는 아주아주 최소한의 기능만을 탑재한다.

우리가 느려진 컴퓨터에서 가장 먼저 하는 일이

사용하지 않는 프로그램을 지우는 일이다.

이렇게하면 컴퓨터의 한정적인 자원을 다른 곳에 나눠쓰지 않고

온전히 쓰고자 하는 프로세스에 집중시킬 수 있다.

 

따라서 대부분의 도커 이미지는 정말이지 그 앱이 돌아가기만을 위한

최소한의 자원들을 가지고 있다.

 

단순이 OS를 설치하고 새로운 컴퓨터인것 처럼 사용하려면

그에 맞는 이미지를 받으면 될 것이다.

 

하지만 tensorflow에서 기본으로 제공하는 이미지는

vim도 없을 정도로 간단한 기능들만 들어있다.

따라서 무작정 tensorflow를 해야지! 라는 마음으로 이미지를 받았다가는

사용도 못해보고 끙끙거리기 일수다.

그래서 그냥 정상적인 우분투가 들어있는 이미지를 받고 pip로 텐서플로우를 받는게

정신건강에는 이로울 수 있다.

 

이미지를 선택하기전에 내용물을 잘 살펴보라는 이야기다.

 

 

 

 

//3

이렇듯 앱의 실행과 배포에 초점이 맞춰진 도커는

컨테이너의 create 과정에서 입력해준 커맨드를

start에서 자동으로 실행하게 되고

이 실행이 끝나면 자동으로 stop하게 된다.

 

우리 컴퓨터는 안그런것 같지만 똑같다.

간단해보이는 CLI에서도 사용자가 입력을 넣을때까지 무작정 기다리는 무한루프가 돌고 있다.

즉 컴퓨터 부팅->프로세스 시작->프로세스 마침->컴퓨터 종료 라는 기본적인 동작 사이에

컴퓨터 부팅->프로세스 시작->[명령대기]->프로세스 마침->컴퓨터 종료

라는 명령대기 상태를 넣어줌으로써 우리가 컴퓨터를 가만히 켜 둘 수 있는 것이다.

컨테이너 내부에서는 항상 어떤 프로세스가 돌고 있어야한다.

그것이 그저 대기만 하는 상태이더라도 그렇다.

 

앱의 기본적인 기능은 어떤 입력을 기다리고

입력에 따라서 처리하고

처리한 내용을 보여주는 단계로 이루어지기 때문에

도커가 살아있으려면 무한루프가 꼭 필요하다는 말이

사실은 이런 배포용 앱을 열어두라는 말과 일맥상통하게 된다.

 

 

 

 

//4

그러면 이런 생각이 들 수 있다.

나는 개발해둔 앱이 없는데 그러면 도커를 못쓰는 건가?

그렇지 않다.

 

텐서플로우나 구글코랩등이 주피터를 좋아하는 이유가 여기에 있다고 보는데

주피터 노트북은 원격으로 그것도 웹으로 컴퓨터를 제어하고 사용하기위한

"완성된" 앱이다.

따라서 주피터를 기본으로 도커에 돌려놓고 주피터를 통해서

컨테이너에 진입한 다음 컨테이너를 컨트롤하는 것이 가능하다.

 

혹은 정말 간단한 어떤 while문이나

다른 개발환경 구축을 위한 서버앱을 실행시켜둔다면

충분히 유용하게 도커를 run상태로 유지하는 것이 가능하다.

 

 

 

 

//5

도커를 run상태로 유지하는 것이 중요한 이유는

역시 exec을 쓸수없으면 그냥 무용지물이라는 점 때문이다.

컴퓨터를 새로 샀는데 켜자마자 꺼져버리는 컴퓨터라면 정말이지 무용지물이다.

 

그런데 또 이런 질문도 나온다.

나는 도커를 잘 선택했고 앱을 실행하는 명령도 잘 줬는데

왜 아무일도 일어나지 않을까?

 

이럴 경우는 거의 한가지 문제점이다.

컨테이너가 만들어지고 앱이 실행되자마자 오류가 나면서

앱이 자동으로 종료되었고 그에따라 프로세스가 없으므로

컨테이너가 종료되는 것이다.

 

혹은 도커는 살아있는데 앱이 안된다면

오류가 났을때 프로세스가 종료되지 않고 데드락(응답대기)이 걸리는 앱일 수 있으므로

도커의 logs 기능을 이용해서 상태를 출력해보면 된다.

 

주피터를 예로 들어보자.

먼저 이런 상황임을 인지하기 위해서는

백그라운드 실행을 주지 않고 실행해보면 된다.

자 여길 보면 --allow-root를 걸어주지 않아서 주피터가 열리지 않은 사실을 알 수 있다.

컨테이너의 디폴트 커맨드는 루트계정에서 돌아가므로

주체가 루트계정임을 알려주도록 설계된 앱인 경우 이 부분의 주의하여야 한다.

그러니까 도커의 생성에는 문제가 없었으나 앱의 실행에서 문제가 발생한 것으로

$ docker ps -a를 출력해보면 도커는 멀쩡히 생겨있는 것을 볼 수있다.

 

대부분의 경우에서 도커는 큰 문제가 없다.

 

 

 

반응형

댓글