안녕하세요. 이상한 프로그래머, 야매 프로그래머 입니다.
지난 시간에 Docker를 설치 했습니다. 설치를 했다면 이제 유용하게 사용 해야 갰지요. Docker 공식 문서의 Get Started 항목의 내용을 줄기로 해서 기본적인 사용 방법을 함께 실습 해보도록 하겠습니다. 프로그램이나 언어를 제공하는 공식 문서를 참고하는 방법은, 새로운 프로그램이나 언어를 학습을 할 때 가장 좋은 학습 방법이 아닐까 생각이 됩니다.
Docker공식 문서의 Get Started의 하위 메뉴를 보면 총 10개의 파트 내용으로 나열 되어 있습니다. 영상은 적당한 시간으로 자르다 보니, 1개의 영상에 1~2개 파트 정도로 잘라서 실습 하게 되 갰네요. 함께 실습을 해 나가면서, 중간에 추가 내용이 필요 하다 싶은 부분은 제가 한번 덧 붙여 보도록 하겠습니다.
간단하게 제가 그려 본 Docker의 작동 구조도 입니다. 조악하기 그지 없네요.
구조를 간단하게 설명 하면, 호스트 컴퓨터 우리의 컴퓨터 이죠. 우리의 컴퓨터에 Docker 데몬, Docker 프로그램이죠. 이 녀석이 작동 하고 있습니다. 이 Docker 데몬은 이미지와 컨테이너를 관리 합니다. 그리고 클라이언트 사용자인 우리의 명령을 받아, 이런 이미지를 생성 하거나, 컨테이너를 생성하거나 관리 하는 작업을 하게 되는 것 입니다. 그리고 여기 아래, 이 것은 레포지토리 입니다. Docker에서 공식으로 운영하고 있는 DockerHub 라는 곳이 기본으로 연결 되어 있고, 상황에 다양한 사설 레포지토리 에 접속 하여 이미지를 배포하거나 공유 받을 수 있는 구조로 되어 있습니다. 이렇게 보니 작동 구조는 매우 간단 하지요? 우리는 여기서 이미지와 컨테이너가 무엇 인지 잘 이해 하고 있으면 됩니다.
컨테이너
Docker에서 이야기 하는 컨테이너는, 샌드박스 프로세스로 격리 된 프로세스 입니다. 가상 머신 개념으로는 이 컨테이너가 생성 된 가상 머신 이라고 생각 할 수 있습니다. 프로그램 개념으로 생각을 해보면, 인스턴스화 된 객체 정도라고 생각 하시면 이해가 빠르겠네요. 컨테이너는 한번 생성 한 후에는 작동 중지 하거나, 재 실행도 가능하며, 당연하 삭제 가능하고 복제 하거나 이동 하는 것도 가능 합니다.
이미지
이미지는 컨테이너를 생성하기 위한 정보가 든 패키지 입니다. 이미지에는 컨테이너 생성을 위한 각종 의존성 정보, 실행 스크립트, 프로그램 바이너리 등등이 포함 되어 있습니다. 프로그래밍 개념으로 보자면 이미지는 클래스라고 생각 하시면 이해가 빠를 것입니다.
이 두 가지 요소만 잘 알고 있으면, Docker를 이용 하는데 필요한 내용은 거의 다 알고 계신 것 이라고 생각해도 괜찮아 보입니다.
이제 Part 2. 어플리케이션을 포함한 Docker 컨테이너 생성을 함께 진행 하도록 하겠습니다. 내용 진행을 위해서는 몇 가지 준비물이 필요 합니다. Git 프로그램과 스크립트 내용을 편집하기 위한 에디터 입니다. 공식 문서에서 친절하게 링크까지 제공 하고 있습니다. 에디터의 경우에는 손에 익은 편한 에디터를 사용하긴 되지만, 여기 문서에서 추천하는 VSCode 는 상당이 좋은 에디터이고, 여러 프로그래밍 작업을 할 때 유용 하게 사용할 수 있습니다. 제 영상에서도 프로그래밍 관련 내용을 진행 할 때 대부분 이 VSCode를 사용할 예정이라 한 번 사용 해 보시는 걸 추천 드립니다.
필요한 프로그램 설치가 모두 되었다면, getting-started-app 코드를 클론 받아 보겠습니다. 터미널을 열고 원하는 위치로 이동해서 클론 받습니다.
git clone https://github.com/docker/getting-started-app.git
소스 코드 클론이 성공 하였다면, 소스 코드가 있는 디렉토리로 이동하여 정상적으로 잘 내려 받아졌는지 확인 해 봅니다. 아래와 같은 내용이 모두 있어야 합니다.
g-started-app/
g-started-app/package.json
g-started-app/README.md
g-started-app/spec/
g-started-app/src/
g-started-app/yarn.lock
이제 이미지를 만듭니다. 위에 설명 할 때 컨테이너는 인스턴스 된 객체, 이미지는 클래스 같은 개념 이야기 했었습니다. 컨테이너를 만들기 위해서는 이미지가 필요 합니다. 이미지는 Dockerfile 이라는 스크립트를 작성 해서 이미지를 생성 하게 됩니다. 현재 소스 코드의 디렉토리에서 Dockerfile 생성한 후 스크립트를 아래와 같이 작성 해 봅니다.
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
Dockerfile 파일 내용을 간단하게 살펴 보겠습니다.
FROM, node:18-alpine 이라고 해 두었다면, 처음 Docker 구조 그림에서 스쳐 지나가며 설명 드린 외부 레포지토리, 특별히 지정 하지 않았다면 디폴트로 되어 있는 DockerHub 로부터 공개 되어있는 node:18-alpine 이미지를 참조해 옵니다. alpine linux 배포판에 nodejs 18버전이 세팅 되어 있는 베이스 이미지군요. 다음에 기회가 된다면 이 DockerHub 레포지토리 함께 살펴 보죠.
WORKDIR, 은 생성 될 컨테이너가 기본적인 작업이 진행 될 디렉토리를 지정 하는 것입니다. 이렇게 /app 디렉토리가 지정 되어 있다면 컨테이너에 /app 디렉토리가 생성 되고, 이 컨테이너로 전달 되는 명령은 기본적으로 이 디렉토리 기준에서 작동 하게 됩니다.
COPY, 는 이 이미지에 Dockerfile 이 빌드 되는 위치에 있는 파일들을 모두 복사하여 포함 시키겠다는 의미 입니다. 개별 파일을 지정 할 수도 있고 지금처럼 디렉토리 단위로 복사 할 수 있습니다. 이 복사 된 파일은 위에 지정한 WORKDIR 디렉토리에 그대로 복사 되게 됩니다.
RUN, 이 명령은 이미지를 빌드 하는 과정에서 실행시킬 명령 내용입니다. yarn 패키지는 nodejs 런타임 패키지 이죠. —production 옵션이 붙은 것 봐서는 getting-started-app에 의존성 패키지들을 서비스 레벨로 설치하여 이미지에 포함 하려는 의도로 보이네요.
CMD, 이 명령은 이미지를 컨테이너로 실행 시킬 때 실행 시킬 명령 입니다. 이 명령처럼 컨테이너 실행시에 작업을 지정 하지 않으면, 컨테이너는 아무 작업이 없기 때문에 실행 하자마자 종료 됩니다. 여기서는 getting-started-app 을 실행 시키네요.
EXPOSE, 이 명령은 컨테이너 실행 시 개방 시킬 통신 포트 입니다. 열린 포트가 없다면 getting-started-app에 접근 할 수가 없습니다. 컨테이너는 일반적으로는 모든 포트가 닫혀 있으므로, 이런 식으로 개방할 포트를 지정해 두어야 컨테이너 실행 시 해당 포트로 접근이 가능 합니다.
빌드를 진행해 보도록 합니다.
docker build -t getting-started .
-t 옵션은 빌드 이미지의 태그 명을 지정하기 위한 옵션 입니다. 이미지를 빌드 할 때 태그명을 명시적으로 지정 하지 않으면, 이미지 ID로 접근을 해야 하는데 아주 불편하니 이미지를 빌드 할 때는 이미지 태그명을 붙이는 것이 좋습니다. 끝에 . 는 현재 명령이 실행 되는 위치에 있는 Dockerfile 을 찾으라는 이야기 입니다. 다른 위치에 Dockerfile 이 있다면 그 위치를 넣으면 됩니다.
빌드를 시작하면, Dockerfile 의 지시내용을 순차적으로 실행 하면서 이미지를 생성 하기 시작합니다. 빌드가 끝났다면 이미지가 잘 생성 되었는지 보도록 하죠.
docker images ls
getting-started 라는 태그 명이 붙은 이미지가 목록에 보인다면, 이제 컨테이너를 생성하고 실행 할 준비가 다 되었네요.
이제 컨테이너를 실행 해 봅시다.
docker run -dp 127.0.0.1:3000:3000 getting-started
자 명령어 들에 대한 자세한 설명은 나중에 또 자세히 볼 일이 있을 겁니다. 일단, 현재 명령어를 살펴 보면 docker run 실행 해라 -d 데몬 프로세스로 백그라운드 에서 실행해라, -p 퍼블리쉬 매칭 을 요구 하는 것으로 컨테이너와 호스트 우리 컴퓨터와 포트 매핑을 명령하는 옵션 입니다.
뒤에 127.0.0.1:3000:3000 그 의미 입니다. 호스트의 127.0.0.1:3000 포트에, 컨테이너 EXPOSE 했던 3000번 포트를 매핑 하는 거죠. 그러면 컨테이너가 실행됐을 때 127.0.0.1:3000으로 접근을 하면 컨테이너에 실행 중인 어플리케이션으로 접근이 가능 합니다.
맨 마지막은 어떤 이미지를 컨테이너로 실행 할지 태그 이름이죠. 이제 명령을 실행해 봅시다.
실행이 되었다면 웹 브라우저를 열고 위에 매핑한 대로 http://127.0.0.1:3000 또는 http://localhost:3000 접근을 하면 짜 짠 잘 실행이 되고 있는 것을 볼 수 있습니다.
자 이 컨테이너 프로세스가 잘 실행 되고 있는지도 한번 확인 해보도록 하죠. 두가지 방법이 있습니다. 제공 되고 있는 GUI를 통해 확인하는 방법과 콘솔 명령을 이용하는 방법이지요. 우선 콘솔 명령으로는.
docker ps
아래와 같은 내용이 나온다면 프로세스가 잘 작동 하는 것입니다.
GUI에선 컨테이너 항목에 우리가 작동 시킨 부분이 보이면 잘 작동 하고 있는 것입니다.
네. 첫 도커 컨테이너 실행에 성공 했네요. 처음 해보신 것이라면 좀 복잡하게 느껴 질 수 있지만, 도커 사용은 이 처음 시작 방식이 거의 모든 것이라고 생각 하시면 됩니다. 여기서 조금씩 응용이 되면서 사용 하게 되기 때문에 계속 사용해 보시면 아주 쉽게 응용하여 사용 하실 수 있을 겁니다.
자 오늘은 여기 까지 구요. 오늘 내용이 생각보다 좀 길어 졌네요. 당분간 Docker를 개발에 사용 하기위한 기본적인 내용 까지는 계속 Docker 내용을 주기적으로 업로드 할 예정입니다.
아마도 다음에는 Docker의 공개 된 이미지들을 가져와서 사용 하는 기본적인 방법과 Dockerfile 에 대해서 좀더 자세히 살펴 보는 쪽으로 생각 하고 있습니다.
자 그럼 즐거운 하루 되시구요! 채널에 관심이 생기신다면, 구독 해 주시고 자주 찾아와 주세요!
'야매 개발실 > Docker' 카테고리의 다른 글
Docker mulit container와 docker compose (0) | 2023.11.13 |
---|---|
Docker 데이터 유지를 위한 volume 사용법 [Part5,6] (0) | 2023.11.08 |
Docker 앱 업데이트와 이미지 공유 Part 3 ~ 4 (0) | 2023.10.31 |
Docker 설치 (0) | 2023.10.23 |
Docker 소개 (0) | 2023.10.16 |