Docker, 한 줄이면 될까? 된다!

AI talk 때 스터디장님께서는 "Docker, 한 줄이면 됩니다"라는 제목으로 도커를 설명해주셨다. 그래서 정말 1줄이면 Docker가 될까? 생각했다. 하지만 그 1줄을 실행시키기까지는 참으로 많은 여정들을 거쳐야 했다.

지난 2주간 개발환경셋팅 스터디를 통해 Git, Scoop, FNM, WSL 등을 설치해왔다. 나는 Windows를 주로 사용하고 있으므로, Windows에 Docker를 설치해서 사용하기로 했다. Docker를 사용하려면 먼저 Docker Desktop을 설치해야 한다.

## 3. Docker Desktop 설치하기

### Windows

**설치 전 확인 사항:**

- 윈도우 10 빌드 19045 버전 이상, 64비트
- 최소 4GB 메모리
- BIOS에서 가상화 기능 활성화 (최근 컴퓨터는 대부분 기본 활성화)
- WSL 2가 설치되어 있으면 성능이 더 안정적

**설치 방법:**

1. [공식 설치 페이지](https://docs.docker.com/desktop/setup/install/windows-install/)에서 설치 파일 다운로드
2. 기본 옵션으로 설치 진행
3. 재부팅 후 Docker Desktop 실행
4. 트레이에 고래 아이콘이 나타나면 준비 완료

설치 전 확인사항을 체크해보니, BIOS에서 가상화 기능 활성화 항목이 있었다. 비록 BIOS를 살펴보지는 않았지만, 활성화되어 있으려니 생각하고 그냥 넘어갔다. 만약 문제가 발생하면 그 때 BIOS에 들어가보면 될 것이라 생각했다.

WSL 2가 설치되어 있으면 성능이 더 안정적이라고 하는데, 지난번에 WSL 2를 설치했던 것 같았다.

그런데 의문이 들었다. WSL을 쓸 때, WSL 자체가 Linux인데, Docker Desktop은 Windows에서 설치해야 하나? 그러면 WSL에서도 저절로 Docker Desktop을 쓸 수 있는 것일까? 이러한 꼬리에 꼬리를 무는 물음 속에서 일단 그냥 Windows용 Docker Desktop을 설치했다.

파란색 배경의 블루 스크린 스크린샷

설치 후 실행하면 이렇게 가동 화면이 뜨고,

다양한 옵션이 포함된 블루 스크린 스크린샷

마침내 Docker desktop 화면이 뜬다.

교안에 나와 있는 대로 트레이에 고래 아이콘까지 확인 완료!

교안에 나와있는 대로 도커 버전을 확인하고, 작동 테스트로

docker run hello-world

를 해봤다.

검은색 화면이 있는 컴퓨터 화면의 스크린샷

처음에 unable to find image 'hello-world:latest' locally라고 나와서 긴장했지만, docker가 알아서 hello-world image를 pull하고 download 받아서 환영메시지를 내보냈다.
이로써 준비 완료!

지금 나의 Docker desktop의 상황은?

파란색 배경의 블루 스크린 스크린샷


hello-world를 2번 실행했더니, 2개의 이미지가 생겨버렸다. 그런데 claude-box는 뭘까? 5일 전에 생성된 것 같은데, 모르겠다. 아마 3주차 강의 들을 때 잠깐 깔았었던 것 같다.

그런데 이게 WSL에서도 실행이 될까? 궁금했다. 그래서 WSL 터미널에 접속해서 실행해봤다.

검은색 화면이 있는 컴퓨터 화면의 스크린샷

일단, docker version이 나오는 것을 보니 설치는 제대로 된 것 같다. 그러면 wsl에서 도커로 hello-world를 실행해봐야겠다.

이게 WSL에서도 마찬가지로 작동한다. Docker desktop 프로그램을 살펴보니 방금 실행한 hello-world가 추가됐다.

생각해보니 Docker는 결국 가상환경에 최소한의 운영체제(커널)와 프로그램을 띄우는 것이므로 그것을 windows에서 띄우든지, 아니면 WSL에서 띄우든지, Mac이나 Linux에서 띄우든지 별반 차이가 없다는 생각이 들었다. 어차피 어느 운영체제에서 띄우든지 간에 도커에 띄워진 프로그램은 도커 컨테이너 안에 있는 OS를 기반으로 실행될 테니 말이다.

그러면 이제 본격적인 실습에 들어가야겠다.

강의 교안에 첫 번째로 있는 것은 nginx 웹 서버를 도커로 실행하는 것이다.

nginx로 구체적으로 무엇을 하는지는 모르겠지만, 일단 아주 유명한 웹 서버라고 하니 실행해본다. 뭔가 긴장된다.

nginx가 설치되어 있지 않으니 당연히 unable to find image 'nginx:latest' locally라는 메시지가 뜨고, 설치가 진행된다. 그리고 아래와 갈이 설치가 완료된다.

Docker desktop 프로그램에서는 my-web이라는 이름의 컨테이너가 추가됐다.

아~ 진짜 한 줄이면 되는 Docker였다. 이렇게 간단하게 되다니, 오히려 믿기가 힘들었다.

Docker desktop의 Container 화면에서 설치된 이미지 옆에 있는 Port(s) 부분을 클릭하니 nginx 서버 환영메시지가 나온다. 내 컴퓨터에 nginx가 깔린 것이다.

WSL.에서 설치하면 또 설치가 될 것 같다. 같은 것을 설치할 필요는 없으므로 Step 2에서 다른 것을 WSL로 설치해봐야겠다.

Postgre DB를 설치하는 STEP 2를 건너뛰고, STEP 3: 재미있는 서비스 띄워보기에 끌려서 STEP 3로 왔다.

WSL 터미널에서 위의 명령어를 실행해봤다.

뭔가 열심히 다운로드받더니, 아래와 같이 설치되었다.

Docker Desktop을 보니, 역시 설치가 되었다.

그런데, 위의 nginx와 달리 Port(s)에 링크가 없었다.
살짝 당황했지만, 아직 실행이 되지 않아서인 것 같았다.

그래서 오른쪽 Acions에 있는 삼각형 모양의 실행 버튼을 눌러보았다.

그런데, 500 서버 에러가 났다. 뭔지 모르겠지만 권한 문제도 있는 것 같고...약간 당황스러웠다. 클로드 양에게 물어볼 수밖에 없는데, 일단 한 번 구글에서 찾아볼까?

구글에 이렇게 쳐봤다.

해당 오류는  Windows 가 포트와 소켓을 독점하여 Docker 와 같은 서비스에서 사용할 수 없게 할 때 렌더링하는 오류

라고 한다.

다른 사이트에서는 포트 충돌의 가능성, 관리자 권한으로 도커를 실행하라는 조언 등등이 있었지만, 내 container에 있는 프로그램의 포트는 중복되는 것이 없었고, 관리자 권한으로 실행하는 것은 나중에도 할 수 있을 것 같아서 일단 티스토리에서 말하는 대로 해 봤다.

이 문제를 해결하려면 일시적으로 winnat 서비스를 비활성화해야 한다고 한다.

그래서 관리자 권한으로 명령프롬프트(cmd)를 실행하여

net stop winnat

이라고 하고, 아까 안 됐던 도커 서비스를 시작하고 종료한 winnat을 다시 시작했다.

net start winnat

물론 kuma 모니터링 대시보드도 잘 실행됐다.

중요한 것은 도커가 저런 메시지를 보내며 실행되지 않는다면, 관리자 권한으로 cmd를 실행해서 winnat을 중지시킨 후에 도커를 실행하고, 그 후 중지된 winnat을 다시 시작해야 한다는 것이다.

실행된 kuma 대시보드를 실행해보니 아래와 같은 대시보드가 나타났다. 그런데 사용법을 모르겠다.

어쨌든 2개의 도커 중 하나는 windows teminal에서 nginx를 설치했고, 다른 하나는 WSL에서 kuma를 설치했는데, 둘 다 성공했다. 중간에 에러가 있어서 살짝 당황했지만 google 검색을 통해 해결할 수 있었다.

다음은 개발자 유틸리티 모음이다.

이번에도 한 줄 명령어로 설치했다.

뭔가 무시무시한 개발자 도구들이 펼쳐졌다.

오른쪽 상단에 커피를 사달라고 하는데, 커피는 안 사야겠다.

이러고보니 docker의 세계는 무궁무진한 것 같다.

예전 AI-talk때 보여주셨던 것 중에 끌리는 것들을 설치해봐야겠다.

유튜브 다운로더, 이거 뭔가 유용하게 써먹을 것 같았다.

위의 명령어 1줄을 그대로 복붙! 설치가 됐는데, 뭔가 에러메시지가 신경쓰인다.

Docker desktop에도 설치된 흔적이 없다.

다시 에러메시지와 실행명령어를 들여다 보았다.

에러메시지는 다음과 같았다.

docker: Error response from daemon: create "$(pwd)/downloads" invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path

그리고 내가 실행한 명령어는 다음과 같았다.

C:\Users\TEARESS>docker run -d --name metube -p 8081:8081 -v "$(pwd)/downloads:/downloads" ghcr.io/alexta69/metube:latest

뭔가 문제가 되는 부분은 "$(pwd)/downloads" 부분인 것 같았다. 그러고보니 다른 docker 설치 명령에는 저런 부분이 없었던 것 같다.

기억을 더듬어보니 pwd는 linux에서 쓰이는 명령어같았다. 현재의 디렉토리 위치를 조회하는 그런 명령어였던 것 같다. 그렇다면 windows teminal에서는 저 명령어가 에러를 일으킬 수도 있을 것이었다.

그래서 같은 명령어를 WSL에서 실행해봤다.

이번에는 다른 에러메시지가 나왔다. 아까와 같은 port가 이미 할당됐다는 메시지였다.

그러면 다시 관리자 권한으로 cmd에서 winnat을 중지시켜야겠다고 생각하기 앞서, 일단 metube가 docker desktop Container에 설치는 된 것인지 살펴보았다.

아까 kuma 대시보드를 설치할 때와 마찬가지로 설치는 됐는데, 녹색 불이 안 들어오고, Port(s)도 비활성화된 상태이다.

그러면 winnat을 중지시키고 실행해야겠다.

그런데 분명 실행까지 시켰는데, Docker desktop에 포트가 안 나타난다.
분명히 위에서 비활성화되긴 했지만 8081:8081 포트가 있었는데,
실행시키니까 포트번호가 없다.

it-tools가 8081 포트를 쓰고 있어서 뭔가 문제가 생긴 것 같다.
그래서 같은 포트번호 8081을 쓰고 있는 it-tools와 metube를 모두 중지시켰다.

그러니 포트가 살아났다.

이번에는 it-tools는 비활성화 한 채로 metube를 실행해봐야겠다.

그래도 나타나지 않는다.

metube의 포트번호를 바꿔줘야 할 것 같다.

일단 metube의 도커 실행을 중지시킨다.

스터디의 강의안에도 자주 만나는 문제로 포트가 이미 사용중인 경우가 있다.

다른 컨테이너를 중지했는데도 안 되는 것을 보니, 아무래도 포트 번호를 변경해야겠는데, 포트번호 변경 어떻게 하지?

google에 찾아보니 뭔가 방법이 복잡한 것 같다.

$ docker stop <container_name>
/var/lib/docker/containers/[컨테이너의 hash 값]/hostconfig.json 수정
/var/lib/docker/containers/[컨테이너의 hash 값]/config.v2.json 수정
$ sudo service docker restart
$ docker restart <container_name>

이런 방법이 있겠지만, container의 hash 값을 알아내는 것도 문제고, json 문서를 수정하는 것도 일인데다, 다시 docker를 restart해야하는 것도 있어서, 이것은 하지 않고, 그냥 설치했던 metube를 지우고 다시 포트를 다른 번호로 해서 재설치하기로 했다.

삭제하고 다시 설치한다.

오~ 포트번호 바꿨더니 금세 설치됐다.

그런데 localhost로 접속해보니 페이지가 뜨지 않는 것이었다. it-tools를 지우고 metube만 설치해보고, 여러가지 방법을 써봤지만 결국 페이지가 뜨지 않아서 실패했다.

이번엔, memos를 설치해본다.

이것은 트위터처럼 짧게 메모를 남길 수 있는 서비스이다.

docker run -d --name memos -p 5230:5230 -v memos_data:/var/opt/memos neosmemo/memos:stable

도커를 설치, 실행하고 http://localhost:5230에 접속한 화면이다.

이렇게 도커 설치가 끝났다.
설치하고 나니 들었던 의문은 내 컴퓨터에 설치된 docker에 외부에서 접근하려면 어떻게 하는 것이 손쉬운 방법일까였다.

도커로 내가 원하는 서비스를 내 컴퓨터에 띄워놓고, 외부에서 마음대로 접근할 수 있도록 하면 별도의 웹호스팅 서비스를 거치지 않고도 외부에 배포가 가능할 것 같은 생각이 들었다.

그래서 좀 더 연구해봐야겠다.

PS. One more thing...

예전 AI-talk 때 스터디장님이 만드신 슬라이드 자료이다.

docker run -d --name ai-talk -p 3302:3000 nestezup/ai-talk-slides

이 명령어 한 줄이면, 이 발표 슬라이드가 내 컴퓨터에서 돌아간다니? 어떻게?

그래서 저 docker 명령어를 그대로 복붙 실행해봤다.

그리고 localhost:3302로 접속했더니 발표슬라이드 전체가 내 로컬환경에서 돌아가는 것이었다.

이게 신기해서, 이것을 클로드 양에게 물어서 분석해봤다.

이 슬라이드의 내용은 nestezup/ai-talk-slides라는 docker image 안에 있고, 이것이 docker hub에 배포된 것이었다. 내가 저 명령어를 실행하는 순간, docker hub에 있는 nestezup/ai-talk-slides라는 이미지가 자동으로 다운로드되고, 컨테이너가 생성, 실행되며, 컨테이너 내부 포트 3000번이 로컬호스트 3302번 포트에 포워딩되고, 내가 localhost:3302로 접속하면 컨테이너 안에서 돌아가는 웹서버가 슬라이드를 제공하는 것이었다.

그렇다면 이 내용을 웹앱으로 만들어서 도커 이미지로 구운 후, docker hub에 배포하는 것이 궁금한데, 이것은 차차 알아가봐야겠다.

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요