이는 단계별로 작업하면서 Docker의 작동 방식을 기본적으로 이해하기 위한 간단한 데모입니다. 저는 이렇게 docker를 배우고, 제가 학습하면서 겪은 몇 가지 문제를 해결하여 다른 초보자들에게 도움이 될 수 있도록 이 repo를 만들었습니다. 즐겁게 학습하시길 바랍니다. 마음에 들면 GitHub에 게시하고 내 작업을 지원하세요.
중요:- Readme의 크기를 보면 생각이 바뀔 수도 있지만 솔직히 처음부터 작업하면 아무런 문제도 발생하지 않고 계속해서 배울 수 있습니다.
Wikipedia는 Docker를 다음과 같이 정의합니다.
OS 수준 가상화를 사용하여 컨테이너라는 패키지로 소프트웨어를 제공하는 PaaS(Platform as a Service) 제품 세트입니다. 컨테이너는 서로 격리되어 있으며 소프트웨어, 라이브러리 및 구성 파일을 번들로 묶습니다. 그들은 잘 정의된 채널을 통해 서로 통신할 수 있습니다. 모든 컨테이너는 단일 운영 체제 커널에 의해 실행되므로 가상 머신보다 적은 리소스를 사용합니다.
Docker는 호스트 운영 체제(예: Mac)에서 실행되는 샌드박스(컨테이너라고 함)에서 애플리케이션을 보다 효율적으로 배포하는 데 도움이 됩니다. docker의 가장 큰 장점은 모든 종속성을 포함하는 소프트웨어를 하나의 표준화된 단위로 패키징할 수 있다는 것입니다.
컨테이너는 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 이동할 때 문제 없이 소프트웨어를 실행하는 방법에 대한 솔루션입니다. 이는 스테이징 환경에서 프로덕션으로, 또는 노트북에서 다른 운영 체제를 사용하는 다른 노트북으로 이루어질 수 있습니다.
컨테이너는 애플리케이션이 실행되는 환경에서 추상화될 수 있는 논리적 패키징 메커니즘을 제공합니다. 가장 큰 차이점은 모든 컨테이너에 완전한 OS가 필요하지 않다는 것입니다. 단일 OS를 공유하는 단일 호스트의 모든 컨테이너입니다. 이는 CPU, RAM과 같은 엄청난 양의 시스템 리소스를 확보하는 데 도움이 됩니다.
Docker 설치가 완료되면 다음을 실행하여 Docker 설치를 테스트하십시오.
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
은 이미지를 만들기 위해 명령줄에서 호출할 수 있는 모든 명령이 포함된 텍스트 문서입니다. hello.js
파일을 만들고 이 코드를 복사하세요. 여기서 우리는 localhost:8888
에 Hello World를 표시하는 간단한 JS 코드를 작성했습니다. var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
이라는 파일을 만들고 이 코드를 복사하세요. FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
이것이 여러분이 처음으로 본 Dockerfile이더라도 여기서 무슨 일이 일어나고 있는지 짐작할 수 있을 것입니다. Dockerfile 명령은 FROM, ENV, LABEL, RUN, ADD, EXPOSE 및 ENTRYPOINT입니다. 대문자로 되어 있지만 이는 필수 사항이 아니라 관례입니다.
상위 수준에서 이 Dockerfile은 노드 이미지로 시작, 관리자로 “[email protected]”
추가, npm install
실행하여 종속성 설치, 애플리케이션 코드에 파일 복사, 앱의 네트워크 포트 문서화와 같은 지침을 제공합니다. 실행할 기본 애플리케이션으로 hello.js를 설정합니다.
이제 로컬 머신에 도커 이미지를 생성하겠습니다. 현재 프로젝트 폴더에서 터미널을 열고 실행하십시오.
docker build -t helloworld .
여기서는 현재 디렉터리의 내용을 기반으로 helloworld
라는 이미지를 빌드하도록 Docker에 지시합니다(빌드 명령 끝에 점(.)이 있음 을 참고하세요). Docker는 디렉터리에서 Dockerfile을 찾고 파일의 지침에 따라 이미지를 빌드합니다.
Docker 이미지를 빌드한 후 다음 단계는 이미지를 실행하고 작동하는지 확인하는 것입니다.
docker run -p 8888:8888 helloworld
방금 실행한 명령은 컨테이너 내부의 서버에 포트 8888을 사용했고 이를 포트 8888에 외부적으로 노출했습니다. 포트 8888이 있는 URL로 이동하세요.
축하해요! 첫 번째 Docker 이미지를 성공적으로 생성했습니다.
Docker 이미지는 가상 머신 템플릿과 유사하며 컨테이너를 시작하는 데 사용됩니다. 내부적으로는 하나 이상의 읽기 전용 레이어로 구성되며, 함께 쌓이면 전체 이미지를 구성합니다. Docker는 이러한 레이어를 쌓아서 단일 통합 객체로 표현합니다. 참고: Docker 이미지는 변경할 수 없습니다. 즉, Docker 이미지가 변경될 수 없습니다. 한번 만든 후에는 삭제할 수 있지만 수정할 수는 없습니다.
Docker 이미지에는 컨테이너의 파일 시스템이 되는 패키지된 모든 파일이 포함되어 있으며 이미지 자체에 대한 많은 메타데이터도 포함되어 있습니다. 여기에는 이미지가 어떻게 구축되었는지에 대한 간략한 기록이 포함됩니다. 이를 사용하여 이미지의 각 레이어와 레이어를 만든 명령을 볼 수 있습니다. 다음을 사용하여 helloworld
이미지의 기록을 확인할 수 있습니다.
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
CREATED BY
명령은 Dockerfile 지침입니다. 일대일 관계가 있으므로 Dockerfile의 각 줄은 이미지 레이어를 생성합니다.
먼저 dockerhub 계정으로 로그인해야 합니다.
docker login --username $dockerId
이제 로그인했으므로 귀하의 계정이나 액세스 권한이 있는 조직에 이미지를 푸시할 수 있습니다. 조직의 구성원이 아닌 경우에는 계정의 저장소에만 이미지를 푸시할 수 있습니다.
우리는 helloworld
라는 Docker 이미지를 구축했습니다. 해당 이미지 참조에는 계정 이름이 없으므로 어떤 레지스트리에도 푸시할 수 없습니다. 새로운 참조를 제공하기 위해 이미지를 다시 빌드할 필요는 없습니다. 이미지에는 여러 참조가 있을 수 있습니다. 다음과 같이 이미지에 태그를 지정하세요.
docker image tag helloworld $dockerId /helloworld:v1
이제 계정 이름에 Docker ID가 포함된 이미지 참조가 생겼고 Docker Hub에 로그인하여 이미지를 공유할 준비가 되었습니다! docker image push 명령은 pull 명령에 대응되며 로컬 이미지 레이어를 레지스트리에 업로드합니다.
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
Docker 이미지 태그에 어떤 문자열이든 넣을 수 있으며, 이미 살펴보았듯이 동일한 이미지에 대해 여러 태그를 가질 수 있습니다. 우리는 이를 사용하여 이미지의 소프트웨어 버전을 지정하고 사용자가 사용하지 않을 항목에 대해 정보를 바탕으로 선택할 수 있도록 하며, 다른 사람의 이미지를 사용할 때 정보를 바탕으로 스스로 선택할 수 있도록 할 것입니다.
많은 소프트웨어 프로젝트에서는 소수점이 포함된 숫자 버전 관리 체계를 사용하여 버전 간에 얼마나 큰 변화가 있었는지 표시하며, 이미지 태그를 사용하여 이를 따를 수 있습니다. 기본 아이디어는 암묵적으로 보장되는 [major].[minor].[patch]와 같은 것입니다. 패치 번호만 증가시키는 릴리스에는 버그 수정이 있을 수 있지만 기능은 마지막 버전과 동일해야 합니다. 부 버전을 증가시키는 릴리스는 기능을 추가할 수 있지만 어떤 것도 제거해서는 안 됩니다. 주요 릴리스는 완전히 다른 기능을 가질 수 있습니다.
대부분의 애플리케이션은 단일 구성 요소에서 실행되지 않습니다. 대규모의 오래된 앱도 일반적으로 물리적으로 분산된 구성 요소에서 실행되는 별도의 논리 계층인 프런트엔드 및 백엔드 구성 요소로 구축됩니다. Docker는 n계층 모놀리스부터 최신 마이크로서비스까지 분산 애플리케이션을 실행하는 데 이상적으로 적합합니다. 각 구성 요소는 경량 컨테이너에서 실행되며 Docker는 표준 네트워크 프로토콜을 사용하여 구성 요소를 서로 연결합니다. Docker Compose를 사용하여 이와 같은 다중 컨테이너 앱을 정의하고 관리합니다. Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose에서는 YAML
파일을 사용하여 애플리케이션 서비스를 구성합니다. 그런 다음 단일 명령을 사용하여 구성에서 모든 서비스를 생성하고 시작합니다.
Docker Compose 파일은 앱의 원하는 상태, 즉 모든 것이 실행될 때 어떤 모습이어야 하는지를 설명합니다. Docker 컨테이너 실행 명령에 넣을 모든 옵션을 Compose 파일에 캡처하는 간단한 파일 형식입니다. 그런 다음 Docker Compose 도구를 사용하여 앱을 실행합니다. 컨테이너, 네트워크 또는 볼륨 등 필요한 Docker 리소스가 무엇인지 파악하고 이를 생성하기 위해 Docker API에 요청을 보냅니다. Compose YAML 파일의 기본 이름은 docker-compose.yml
입니다. 그러나 -f 플래그를 사용하여 사용자 정의 파일 이름을 지정할 수 있습니다.
시작해 봅시다.
아래 코드에는 두 가지 서비스(web-frontend 및 redis)가 있는 작은 Flask 앱을 정의하는 매우 간단한 Docker Compose
파일이 표시됩니다. 이 앱은 방문 횟수를 계산하고 그 값을 Redis에 저장하는 간단한 웹 서버입니다.
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
version
키가 필요하며 항상 파일의 첫 번째 줄에 있어야 합니다. Compose file
형식(기본적으로 API)의 버전에 대해 설명합니다.
최상위 services
키는 다양한 애플리케이션 서비스를 정의하는 곳입니다. 우리가 사용하는 예제에서는 두 가지 서비스를 정의합니다. web-frontend
프런트엔드와 Redis라는 인메모리 데이터베이스가 있습니다. Compose는 이러한 각 서비스를 컨테이너로 배포합니다.
최상위 networks
키는 Docker에게 새 네트워크를 생성하도록 지시합니다. 기본적으로 Compose는 브리지 네트워크를 생성합니다. 이는 동일한 호스트의 컨테이너만 연결할 수 있는 단일 호스트 네트워크입니다.
웹 프런트엔드 서비스 정의 내에서 Docker에 다음 지침을 제공합니다.
이전 섹션의 Compose 파일에 정의된 앱을 배포하겠습니다. 이렇게 하려면 https://github.com/championshuttler/counter-app에서 다음 4개의 파일이 필요합니다.
Git 저장소를 로컬로 복제합니다.
git clone https://github.com/championshuttler/counter-app.git
각 파일을 빠르게 설명하겠습니다.
app.py
애플리케이션 코드(Python Flask 앱)입니다.docker-compose.yml
은 Docker가 앱을 배포하는 방법을 설명하는 Docker Compose 파일입니다.Dockerfile
웹 프런트엔드 서비스용 이미지를 빌드하는 방법을 설명합니다.requirements.txt
앱에 필요한 Python 패키지가 나열되어 있습니다. Compose를 사용하여 앱을 불러오겠습니다. counter-app
디렉터리 내에서 다음 명령을 모두 실행해야 합니다.
docker-compose up &
앱이 표시되는 데 몇 초 정도 걸리며 출력이 상당히 장황할 수 있습니다.
애플리케이션이 성공적으로 배포되면 port 5000
의 Docker 호스트에서 웹 브라우저를 가리키고 애플리케이션의 모든 모습을 볼 수 있습니다.
튜토리얼이 완전히 엉망이라고 생각하시나요? 아니면 재미있게 뭔가를 배웠나요? 여러분의 생각을 나에게 직접 보내거나 이슈를 만들어 보세요. 트위터에서도 저를 찾아보시고 궁금한 점이 있으면 언제든지 물어보세요.
이 튜토리얼에 대한 귀하의 경험에 대해 듣고 싶습니다. 학습이 즐거웠기를 바랍니다. 마음에 들면 GitHub에 게시하고 내 작업을 지원해 주세요.