도커란 무엇입니까?
https://nosleepjavascript.com/docker-essentials-for-front-end-developers/
Docker는 응용 프로그램 개발, 배포 및 실행을 위한 개방형 플랫폼입니다.
Docker를 사용하면 모든 시스템 종속성과 함께 응용 프로그램을 단일 실행 파일로 캡슐화 하여 서버 또는 클러스터에 예측 가능하게 제공 할 수 있습니다. 또는 다른 운영 체제를 사용하는 다른 개발자를 위한 개발 환경으로 사용됩니다.
Virtual Machines (Virtual Box) 또는 Vagrant에 익숙한 경우 Docker에 익숙해야 합니다.
Docker를 사용하면 헤드리스 가상 머신과 매우 유사한 것을 쉽게 생성 할 수 있습니다. 간단한 구성 파일 (예 : Dockerfile)로 시스템 종속성을 설치하고, 네트워크 및 포트를 구성하고, 데이터베이스를 설정하고, 코드를 가져오고, 앱을 시작할 수 있습니다.
오늘날 IaaS 및 PaaS 제공 업체는 Docker 컨테이너에 대한 일류 지원을 제공하는 것이 일반적입니다. 이러한 제공 업체의 예로는 Google Cloud Compute Engine, Microsoft Azure 및 Amazon AWS가 있습니다. Kubernetes를 사용하여 이러한 제공자에서 수십 개의 Docker 컨테이너로 구성된 클러스터를 관리하고 여유가 있는 한 쉽게 확장 할 수 있습니다.
간단한 Nodejs / 프론트 엔드 응용 프로그램을 사용하면 무엇이 필요합니까?
시스템 의존성 :
시스템 구성 :
빌드 / 실행 단계 :
우리는 나중에 이것의 예를 다룰 것입니다.
Docker를 사용하면 하나의 제공 가능한 응용 프로그램을 구성하는 데 필요한 모든 단계를 표현할 수 있습니다.
필요한 단계를 표시하는 방법은 Dockerfile이며 Dockerfile을 빌드 한 결과는 인스턴스화 및 실행할 수 있는 이미지이며 이 실행 파일을 컨테이너라고 합니다.
이미지란 무엇입니까?
이미지는 Docker 컨테이너를 만드는 지침이 포함 된 읽기 전용 템플릿입니다.
Dockerfile을 사용하여 이미지를 정의하십시오.
Dockerfile은 앱을 실행하는 데 필요한 순서가 지정된 단계 목록입니다. 각 줄은 성능상의 이유로 Docker가 캐시 하는 중간 이미지를 생성하므로 단계 순서가 중요합니다.
NodeJs 앱의 경우 다소 작지만 일반적인 Dockerfile입니다.
# This is our base community provided image,
# with some minimal distribution of linux
# that comes with NodeJs v10 (and npm) already installed
FROM node:12
# Use this directory _inside_ your Docker container
# as the base directory of all the next actions
WORKDIR /usr/src/app
# Copy your app's code from the host (your computer) to the container.
# This assumes a typical setup in which the Dockerfile
# is in the root of your project
COPY package.json ./
# Install dependencies
RUN npm install
# Copy the rest of your App's source files
COPY . .
# Tell Docker that your app will be working in the port 8080
# so we should open it up to the outside
EXPOSE 8080
# Run your app.
# CMD signals Docker that this is the thing that we want to run,
# if this executable fails then the whole container will exit.
CMD [ "node", "server.js" ]
앱 코드를 복사하기 전에 종속성을 설치하는 방법에 주목하십시오. 이것은 Docker가 이미 캐시 된 중간 이미지를 그 시점까지 사용할 수 있도록 종속성이 앱 코드보다 덜 자주 변경된다고 가정합니다.
이미지 작성은 명령 목록을 처리하고 최종 이미지를 렌더링하여 실행 중인 컨테이너로 인스턴스화 할 수 있도록 하는 것을 의미합니다.
중요 : 이미지는 단지 지침 일 뿐이며 이미지를 실행할 때 이미지를 컨테이너로 바꿉니다.
컨테이너란?
컨테이너는 실행 가능한 이미지 인스턴스입니다.
최종 이미지를 빌드 한 후 이를 실행 파일로 인스턴스화 할 수 있으며 이 실행 파일을 컨테이너라고 하며 호스트 OS에서 다른 프로세스로 처리합니다.
Docker를 사용하면 전체 운영 체제 (OS), 종속성, 구성, 시작 명령 등을 호스트 운영 체제에서 실행 가능한 단일 프로세스로 캡슐화 했음을 의미합니다. 좋아요?
이미지 대 컨테이너 : 유추
이미지를 전통적인 객체 지향 프로그래밍 (OOP) 클래스로, 컨테이너를 인스턴스로 생각할 수 있습니다. 약간 다른 매개 변수 (주로 환경 변수)를 사용하여 이미지의 여러 실행 인스턴스 (일반적으로 클러스터 내에서 앱의 크기를 조정하는 방법)를 가질 수 있습니다.
이미지는 다른 이미지에서 상속되어 유용하고 의미 있는 방식으로 이미지를 구성 할 수 있습니다.
도커 리포지토리 (Docker Hub)
Docker Hub 리포지토리를 사용하면 컨테이너 이미지를 팀, 고객 또는 Docker 커뮤니티와 크게 공유 할 수 있습니다.
Docker Hub는 NodeJs 패키지를 배포하기 위한 NPM, Rust 상자 (코드 조각)를 배포하기 위한 Cargo, Java Jar (코드 조각)를 배포하기 위한 Maven 등과 같은 것들에 대한 아날로그 솔루션입니다.
Docker 허브에는 기본 Docker 허브 레지스트리 또는 회사 자체를 사용할 수있는 NPM과 유사한 레지스트리 개념이 있습니다. 기본 Docker 허브 레지스트리는 NodeJ, Nginx, Java 등과 같은 대부분의 기본 이미지가 있는 위치입니다.
앞에서 설명한 Dockerfile에서 첫 번째 줄은 FROM node : 12이며 Docker에게 Docker 허브 레지스트리에 저장된 기본 이미지 node : 12 (NodeJs 버전 12)를 사용하도록 지시합니다. 기본적으로 Docker의 레지스트리를 사용합니다.
이 이미지를 처음 만들려고 하면 Docker가 기본 이미지를 다운로드하여 캐시에 저장합니다.
다음 섹션에서 기본 명령을 다룹니다.
필수 명령
이것은 시스템에 도커가 설치되어 있다고 가정합니다 (Linux 또는 Macos)
Building
현재 디렉토리의 Dockerfile에서 docker 이미지를 빌드하십시오. 모든 것이 잘되면 Docker가 이미지 ID를 출력합니다. 나중에 이미지를 인스턴스화 하는 데 사용됩니다.
docker build .
# equivalent to
docker build ./Dockerfile
태그를 사용하여 빌드 된 이미지를 쉽게 참조 할 수 있으므로 이미지 ID를 사용할 필요가 없습니다.
docker build -t mySuperApp .
도커가 이미지를 다시 작성하도록 합니다. 일반적으로 Dockerfile에서 무언가를 변경하거나 기본 이미지가 변경된 경우에 사용됩니다.
docker build --no-cache .
시스템에 내장 된 이미지 확인
docker image ls
모든 빌드 명령은 컨테이너로 인스턴스화 할 때 사용할 수 있는 docker Image id를 출력하지만 태그를 사용하는 것이 훨씬 인간 친화적입니다.
Docker hub
태그를 식별자로 사용하여 가장 최근에 구축 한 이미지를 도커 허브로 푸시합니다. 태그는 버전 등을 추적하기 위해 복잡한 형식을 가질 수 있습니다. 일반적인 패턴은 다음과 같습니다.
docker push $TAG
Running
이미지 ID 또는 태그로 이미지를 인스턴스화
docker run $IMAGE_ID
docker run $TAG
Debugging
이 명령은 컨테이너, 이미지 또는 응용 프로그램을 디버깅 하는 데 매우 유용합니다.
이미지를 컨테이너로 인스턴스화하고 Dockerfile에서 CMD를 대체하여 대화식 쉘을 재생할 수 있습니다. 앱이 시작되지 않을 때 특히 유용합니다. 컨테이너로 ssh하고 수동으로 앱을 시작하거나 디버깅을 수행 할 수 있습니다.
docker run -ti $IMAGEID_OR_TAG bash
호스트 (컴퓨터) 앱 디렉토리 및 파일을 사용하는 컨테이너를 실행하십시오. 이를 통해 IDE 또는 텍스트 편집기와 같은 일반 개발 도구를 사용하여 컨테이너 파일을 제자리에서 편집 할 수 있습니다. 컨테이너 내에서 실행되는 앱을 디버깅 할 때 특히 유용합니다. $ PWD는 프로세스 작업 디렉토리이거나 현재 쉘 인스턴스에 있는 디렉토리입니다. 이 경우에는 앱의 루트 디렉토리라고 가정합니다. 컨테이너 WORKDIR은 Dockerfile에서 설정 한 것이어야 합니다.
docker run -ti -v $PWD:your-container-workdir $IMAGEID_OR_TAG bash
이미 실행 중인 컨테이너에 SSH. 부분적으로 실행되는 컨테이너 또는 앱을 디버깅 하거나 컨테이너 또는 앱의 세부 정보를 조정하는 데 유용합니다. 나는 이전의 것들을 더 유용하게 사용하기 때문에 대부분을 사용합니다.
docker exec -ti $CONTAINER_ID /bin/bash
Managing
현재 실행 중인 컨테이너는 무엇입니까?
docker ps
실행 중인 컨테이너를 종료하십시오 (위 출력에서 $ CONTAINER_ID를 얻으십시오).
docker kill $CONTAINER_ID
컨테이너의 로그를 확인하십시오.
docker logs $CONTAINER_ID
컨테이너를 검사하십시오 (주어진 컨테이너에 대한 볼륨, 네트워크, 포트 등에 관한 디버그 정보). 이 경우 컨테이너의 IP 주소를 얻습니다.
docker inspect \
--format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
$CONTAINER_ID
더 완벽한 적용 범위는 문서를 확인하십시오.
종결
이것이 Docker가 널리 채택되었다는 사실을 고려할 때 모든 프론트 엔드 개발자가 최소한 가지고 있어야 한다고 생각하는 기본 지식입니다. 이 명령은 일상 업무에서 매일 사용하는 명령입니다.
프론트 엔드 개발자는 아니지만 이 기술을 처음 접하더라도 기본 학습을 통해 가치를 얻을 수 있다고 생각합니다.
Docker에 대해 배울 점이 많으며 Docker 및 상위 전문 분야인 DevOps를 전공으로 경력을 쌓을 수 있습니다.
등록된 댓글이 없습니다.