비개발자의 바이브 코딩 입문기: 이걸 다 깔으라구요? (5) Docker

소개

Docker 프로그램을 설치하고 활용해볼게요.

진행 방법

Docker란?

애플리케이션을 신속하게 구축, 테스트, 배포할 수 있는 소프트웨어 플랫폼으로, 리눅스 컨테이너 기술을 기반으로 한 오픈소스 가상화 도구입니다.

OS(Operating System, 운영 체제) 전체를 가상화하는 VM(Virtual Machine)과 달리 컨테이너는 OS 커널(항상 메모리에 상주하는 운영체제의 핵심이 되는 부분)을 공유하여 가볍고 빠르며, 애플리케이션과 종속성을 패키징해 환경에 구애받지 않고 실행합니다.

Docker의 강점은?

가상화 도구이기 때문에, 내 컴퓨터에 직접 설치하지 않아 가볍고, 내 노트북에서 개발한 환경을 테스트, 스테이징, 운영 서버까지 동일하게 배포할 수 있습니다.

핵심 용어는?

  1. 이미지 : 내가 만든 프로그램이 정상적으로 실행되기 위한 모든 정보가 담긴 설계도

  2. 컨테이너 : 이미지를 바탕으로 만들어진 실행 환경. 1개의 이미지를 가지고도 여러 컨테이너가 생성될 수 있다.

  3. 레지스트리 : 이미지를 공유하는 온라인 저장소, 대표적으로 Docker Hub.

Docker 설치

설치는 어렵지 않았어요. 설치 페이지에서 기본 옵션으로 빠르기 진행했습니다.
링크: https://docs.docker.com/desktop/setup/install/windows-install/

설치 완료된 후 컴퓨터를 재부팅하고, 터미널에서 설치를 확인해주었어요.

단어 목록이 표시된 검은색 화면

작동테스트

터미널에 docker run hello-world 명령어를 입력하였고, 환영 메시지도 받았습니다.

텍스트가 있는 검은색 화면의 스크린샷

웹서버실행하기

터미널에서 `docker run -d -p 8080:80 --name my-web nginx` 라고 명령어를 입력했어요. 스터디장님의 docker 활용 자료를 따라하고 있는데 명령어는 복사붙여넣기 하기보다 손으로 직접 타이핑해서 치고 있어요. 용어들이 익숙하지 않으니까, 필사하는 느낌이랄까요 ㅎㅎ

해석: docker run 새로운 컨테이너를 실행하세요

-d 컨테이너를 백그라운드 모드로 실행하세요. -> 백그라운드 모드가 아니면, 터미널 창에 긴~~~~~ 컨테이너 로그 메시지가 작성되면서 스크롤 압박이 오기도 하고, 터미널을 종료하면 컨테이너도 함께 종료되기 때문에

-p : Port Forwarding. 포트 포워딩. 내 컴퓨터와, 컨테이너를 연결하는 통로를 만드세요. -> 도커 컨테이너는 독립된 가상 환경이기 때문에, 해당 명령어를 통해 내 컴퓨터의 특정 포트로 들어오는 신호를 컨테이너로 전달해줘야 함. 이 신호가 오고가는 통로를 만드는 명령어

8080:80 내 컴퓨터의 문 : 컨테이너 포트
--> 왜 8080번일까?
1개의 컴퓨터에는 0번부터 65535번까지 문이 달려있음. 그 중에 80번째 문, '80번 포트'는 전 세계 모든 컴퓨터가 "여기는 기본 웹 서비스(HTTP) 입구입니다"라고 약속해둔 전용 통로임. 그런데 80번 포트는 시스템 권한이 필요하거나 이미 다른 서비스가 점유하고 있는 경우가 많음. 그 중에 8080을 사용하는 이유는 '80'과 비슷하게 생겼다는 관습적인 이유 때문임. 8888, 7777, 9999를 써도 괜찮음. (?????)

비유해보자면...

  • 컨테이너: 아파트 내부의 특정 세대 (예: 101동 202호)

  • 컨테이너 포트 (80): 그 세대 안의 '거실'

  • 호스트 포트 (8080): 아파트 단지 입구의 '8080번 무인 택배함'

--name my-web : 실행될 컨테이너에 이름을 붙일게요. 그 이름은 'my-web' 이라고 할게요.

nginx : 컨테이너를 만들 때에는 nginx 라는 이미지를 사용할게요.
nginx는 전 세계적으로 가장 많이 쓰이는 웹 서버 소프트웨어 설계도임. 프로그램 실행에 필요한 코드, 런타임, 설정, 라이브러리를 뭉탱이로 압축한 설계도.

Python 스크립트의 스크린샷

그리고 크롬 브라우저에서 http://localhost:8080 에 접속해서, 정상적으로 작동하는 것을 확인했습니다.

nginx의 시작 페이지 스크린샷

데이터 베이스 실행하기

이번엔 터미널에 다음 명령어를 입력해요.
docker run -d -p 5432:5432 --name my-db -e POSTGRES_PASSWORD=1346 postgres

해석: 컨테이너를 실행하는데, 백그라운드에 실행하고요,
포트연결은 내 컴퓨터 5432포트와, 컨테이너 5432포트를 연결하세요.
(왜 5432냐면, Postgres의 표준 포트번호가 5432이기 때문. 이건 그냥 전 세계 약속.)
컨테이너 이름은 my-db라고 지었어요.

-e : Environment. 컨테이너 내부에서 사용할 환경변수를 설정해요.
PostgresSQL 이미지는 보안을 위해 비밀번호가 설정되지 않으면 실행되지 않도록 설계되어 있기 때문에, 비밀번호도 함께 설정해준거에요.

Postgres : 이미지인데, 공식풀네임은 PostgresSQL 인듯?
설치과정 없이 바로 꺼내 쓸 수 있는 완벽하게 세팅된 데이터베이스 박스.
(아직 데이터가 하나도 없는데 어떻게 데이터베이스가 완벽하게 세팅되요?)
-> 내가 저장할 데이터를 담을 시스템이 즉시 사용 가능한 상태로 준비되었다는 뜻.
데이터를 관리하는 database engine이 활성화되고, 데이터를 빠르게 처리하기 위한 공간을 확보하고, 어떤 데이터가 들어오는지 기록하기 위한 로그를 준비하고, ..

파일 목록을 보여주는 컴퓨터 화면의 스크린샷

혹시나하고 이것도 브라우저에 http://localhost:5432 접속해봤는데 localhost에서 전송한 ㄷㅔ이터가 없다고 empty response가 떴어용.

이건 나중에 어떻게 활용하게 될까욤?~?

서비스 띄워보기 (1) 모니터링 대시보드(uptime Kuma)

명령어: docker run -d -p 3001:3001 --name kuma louislam/uptime-kuma

해석: 컨테이너를 실행하세요, 백그라운드에, 내 컴퓨터 포트 3001과 컨테이너 포트 3001을 연결해서, 컨테이너 이름은 kuma 로 할게요. 이미지는 louislam/uptime-kuma 입니다.
오호,, 여기서, louislam은 해당 이미지를 만들어서 도커 허브에 배포한 제작자의 ID라고 함.

브라우저에서 http://localhost:3001 에 접속하면 아래와 같이 로그인창이 뜹니다. 처음에는 생성하기? 창이 떴는데, 캡처하기 전에 로그인 해버렸;; 뭐 핸드폰 번호 확인하고 자시고 하는거 없이 그냥 쿨하게 회원가입 되었서용.

컴퓨터 화면의 가동 시간 Kuma 앱

로그인을 하면 이런 대시보드가 뜹니다.

뭘 모니터링 하는 걸까요? Gemini한테 물어봤습니다.

내가 앞으로 서비스를 만들게 되면, 그 서비스들이 잘 돌아가고 있는지, 오류는 없었는지 실시간으로 감시해서 보기좋은 UI로 보여주는 도구라고 하네요.

아직 서비스가 하나도 없어서 ^,^ 쓸데가 없나 했더니,

구글이나 네이버, 업비트, Chat GPT 같은 범용 서비스를 등록할 수도 있군요. 등록된 서비스에 문제가 생겼을 경우에 "내 인터넷이 문제인지, 네이버 서버가 문제인지"를 판가름 할 수 있다고 하네요. 업비트 같은 경우에는 서버에 문제가 생기면 급매수/매도가 많다 -> 비트코인 가격 변동성이 높아진다로 해석할 수 있겠네요.

한국어와 중국어가 표시된 컴퓨터 화면의 스크린샷

서비스 띄워보기 (2) 개발자 유틸리티 모음(it-tools)

명령어: docker run -d -p 8081:80 --name tools corentinth/it-tools

해석: 컨테이너를 실행하세요, 백그라운드에, 내 컴퓨터 8081 포트와 컨테이너 80포트를 연결하고, 컨테이너 이름은 tools 입니다. 이미지는 corentinth가 만든 it-tools 를 사용할게요.

브라우저에서 실행하니까, 아래의 화면이 떳어용!
여러가지 tool들이 많아요. 이걸 제가 써먹을곳은 아직 없지만~~

다양한 유형의 게임을 보여주는 웹페이지 스크린샷

인스타그램 주소로 qr코드 만들어봤어욥 ㅎㅎ

검은 화면에 QR 코드가 표시됩니다

서비스 4개를 모두 실습해보기에는 시간이 어려워서 2개만 해봤어요 ㅎㅎ

실행 중인 서비스 확인

명령어: `docker ps`

해석: ps는 Process Status(프로세스 상태)의 줄임말. 현재 실행 중인 프로그램의 목록을 보여주세요.

여러 숫자가 표시된 검은색 화면

명령어 뒤에 -a 를 붙이면, 실행 중인 것 뿐만 아니라 종료된 컨테이너까지 모두 보여줘요

여러 숫자가 표시된 검은색 화면

정리하기

서비스를 중지하는 명령어는 docker stop [컨테이너이름]

서비스를 중지한 뒤, 아예 삭제까지 원한다면 명령어 `docker rm [컨테이너이름]`
(서비스가 돌아가고 있는 중에는 삭제는 안됨. 중지를 먼저 명령하고, 삭제를 해야함)

이미지 삭제는 `docker rmi [이미지이름]`

모든 컨테이너를 중지하고 그 중에 일부 컨테이너는 또 삭제까지 한 다음 리스트를 확인해보니까, STATUS가 exited로 바뀌었고, 삭제된 컨테이너는 리스트에서 없어졌어요.

Linux 명령줄의 스크린샷

전체 대청소(전체 삭제) 명령어는 docker system prune -a 를 입력하면 됩니다.

해당 명령어는 warning이 떠요. Y를 입력해야 실행이됩니다.

명령 실행 후 다시 한번 리스트를 확인해보니 docker ps -a
리스크가 깨끗해진것을 볼 수 있었어요.

Python 스크립트의 스크린샷

도움 받은 글 (옵션)

스터디장님께서 공유해주신 <AI스터디 21기 개발환경셋팅 — 실수가 자유로운 개발 연습장 만들기> 자료를 보고 따라했어요~

2
1개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.