.. Cover Letter

공부#Robotics#자율주행/docker

1. docker의 기초 , docker란 무엇인가? docker 사용하기

BrainKimDu 2023. 3. 24. 23:53

우선 docker가 무엇인지 chatgpt에게 꼬리에 꼬리를 무는 형식으로 질문을 해보자.

docker가 정확히 뭐고 왜쓰는건가요?

도커(Docker)는 컨테이너 가상화 기술을 이용하여 소프트웨어를 배포하고 실행하는 플랫폼입니다. 컨테이너는 소프트웨어를 실행하는 환경을 격리된 공간에서 제공하므로, 하나의 호스트 시스템에서 여러 개의 컨테이너를 실행하더라도 각 컨테이너는 서로 영향을 주지 않고 독립적으로 실행될 수 있습니다.

도커를 사용하는 이유는 여러 가지가 있습니다. 가장 큰 장점은 개발, 테스트, 운영 등 각 단계에서의 환경을 일관성 있게 유지할 수 있다는 것입니다. 도커 이미지를 만들어서 배포하면, 이 이미지를 이용하여 동일한 환경에서 소프트웨어를 실행할 수 있으므로, 호스트 시스템의 환경이나 설정에 따른 문제를 방지할 수 있습니다. 또한, 컨테이너화된 소프트웨어는 이식성이 높아서 서로 다른 운영체제나 클라우드 환경에서도 실행될 수 있습니다.

또한, 도커를 이용하면 소프트웨어를 더 쉽게 배포하고 관리할 수 있습니다. 도커 이미지는 코드와 실행환경을 포함하고 있어서, 이미지를 만들어서 배포하면 소프트웨어의 배포와 관리가 매우 쉬워집니다. 또한, 컨테이너를 이용하면 필요한 자원만 할당하여 더 효율적으로 자원을 관리할 수 있으며, 여러 대의 호스트 시스템에서 컨테이너를 실행하면 더욱 높은 가용성을 보장할 수 있습니다.

따라서, 도커는 소프트웨어를 개발하고 배포하는 데 있어서 매우 유용한 도구입니다. 도커를 사용하면 소프트웨어를 빠르고 쉽게 배포하고 관리할 수 있으며, 일관성 있고 이식성이 높은 환경을 제공할 수 있습니다.

 

docker는 그러면 특정 소프트웨어를 손쉽게 설치하기 위한 목적으로 사용하나요?

도커를 사용하면 소프트웨어 설치에 필요한 의존성(dependency)과 같은 환경 설정을 독립적인 컨테이너 이미지로 만들어서 배포할 수 있습니다. 이러한 이미지를 이용하여 다른 환경에서 동일한 소프트웨어를 실행하면, 소프트웨어 설치와 환경 설정에 필요한 복잡한 작업을 반복하지 않아도 됩니다. 따라서, 도커를 이용하면 개발자나 시스템 관리자들이 공통된 환경 설정을 손쉽게 공유하고 배포할 수 있으며, 이를 통해 소프트웨어 개발 및 운영 프로세스의 일관성과 효율성을 높일 수 있습니다.

하지만, 도커는 소프트웨어를 설치하는 목적 자체가 아니라, 소프트웨어를 컨테이너화하여 배포하고 실행하는 플랫폼입니다. 따라서, 도커를 사용하면 소프트웨어를 설치하는 과정에서 발생하는 의존성 해결과 같은 작업을 도커 이미지를 만드는 과정에서 해결할 수 있습니다. 이렇게 만들어진 도커 이미지를 다른 환경에서 실행하면, 필요한 모든 의존성이 이미 포함되어 있으므로, 소프트웨어 설치 및 환경 설정에 대한 복잡한 작업을 반복하지 않아도 됩니다.

 

여기서 컨테이너화라는 용어가 계속 등장하는데, 이 컨테이너라는 용어의 정의를 알려주세요?

컨테이너(container)는 소프트웨어를 실행하는 데 필요한 모든 것(코드, 라이브러리, 실행환경 등)을 포함하는 기술적으로 격리된 실행환경입니다. 즉, 소프트웨어와 그 실행환경을 하나로 묶은 것이라고 할 수 있습니다.

컨테이너 기술은 가상화 기술 중 하나이며, 가상화된 운영체제를 사용하는 가상머신과는 달리, 호스트 운영체제에서 직접 실행되며, 더 가볍고 빠르게 실행될 수 있습니다. 또한, 컨테이너는 격리된 실행환경을 제공하기 때문에, 다른 컨테이너와는 독립적으로 실행되며, 서로 영향을 주거나 받지 않습니다. 이러한 특징들로 인해, 컨테이너 기술은 소프트웨어 개발과 배포에 매우 유용하게 사용됩니다.

도커(Docker)는 가장 대표적인 컨테이너 기술을 제공하는 플랫폼 중 하나이며, 도커를 이용하면 컨테이너를 쉽게 생성하고 배포할 수 있습니다.

 

ubuntu 22.04에서 ubuntu 20.04에서만 사용되는 프로그램을 돌리기 위해 docker를 쓴다는 표현을 많이 합니다. 이를 docker를 처음 접하는 관점에서 설명해주실 수 았나요?

Ubuntu 22.04과 Ubuntu 20.04는 서로 다른 운영체제 버전입니다. 따라서, Ubuntu 20.04에서는 정상적으로 동작하는 프로그램이 Ubuntu 22.04에서는 동작하지 않을 수 있습니다. 이 경우, Ubuntu 22.04에서 Ubuntu 20.04에서 사용되는 프로그램을 실행하려면, Ubuntu 20.04를 설치하거나 Ubuntu 20.04에 해당 프로그램을 설치하고 실행해야 합니다.

하지만, Docker를 이용하면 Ubuntu 20.04에서 동작하는 프로그램을 Ubuntu 22.04에서 실행할 수 있습니다. 이를 위해서는, Ubuntu 20.04 환경을 Docker 이미지로 만들어서 Ubuntu 22.04에서 실행하면 됩니다. 이렇게 만들어진 Docker 이미지를 이용하여, Ubuntu 20.04 환경에서 실행되는 프로그램을 Ubuntu 22.04에서 실행할 수 있습니다.

이러한 방법으로 Docker를 사용하면, 다른 운영체제 버전에서 동작하는 프로그램을 실행할 때도 유용합니다. 또한, Docker를 이용하여 소프트웨어를 개발하고 배포할 때, 운영체제나 환경 설정 등에 대한 호환성 문제를 최소화할 수 있습니다.

 

Docker 이미지란 무엇이라고 이해하면될까요?

Docker 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있는 패키지입니다. 즉, 소프트웨어와 그 실행환경을 포함하는 컨테이너를 생성하기 위한 원본이라고 할 수 있습니다.

Docker 이미지는 여러 개의 레이어(layer)로 구성되어 있습니다. 각 레이어는 파일 시스템의 변경 사항이나 설정 정보 등을 담고 있으며, 각 레이어는 이전 레이어를 기반으로 만들어집니다. 이렇게 구성된 레이어들은 독립적으로 관리되며, 이미지를 구성하는 모든 레이어들은 함께 하나의 Docker 이미지를 이룹니다.

Docker 이미지를 생성하기 위해서는, Dockerfile이라는 텍스트 파일에 이미지를 생성하는 데 필요한 모든 정보(소프트웨어, 라이브러리, 설정 등)를 기술해야 합니다. Dockerfile을 이용하여 Docker 이미지를 생성하면, 해당 이미지를 이용하여 컨테이너를 생성하고 실행할 수 있습니다.

Docker 이미지는 Docker Hub과 같은 Docker 레지스트리에 저장될 수 있으며, 필요할 때마다 다운로드하여 컨테이너를 생성하고 실행할 수 있습니다. 또한, Docker 이미지는 다른 환경에서도 동일하게 실행될 수 있으므로, 소프트웨어 개발과 배포에서 매우 유용하게 사용됩니다.

 

 

 


그러니까 간단하게 요약하면, 소프트웨어를 실행하기 위해서 필요한 특정 환경이 있는데 이를 docker 이미지로 만들어서 공유하면 다같이 같은 환경에서 구현을 할 수 있게 해주는 아이로 이해가됩니다.

 

도큐먼트 (주의 내맘대로 번역함)
docker란 무엇인가?

도큐먼트를 따라하면 할 수 있는 것은
1. 컨테이너 이미지를 만들고 실행하기
2. Docker Hub을 통해 이미지를 공유하기
3. 데이터베이스와 함께 여러 컨테이너를 사용해 응용프로그램 배포하기
4. Docker Compose를 통해서 어플리케이션 실행하기

이를 따라하기 전에 우선 container와 image가 먼지 알아봅시다.

container란 무엇인가요?
컨테이너는 내 컴퓨터의 다른 프로세스와 분리(격리)되어있는 내 컴퓨터의 센드박스화된 프로세스이다. 리눅스에서 오랜기간 사용되어진 kernel namespaces 와 cgroups을 활용하여 분리를 한다. Docker는 이러한 기능을 접근가능하고 사용하기 쉽게 만들기 위해 노력해왔습니다. 그래서 docker에 대해 요약을 해보자면
- dokcer는 이미지의 실행가능한 instance로 DockerAPI와 CLI를 사용해 컨테이너를 생성, 시작, 중지, 이동, 삭제를 할 수 있습니다.
- local이나 virtual 환경(머신)에서 실행하거나 cloud에 배포(deploy)할 수 있습니다.
- portable 어떤 OS건 실행할 수 있습니다.
- 다른 컨테이나와의 분리되어 자체 소프트웨어, 이진 및 구성을 실행합니다.

container image란 무엇인가요?
컨테이너를 실행할 때, 이미지는 독립된 filesystem을 사용합니다. 이런 custom filesystem은 컨테이너 이미지를 제공합니다. 이미지가 container의 filesystem을 포함함으로, 이러한 이미지는 어플리케이션을 돌리기 위한 모든 필요한 것(dependencies, configurations, scripts, binaries, etc.)포함해야합니다. 이미지는 또한 환경변수(environment variables)와 실행할 기본 명령 및 기타 메터 데이터와 같은 컨테이너에 대한 다른 구성도 포함되어 있습니다.

 

application을 컨테이너화 하기

우선 이를 위해서는 3개의 파일이 필요합니다. 
1. docker

https://kimbrain.tistory.com/entry/%EC%8B%A4%EB%AC%B4%EB%A6%AC%EB%88%85%EC%8A%A4-14-%EC%9A%B0%EB%B6%84%ED%88%AC%EC%97%90-docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

 

(실무리눅스) 14. 우분투에 docker 설치하기

https://docs.docker.com/desktop/install/ubuntu/ Install Docker Desktop on Ubuntu docs.docker.com 우선 도큐먼트에 나오는 KVM virtualization은 설치할 필요가 없다고 합니다 (ChatGPT가 그렇게 말했지만 틀릴 수도 있습니다.)

kimbrain.tistory.com

2. git client

sudo apt install git


3. VSCode

https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

 

app을 받아옵시다.

git clone https://github.com/docker/getting-started.git

 

그러면 VScode로 진행을 해봅시다.

cd getting-started/
code .

다음의 파일에 집중합니다. getting-started/app안에 들어있는 package.json이라는 파일입니다.

 

app의 container image를 빌드하기

container image를 빌드하기 위해서는 Dokcerfile이라는 것이 필요합니다. Dockerfile은 text형식의 파일입니다.  그러면 package.json이 있는 폴더에 Dockerfile을 만듭니다. 

이 상태에서 진행합니다.

touch Dockerfile

만드는 경우 VScode에 다음을 설치하겠는지 물어보는데, 설치합니다. 그리고 Dockerfile에 다음을 입력합니다.

# syntax=docker/dockerfile:1
   
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

이에 대한 설명은 뒤에서 다시 설명하겠습니다.

 

이제 빌드를 해봅시다. 현재의 디렉토리에서 다음의 명령어를 입력합니다.

docker build -t getting-started .

혹시 안되면 코드를 넣고 dockerfile을 저장하세요. 빌드가 진행되면, dockerfile이 새로운 container image로 빌드가 됩니다. dockerfile로 기반 이미지인 node:18-alpine을 사용해야했는데, 이게 로컬 컴퓨터에 다운로드가 되어 있지 않아서 Docker가 해당 이미지를 다운로드 하면서 여러 개의 작은 레이어들을 다운로드 하고, 이제 새로운 이미지를 getting-started라는 이름으로 빌드하게 됩니다. 

여기서 레이어란 Docker에서 레이어는 이미지를 구성하는 단위입니다. 각각의 레이어는 Dockerfile의 각 명령어(예: COPY, RUN)를 실행할 때 생성되며, 파일 시스템의 변경 사항을 적용합니다. 따라서 Docker 이미지는 여러 개의 레이어로 구성되어 있으며, 새로운 이미지를 빌드할 때 이전 이미지의 레이어를 재사용하여 빌드 시간을 단축시킵니다.

이미지에 대한 변경 사항이 생길 때마다 새로운 레이어가 추가되며, 각 레이어는 이전 레이어에 대한 변경 사항을 적용한 결과물입니다. 레이어는 유니온 파일 시스템(UnionFS)으로 구현되어 있으므로, 이미지의 각 레이어는 다른 레이어의 변경 사항을 덮어쓰지 않고 그대로 유지합니다. 이렇게 구성된 레이어 시스템은 이미지를 효율적으로 저장하고 전송할 수 있도록 합니다.

이제 코드를 한 번 확인해봅시다. 쳇지피티가 알려줄겁니다.

# syntax=docker/dockerfile:1
   
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
  1. # syntax=docker/dockerfile:1 : 이 줄은 Dockerfile 문법의 버전을 지정하는 것입니다. docker/dockerfile에서 1.0 버전을 사용한다는 것을 의미합니다.
  2. FROM node:18-alpine : node:18-alpine 이미지를 사용하여 새로운 이미지를 빌드할 것이라는 것을 나타냅니다. FROM은 Dockerfile에서 첫 번째 명령어여야하며, 이 명령은 새로운 이미지를 생성하는 데 사용됩니다.
  3. WORKDIR /app : /app 디렉토리를 작업 디렉토리로 설정합니다. WORKDIR은 다음 명령어에 대한 기본 경로가 됩니다.
  4. COPY . . : 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리에 복사합니다. 첫 번째 .은 호스트 머신에서 복사할 파일이 있는 디렉토리를 나타내고, 두 번째 .는 컨테이너의 작업 디렉토리를 나타냅니다.
  5. RUN yarn install --production : yarn install --production 명령어를 실행하여 필요한 패키지를 설치합니다. RUN 명령어는 새로운 레이어를 생성하고 그 안에서 명령어를 실행합니다.
  6. CMD ["node", "src/index.js"] : 컨테이너가 시작되면 node src/index.js 명령어를 실행합니다. CMD는 Docker 컨테이너가 시작될 때 실행될 명령어를 지정합니다.
  7. EXPOSE 3000 : 컨테이너가 3000번 포트에서 수신 대기하도록 설정합니다. EXPOSE는 컨테이너가 사용할 포트를 지정하는 명령어입니다.

아직은 무슨 소리인지 모르겠습니다.  더 공부하면 알게되지 않을까 싶습니다.

docker build -t getting-started .

그리고 이도 한 번 물어봅시다.

여기서 docker build 명령어는 Dockerfile에서 정의한 대로 이미지를 빌드하고, -t 옵션은 빌드한 이미지에 대한 태그를 지정합니다. getting-started는 태그의 이름이고, .은 Dockerfile이 있는 현재 디렉토리를 의미합니다.

즉, 위 명령어는 현재 디렉토리에 있는 Dockerfile을 사용하여 getting-started라는 이름의 이미지를 빌드하는 것을 의미합니다.

 

app container를 시작합니시다

이제 image 파일을 가지게 되었으니 우리는 application의 container 를 실행할 수 있습니다. 그 커멘드는 docker run입니다.

docker run -dp 3000:3000 getting-started

 

docker run -dp 3000:3000 getting-started 명령어는 getting-started 이미지를 기반으로 새로운 컨테이너를 생성하면서, 호스트의 3000번 포트와 컨테이너의 3000번 포트를 연결하고, 컨테이너를 백그라운드에서 실행시킵니다.

자세히 설명하면:

  • docker run: Docker 컨테이너를 생성하고 실행시키는 명령어입니다.
  • -d: 컨테이너를 백그라운드(background) 모드로 실행합니다.
  • -p 3000:3000: 호스트의 3000번 포트와 컨테이너의 3000번 포트를 연결합니다. 이렇게 연결하면 호스트에서 localhost:3000으로 접근하면 컨테이너의 애플리케이션에 접근할 수 있습니다.
  • getting-started: 실행할 이미지의 이름입니다. docker build 명령어를 사용하여 생성한 이미지 이름을 사용합니다.

 

이를 이제 터미널에 입력해봅시다.

이 결과는 컨테이너의 이름입니다.

그러면 다음 사이트를 접속합니다.

http://localhost:3000/

이를 주소창에 입력하면 다음의 사이트가 등장합니다. 이게 docker 를 통해서 local에 생성한 것이라고 합니다. 

뭔가 머리가 복잡해지는데, 이를 도커가 만들어주었다는 이야기로 보입니다.=

추가를 할 수 있다고 하는데, 중요한건 이게 아니니까

그래서 컨테이너는 시작이미지와 포트 3000을 사용하는 컨테이너가 하나 이상 실행되고 있다는 것을 알 수 있습니다. 컨테이너를 보려면 Docker Desktop의그래픽 인터페이스를 사용할 수 있습니다.

신기하네요 밑에 3000:3000으로 생긴것을 볼 수 있습니다.

그게 아니라면 터미널에서 다음의 명령어로 볼 수 있습니다.

docker ps

 

 

 

 

app을 수정하면서 image를 새로 만들어봅시다

https://docs.docker.com/get-started/03_updating_app/

 

Update the application

 

docs.docker.com

이전시간에 컨테이너 이미지를 만들었습니다 이번에는 이를 어떻게 멈추고 제거하는지 알아봅시다.

코드를 하나 수정합시다. 이전에 받았던 파일의 src/static/js/app.js 로 들어가서 56번째 라인을 주시합니다.

이게 뭔파일인지 JS 자바스크립트파일이라고 하는데, 이건 어찌 쓰는 물건인고 하니 프론트 백 뭐시기 할때 쓰는 그 언어와 파일인거로 보임.

여튼 56째줄의 텍스트를 삭제하고 다음을 입력합니다.

이제 빌드하고 실행을 해봅시다.

docker build -t getting-started .
docker run -dp 3000:3000 getting-started

 

그러면 다음과 같은 오류를 뱉는다. 이는 이전에 실행한 컨테이너가 아직 살아 있기 때문이다. 그 오랜된 컨테이너가 port 3000을 사용하고 있기 때문이다. 그래서 이전의 컨테이너는 제거를 해주어야한다.

터미널상에서 다음을 입력한다.

docker ps

여기서 아이디를 찾고 다음을 통해 정지한 후 삭제하면된다.

docker stop <the-container-id>
docker rm <the-container-id>

모두 삭제가 된 모습

 

이제 다시 빌드하면 업데이트가 된다.

docker run -dp 3000:3000 getting-started

 http://localhost:3000

다시 접속하면 이제 변경되어 있을 것이다.

 

다음 단계로 넘어가도록 하자 다음 단계는

share the application

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

여기서 이런 컨테이너나 이미지 파일을 공유할 수 있다는 느낌으로 보입니다.

 

우선 이 이상은 네트워크 백엔드 분야로 보이니 이쯤하고, 다음은 pinkwink님의 강의자료를 참고하여 작성하겠습니다.

 


참고자료 및 참고 도서
pinkLab의 pinkwink 강사님 강의자료 (https://pinkwink.kr/)
Docker Documentaion https://docs.docker.com/get-started/ 

 

Overview

 

docs.docker.com