스터디 노트

도커 초보자의 몸통박치기(환경셋팅 프로세스 및 시행착오)

알럽뷰 2024. 2. 4. 01:20

도커 초보자인 제가 저를 포함한 도커 왕초보에게 알려주는 글로 환경셋팅에 관한 프로세스와 시행착오를 읽어보면서 시간 절약할 수 있으면 좋겠습니다.

 

우선 저의 시행착오를 겪기 전 지식수준은 아래와 같습니다. 물론 지금도 별 다를 것은 없습니다.

  • 개발 전공자가 아닌 비개발 전공자(개발 지식없고, 공부한 적 없음)
  • '도커와 깃을 연결해서 잘 쓸 수 있다'란 사내발표회 1번 들어본 정도
  • 일하는 환경에 의해 도커, 이미지, 컨테이너 개념만 주워듣고 실제 도커를 사용한 적 없음


도커를 사용하게 된 프로젝트를 수행하는 환경에 대한 설명입니다.

  • 보안에 민감한 프로젝트로 1달에 한번 이상 수시로 보안점검을 진행
  • 인터넷을 사용할 수 없고 내부망으로 파일을 주고 받는 오프라인 환경
  • 필요한 툴은 인터넷이 되는 환경에서 받아 점검 후 반입
  • 처음부터 내가 만드는 것이 아닌 도커 이미지를 받아서 사용

 

그림을 많이 넣어 쉽고 친절하게 설명하고 싶지만 보안을 중시하는 프로젝트로 한계가 있어 최대한 글로 풀어보고자 합니다.

 


1. 리눅스/우분투/도커 설치

업무를 진행할 데스크톱은 윈도우 환경이고 개발/운영 서버는 리눅스 환경으로 되어 있다.

또한, 과거 프로젝트를 통해 도커로 운영/관리되고 있다고 하니 최종적으로 우리에게 필요한 툴은 리눅스, 우분투, 도커이다.

  • Docker Desktop Installer.exe
  • Ubuntu_1804.2019.522.0_x64.appx
  • wsl_update_x64.msi

*알집으로 내부 반입한 3개의 파일 중 우분투는 확장자를 변경하여 설치를 진행했다. (.appx -> .zip)

 

파일을 설치하기 전에 windows 기능 켜기/끄기에 들어가서 리눅스용 윈도우 하위 시스템과 가상 머신 플랫폼을 체크해야 한다.

Linux용 Windows 하위 시스템
가상 머신 플랫폼

 

윈도우 10 환경에 리눅스를 업데이트(wsl2)한 후 1) 우분투 설치, 2)도커 데스트탑을 설치한다.

 

설치 완료 후 컴퓨터를 재부팅하면, 탐색 창(Navigation Pane)에 Linux가 떠있으며, 정상적으로 설치되어 있을 경우 docker-desktop, docker-desktop-data, Ubuntu-18.04라는 폴더 3개가 존재한다.

 

윈도우 10 환경에 리눅스를 업데이트하고, 리눅스와 윈도우가 사이좋게 대화하기 위해 우분투를 설치한다.

도커데스크톱은 매번 running 되어 있어야 한다.(숨겨진 아이콘 표시에 고래가 존재해야 함)

 

cmd창을 켜고, 아래 코드를 입력해 주었다.(wsl2와 우분투 설정)

wsl --set-version Ubuntu-18.04 2
wsl -l
wsl --set-default-version 2

 

이후 우분투에서 ID와 PW를 지정한다.(도커가 정상적으로 움직이지 않아 삭제할 때 PW가 쓰이긴 함)

 

이 당시에도 많은 시행착오가 있긴 했지만, 환경셋팅 초반으로 내가 이해할 수 있는 범위를 벗어나 시행착오를 기록할 수 없다.

기억에 남아있는 것은 우분투가 실행되지 않거나, 도커가 실행되지 않거나인데, 구글링을 통해 해결했으며 더 이상 해결 방법이 없을 경우는 결국 재설치를 진행하였다.(그밖에 도커가 작동이 되지 않고 오류 팝업창을 띄워 초기화하는 방법도 있으나 직접 구글링 해보시길 바람)

 

커맨드창에서 작업한다는 것이 쉽지 않고 리스트를 확인했을 때 *(별표)가 어디에 표기되어 있는지에 따라서도 작동 여부가 달라졌으나, 해결방법은 동료였다.

 

#시행착오1: 도커와 충돌 일어나는 프로그램은 삭제

챠**이라는 프로그램을 초반에 설치했었는데, 도커와 충돌이 일어나서 우리팀이 쓰지는 않지만 의무적으로 설치했어야 했던 챠**는 지웠더니 도커가 잘 된다.

 

#시행착오2: 도커가 실행되지 않아서 도커 삭제

도커를 삭제하기 위해 우분투 접속 후 도커 삭제하고 다시 재설치를 진행했다.

rm -rf Docker

 

예시

idname@abcdefg:/users/$ cd /

idname@abcdefg:/$ ls
idname@abcdefg:/$ ls -lh

idname@abcdefg:/$ sudo rm -rf Docker

 

경로 확인 및 Docker 유무를 확인한 후 PW 입력하면 도커가 삭제된다. 

 

2. 도커 이미지 셋팅

도커 이미지 셋팅은 크게 이미지-컨테이너-주피터랩 실행 단계로 가는 것을 목표로 기술하겠다.

 

기존 서버 환경에 맞춘 도커 이미지를 여러 개 받아버렸다.

어떤 이미지가 몇 버전의 파이썬을 가지고 있는지 관리가 이뤄져 있지 않아 이 당시에도 여러 차례, 여러 이미지를 설치하고 삭제하고를 반복했다. 물론 나로 인한 시행 횟수가 더 많다.

 

.tgz라는 확장자를 가진 압축파일 3개를 받았는데, 3.6버전, 3.7버전, 3.8버전인 것을 확인했다.

 

도커 이미지 로드

cmd창 실행하고 도커 이미지 load를 진행한다.

(이때, docker desktop running이어야 함)

docker load -i [경로]

 

예시

docker load -i C:\Users\Desktop\images\docker_image_name.tgz

 

정상적으로 실행된다면 로딩레이어가 반응한다. [=====================⇒]

 

컨테이너 생성

도커 데스크톱 > images > local > 목록에서 이미지 ID 복사 클릭 후 입력한다.

docker run -d -it --name [컨테이너 이름] -p [사용할 호스트 포트]:[컨테이너 포트] [이미지ID]

 

예시

docker run -d -it --name my_jup -p 10880:8888 u172f5s6f2e1f3s5~
docker run -d -it --name my_38 -p 10881:8888 d54f8e4f6s5df4~
docker run -d -it --name my_36 -p 10882:8888 y4f5gu88754g5d~

docker run -d -it --name my_36 -p 10882:8888 y4f5gu88754g5d~ /bin/bash

 

컨테이너 생성을 많이 해보다 보니, 처음엔 튜토리얼을 따라 하듯 my_jup로 시작했지만 버전명을 적는 식으로 내가 쓰기 편한 이름으로 만들게 되었다.

이미지 ID는 문자와 숫자가 섞여있는 형식인데, 문자길이가 궁금해서 확인해 봤는데 64이다.(len=64)😝

또한, 이미지 ID 뒤에 /bin/bash를 붙일 경우 실행이 몹시 잘 된다.

 

#시행착오1: 리소스 부족으로 마운트를 이용하여 컨테이너 생성

사용하는 데이터가 많고 무거워 용량이 부족한 상황에서 마운트라는 것을 동료가 알려줬다.😍

마운트를 이용해서 컨테이너를 생성하기 위해 써칭하고 도움받으며 생성했다.

경로설정으로 헤매고, 포트생성 안 해서 다시 또 삭제와 생성을 반복하고, 괜히 포트 바꿔서 생성했다가 랩 실행이 안 돼서 다시 생성했다.(포트를 8080이라고 했다가, 8888 기존 그대로 하니까 잘 됨)

괜한 실험정신으로 포트넘버 바꿔봤다가 시행착오만 늘어났다.

docker run -it -v [로컬 경로]:[컨테이너 경로] -p [호스트 포트]:[컨테이너 포트] --name [컨테이너 이름] [이미지 이름] bash

 

예시

docker run -it -v C:/Users/Desktop/data:/home/home2 -p 10884:8888 --name my_38 my_image_name bash

 

경로와 경로 사이에 :를 놓치지 말고 잘 입력해야 한다.

이미지 이름을 알고 싶다면 docker ps를 입력해 보면 확인 가능하다.

 

컨테이너 실행

컨테이너 running 하는 방법인데, 직접 도커데스크톱에 있는 컨테이너 리스트에서 ▶,⬛ 켜고 끄는 것이 가능하다.

 분명 컨테이너 잘 쓰고 있었음에도 컨테이너 리스트가 몽땅 사라져 있는 경우, cmd창에 기억하고 있는 내 컨테이너를 불러보면 된다.

docker start [컨테이너 이름]

 

예시

docker start my_jup

 

컨테이너 접속

컨테이너 생성 이후 컴퓨터를 껐다 켰다 하다보면 '어떻게 다시 접속하지?' 싶지만 여기서부터 진행하면 된다.

docker exec -it [컨테이너이름] /bin/bash

 

예시

docker exec -it my_jup /bin/bash
docker exec -it my_38 /bin/bash

 

주피터랩 토큰 받기

주피터랩이 설치되어 있는 이미지를 가져온 것이라면 바로 진행하면 된다.(없으면 설치 필요)

jupyter lab --ip 0.0.0.0 --allow-root

 

예시

C:\Users\pathname>docker exec -it my_38 /bin/bash
use1@abcdef:/workspace$ jupyter lab --ip 0.0.0.0 --allow-root

 

위에 코드 실행 시 나오는 토큰 복사해 두자.(토큰길이도 확인해 봤는데, 48개임)

http://~/lab?token=0756d5f4e865h486s5d4f5

 

앞에 sudo를 붙인 상태로 실행할 경우, 많은 권한이 부여되어 자유도가 높을 수 있음

sudo jupyter lab --ip 0.0.0.0 --allow-root

 

#시행착오1: 상습적인 sudo 사용하지 않기

어떤 컨테이너냐에 따라 다르지만, sudo를 만능처럼 사용하다 보니 상습적으로 sudo를 사용하게 되었다.

그게 오히려 독이 된 경우도 있다. sudo를 입력하지 않고 주피터랩에 접속을 하니 정상적으로 실행되었다.

 

웹실행 후 주피터랩 열기

웹브라우저를 실행한 후 URL 입력창에 아래 내용을 입력한다.

cmd창에 토큰과 함께 뜬 링크로 들어가는 것은 아니다.

localhost:[사용할 포트]

 

예시

localhost:10880
localhost:10881

 

도커 데스크톱에 있는 컨테이너 리스트에서 포트를 클릭할 경우 바로 주피터랩으로 바로 접속되기도 한다.

안 켜진다면 다시 토큰 받아서 실행하면 된다.

 

3. 파이썬 버전에 맞는 라이브러리/패키지(wheelfile) 설치

모델을 운영하고 있는 환경은 파이썬 3.6버전으로 현시점에선 다운그레이드가 필요한 상황이다.

(1회성 프로젝트로 끝내는 것이 아닌 운영시스템에 돌아가게끔 할 수 있는 가능성을 염두했음)

간혹 부득이하게 우리가 사용해야 할 라이브러리가 최신 버전에서만 가능할 경우 3.8버전으로 활용했다.

 

내가 사용할 컨테이너 및 패키지는 3.6버전과 3.8버전으로 무엇이든 2번씩 생성이 필요했다.

 

반입한 압축파일(.zip) 안에는 wheelhouse폴더(.whl 확장자 모음)와 requirements.txt파일(패키지 리스트)이 들어있다.

(필요한 패키지는 ' requirements.txt'를 검색하면 관련 포스팅이 많이 나옴)

 

zip 파일 압축풀기

도커 데스크톱 > 컨테이너 > my_jup 클릭 > Files 탭을 클릭하고 압축파일을 드래그하여 원하는 디렉토리에 올린다.

디렉토리는 파이썬, 주피터랩이 어디에 설치되어 있는지에 따라 달라질 수 있다.

zip 파일이 올라간 것을 확인한 후 cmd창 실행하여 컨테이너 안으로 진입한다.

docker exec -it my_jup /bin/bash

cd ..
cd ///

 

컨테이너 실행 이후 설치할 디렉토리로 이동한다.

 

unzip zipfilename.zip

 

예시

unzip 36.zip

sudo unzip 36.zip


언집을 실행했지만 원활하지 않다면 앞에 sudo를 붙이면 된다.

 

패키지 설치

wheel파일이 들어있는 경로와 패키지 리스트가 적혀있는 경로를 정확히 입력하여 설치한다.

pip install --no-index --find-links=/패키지폴더경로/ -r /패키지리스트경로/requirements.txt

 

예시

pip install --no-index --find-links=/home/36/wheelhouse_36/ -r /home/36/requirements_36_f.txt

 

#시행착오1: 경로 확인과 입력 잘하기

띄어쓰기를 잘해야 하고, 큰따옴표(")나 작은따옴표(')를 붙이기도 했다가 슬래시(/)를 붙였다 지웠다 여러 시도를 해보기도 했는데, 정확한 경로를 확인하면 문제가 없을 것이다.

 

#시행착오2: 주석처리하기

패키지가 하나씩 설치되다가 중간에 오류로 멈추는 경우 requirements에서 주석처리를 했다.

도커 데스크톱에 있는 .txt는 바로 편집/저장이 가능하다.

 

#시행착오3: wheel파일 하나씩 설치해 보기

모든 wheel파일을 다 완벽하게 설치할 수 없다면, 꼭 필요한 패키지 위주로 하나씩 설치해 본다.

그 상황에서 오류가 뜬다면 필요 패키지를 설치하기 위해 우선적으로 깔려있어야 하는 패키지에 대한 언급이 오류메시지에 안내되어 있다.

pip install ./wheelhouse_38/sdv-1.5.0-py2.py3-none-any.whl

 

#시행착오4: 오류를 일으키는 패키지 주석처리하기

패키지 설치 시 많은 오류를 일으킨 주범이 있다.

써칭하니 kerberos(커버로스)가 그 주범으로 저 명칭이 들어간 패키지를 주석처리하니 설치가 원활하게 돌아갔다.

검색해 보니 'kerberos 사용자 인증(컴퓨터 네트워크 인증 암호화 프로토콜)'이란 단어들이 언급되는 것을 보니 보안을 유지하기 위한 오프라인 환경에선 설치가 불가한 패키지로 예상된다.

# pykerberos==1.2.4
# requests-kerberos==0.12.0

 

#시행착오5: 모든 패키지 강제로 재설치 --upgrade --force-reinstall

패키지가 있다고 하고, 막상 실행은 안돼서 패키지 강제 재설치를 진행했다.

pip install --no-index --find-links=wheelhouse_38/ -r requirements_38_f.txt --upgrade --force-reinstall

 

#시행착오6: 주피터랩 안에서 install 실행

sudo로 들어가면 생성/수정/삭제 권한은 있지만 설치한 패키지가 임포트 불가능한 상황, sudo가 아닌 상태로 들어가면 생성/수정/삭제 권한은 없고, 설치한 패키지 실행 가능한 상황이 연출되었다.

결국, sudo로 접속하여 랩 안에 있는 terminal에서 install을 실행하니 무리 없이 잘 설치되었고, import도 잘 되었다.

주피터랩 설치하기

랩이 설치되어 있지 않아 설치가 필요한 이미지를 받은 경우가 있고, 랩이 설치되어 있는 이미지를 받았지만 어떤 경로에 설치되어 있는지 모를 경우도 있다.

압축파일로 반입할 때 주피터랩 설치와 관련한 패키지도 같이 반입한다.

다른 패키지를 설치하기 전에 우선적으로 jupyterlab, jupyterlab_launcher, jupyterlab_server을 먼저 설치한다.

pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab
pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab_launcher
pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab_server

pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab_launcher-0.11.2-py2.py3-none-any.whl
pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab_server-1.0.0-py3-none-any.whl
pip install --no-index --find-links=/home/36/wheelhouse_36/ jupyterlab_1.1.1-py2.py3-non-any.whl

 

#시행착오7: 경로 설정

에러 떠서띄어쓰기도 수정하고, 버전을 지우고 실행하기도 했음에도 주피터 랩이 실행되지 않았다.

그래서 랩 경로 설정 진행하니 잘 되었다.

export PATH=$PATH:$HOME/.bin
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc

jupyter lab --ip 0.0.0.0 --allow-root

 

#시행착오8: 과정 반복

경로 설정 이후에도 랩이 실행되지 않아 경로를 수정해보기도 했지만 설치가 된 건지 아닌지도 확인하기 어려웠다.

주피터랩이 설치되어 있는지, 어디에 있는지 확인하고 확신을 가질 필요가 있었다.

find / -name jupyterlab 2>/dev/null

 

예시

user1@abcdefg:/$ find / -name jupyterlab 2>/dev/null
/home/asdf/asdf/asdf/jupyterlab
/usr/local/lib/asdf/asdf/jupyterlab

 

주피터랩이 두 군데나 설치되어 있었다.

그래도 확신을 가질 수 있는 것이 설치가 되어있다는 점, 경로 문제가 아니라는 것을 배제하고 sudo를 입력하지 않고 접속하니 무리 없이 잘 실행되는 것을 확인할 수 있었다.

jupyter lab --ip 0.0.0.0 --allow-root

 

앞에서도 간단하게 언급했지만, 기존에 사용하던 이미지를 받아와서 사용하다 보니 sudo를 사용하고 접속하는지 아닌지에 따라 사용권한이 달라졌다.

sudo를 입력하지 않고 진입한 경우 root에 가까운 일부 디렉토리에서는 파일 생성/삭제/수정이 불가한 상태여서 가능한 디렉토리로 이동하여 이용하기도 해야 했다.


마지막으로

프로젝트에 들어오면서 도커가 필요하단 얘기에 부랴부랴 유데미에서 강의를 질렀고, 급하게 지른 만큼 강의를 소화하지 못하고 아직까지도 수강 한번 하지 않았습니다.

또한, 개발 지식이 부족해서 리눅스 환경에서 사용하는 코드도 적응하는데 많은 시간을 소요하게 되었습니다.

 

어렵게 배운 것이 오래 기억에 남는다고 하지만, 진짜 어려운 건 눈에도, 귀에도, 머릿속에도 들어오기 전에 다 튕겨져 버렸습니다.

한번 해보고 다음에 쓰지 않을 수도 있겠단 생각에 기억하려 하지 않을수도 있고, 내 업무에 큰 비중을 차지하는 것이 아니란 생각에 기억하려 하지 않을수도 있겠단 생각도 했습니다.

배우지 않으려고 하는 저항감을 떨치고 제가 흡수할 수 있는 것은 최대한 흡수하기 위해서 메모장에 꾸준히 기록했던 것을 이번 포스팅을 통해 정리할 수 있었습니다.

 

무엇보다 이렇게 정리를 하면서 남에게 설명할 수 있는 것도 있지만 이해하지 못한 내용도 있습니다.

그럼에도 현재 프로젝트를 수행하고 있는 것은 동료분들의 도움이 컸고, 이런 게 협업이고 관계인가 싶어 속으로만 고마워하고 있습니다.

각자의 장점을 살려 동료와의 협업을 해볼 수 있는 기회가 주워져 있고 착한 일잘러 분들에게 많이 배울 수 있어 몹시 행복합니다.

 

갑작스러운 고해성사지만 저도 누군가에게 이 글을 통해서 도움이 되었길 바라며, 부지런히 공부해서 도커 강의에 대한 후기를 작성해 보도록 하겠습니다.

 

긴 글 읽어주셔서 감사합니다.😄