14장. Streamlit 화면과 Docker 컨테이너
컨테이너와 Docker
이사할 때 짐을 규격 상자에 담으면, 어느 트럭에 싣든 어느 집에 내리든 그대로 옮겨집니다. 내 PC 에서 잘 돌던 서비스가 서버에서는 "파이썬 판이 달라서", "패키지가 없어서" 돌지 않는 일이 흔합니다. 컨테이너는 프로그램과 그 프로그램에 필요한 파이썬, 패키지, 설정을 한 상자에 담아, 어느 컴퓨터에서나 같은 모습으로 띄웁니다.
왼쪽은 컴퓨터에 파이썬과 패키지를 그냥 설치하는 것으로, 가볍지만 프로그램끼리 판이 부딪힙니다. 가운데 가상 머신은 운영체제까지 통째로 따로 두어 확실히 떼어 놓지만 무겁습니다. 오른쪽 컨테이너는 운영체제의 핵심(커널)은 함께 쓰고, 그 위의 파일과 패키지만 떼어 놓아 가볍고 빠르게 뜹니다. 여기서 규격 상자가 컨테이너, 상자에 담는 법을 적은 목록이 Dockerfile 입니다.
Docker 의 낱말
| 낱말 | 뜻 | 비유 |
|---|---|---|
| 이미지 | 컨테이너를 만드는 틀. 바뀌지 않는다 | 상자의 설계도와 꾸러미 |
| 컨테이너 | 이미지로 띄운 실행 중인 프로그램 | 열어서 쓰는 상자 |
| Dockerfile | 이미지를 만드는 순서 | 짐 싸는 목록 |
| 레지스트리 | 이미지를 올리고 받는 곳 | 상자 보관 창고 |
| 포트 연결 | 컨테이너 안의 포트를 PC 의 포트에 잇기(-p 8013:8013) | 상자에 낸 창구 |
| 볼륨 | 컨테이너를 지워도 남는 저장 공간 | 상자 밖의 창고 |
이 PC 에 Docker 가 있는지 보기
import shutil
# docker 명령을 찾을 수 있는지 본다. 교안을 만든 PC 에서는 None 이었다
print("docker:", shutil.which("docker"))
print("wsl:", shutil.which("wsl"))코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
import shutil | shell utilities(셸 도구) 모듈이다. 파일 복사, 명령 찾기 같은 일을 한다 |
shutil.which("docker") | 터미널에 docker 라고 쳤을 때 실행될 프로그램의 위치를 찾는다. 없으면 None 을 돌려준다. which 는 "어느 것"이라는 뜻이다 |
shutil.which("wsl") | WSL(Windows Subsystem for Linux, 윈도우 안의 리눅스 환경) 명령이 있는지 찾는다 |
이 코드가 뜻하는 것
이사 전에 창고에 수레가 있는지 둘러보는 일과 같습니다. 있으면 그 위치를 적고, 없으면 "없음"이라고 적습니다. 여기서 수레가 docker 명령, 둘러보기가 shutil.which 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
print("docker:", shutil.which("docker")) | docker 명령의 위치를 찍는다 | 수레가 어디 있나 |
print("wsl:", shutil.which("wsl")) | wsl 명령의 위치를 찍는다 | 수레를 놓을 자리가 있나 |
교안을 만든 PC 에서는 docker: None 이 나와 Docker 가 없었고, wsl 은 C:\WINDOWS\system32\wsl.EXE 에 있었습니다. wsl 명령이 있다고 WSL2 와 리눅스 배포판이 다 설치됐다는 뜻은 아닙니다. 내 PC 에서 돌리면 결과가 다를 수 있습니다.
주의할 점
- Windows 의 Docker Desktop 은 WSL2(리눅스 환경) 위에서 돕니다. 설치에는 관리자 권한과 재부팅이 필요하고, 큰 회사는 유료 구독이 필요할 수 있습니다. 폐쇄망이라면 Docker 설치 파일과 이미지도 11장처럼 반입합니다.
- 컨테이너 안에서 GPU 를 쓰려면 NVIDIA 드라이버와 NVIDIA Container Toolkit 이 필요합니다. 이 장의 예측 API 와 화면은 GPU 가 필요 없습니다.