분류 기타

Docker 핸드북 - 2021년판

컨텐츠 정보

  • 조회 277 (작성일 )

본문

컨테이너화 자체의 개념은 꽤 오래되었습니다. 그러나 2013 년에 Docker Engine이 등장하면서 애플리케이션 컨테이너화가 훨씬 쉬워졌습니다.


Stack Overflow Developer Survey-2020에 따르면 Docker는 가장 많이 사용되는 플랫폼 1위, 가장 사랑 받는 플랫폼 2위, 가장 인기 있는 플랫폼 3위입니다.


수요가 많더라도 처음에는 시작하는 것이 약간 겁이 날 수 있습니다.


따라서 이 책에서는 기본부터 중급 수준의 컨테이너화에 이르기까지 모든 것을 배우게 될 것입니다. 전체 책을 읽은 후에는 다음을 수행 할 수 있습니다.


  • 거의 모든 애플리케이션 컨테이너화
  • 온라인 레지스트리에 사용자 지정 Docker 이미지 업로드
  • Docker Compose를 사용하여 여러 컨테이너 작업


전제 조건 


  • Linux 터미널에 대한 지식
  • JavaScript에 대한 지식 (일부 이후 프로젝트에서는 JavaScript 사용)

목차 

  • 컨테이너화 및 Docker 소개
  • Docker를 설치하는 방법
    macOS에 Docker를 설치하는 방법
    Windows에 Docker를 설치하는 방법
    Linux에 Docker를 설치하는 방법
  • Docker의 Hello World-Docker 기본 소개
    컨테이너란?
    Docker 이미지란 무엇입니까?
    Docker 레지스트리란 무엇입니까?
    Docker 아키텍처 개요
    전체 그림
  • Docker 컨테이너 조작 기본 사항
    컨테이너를 실행하는 방법
    포트를 게시하는 방법
    분리 모드 사용 방법
    컨테이너를 나열하는 방법
    컨테이너 이름을 지정하거나 이름을 바꾸는 방법
    실행 중인 컨테이너를 중지하거나 종료하는 방법
    컨테이너를 다시 시작하는 방법
    실행하지 않고 컨테이너를 만드는 방법
    매달려있는 컨테이너를 제거하는 방법
    대화 형 모드에서 컨테이너를 실행하는 방법
    컨테이너 내부에서 명령을 실행하는 방법
    실행 가능 이미지로 작업하는 방법
  • Docker 이미지 조작 기본 사항
    Docker 이미지를 만드는 방법
    Docker 이미지에 태그를 지정하는 방법
    Docker 이미지를 나열하고 제거하는 방법
    Docker 이미지의 여러 계층을 이해하는 방법
    소스에서 NGINX를 빌드하는 방법
    Docker 이미지를 최적화하는 방법
    Alpine Linux 수용
    실행 가능한 Docker 이미지를 만드는 방법
    Docker 이미지를 온라인으로 공유하는 방법
  • JavaScript 애플리케이션을 컨테이너화 하는 방법
    개발 Dockerfile을 작성하는 방법
    Docker에서 바인드 마운트로 작업하는 방법
    Docker에서 익명 볼륨으로 작업하는 방법
    Docker에서 다중 단계 빌드를 수행하는 방법
    불필요한 파일을 무시하는 방법
  • Docker의 네트워크 조작 기본 사항
    Docker 네트워크 기본 사항
    Docker에서 사용자 정의 브리지를 만드는 방법
    Docker에서 네트워크에 컨테이너를 연결하는 방법
    Docker의 네트워크에서 컨테이너를 분리하는 방법
    Docker에서 네트워크를 제거하는 방법
  • 다중 컨테이너 JavaScript 애플리케이션을 컨테이너화 하는 방법
    데이터베이스 서버를 실행하는 방법
    Docker에서 명명 된 볼륨으로 작업하는 방법
    Docker의 컨테이너에서 로그에 액세스하는 방법
    Docker에서 네트워크를 생성하고 데이터베이스 서버를 연결하는 방법
    Dockerfile을 작성하는 방법
    실행중인 컨테이너에서 명령을 실행하는 방법
    Docker에서 관리 스크립트를 작성하는 방법
  • Docker-Compose를 사용하여 프로젝트를 작성하는 방법
    Docker Compose 기본 사항
    Docker Compose에서 서비스를 시작하는 방법
    Docker Compose에서 서비스를 나열하는 방법
    Docker Compose에서 실행 중인 서비스 내에서 명령을 실행하는 방법
    Docker Compose에서 실행 중인 서비스의 로그에 액세스하는 방법
    Docker Compose에서 서비스를 중지하는 방법
    Docker Compose에서 풀 스택 애플리케이션을 작성하는 방법
  • 결론


Project Code 


예제 프로젝트의 코드는 다음 저장소에서 찾을 수 있습니다.


컨테이너화 된 분기에서 전체 코드를 찾을 수 있습니다.


기여 


이 책은 완전히 오픈 소스이며 양질의 공헌을 환영합니다. 다음 저장소에서 전체 콘텐츠를 찾을 수 있습니다.


나는 일반적으로 책의 GitBook 버전에서 변경 사항과 업데이트를 먼저 수행 한 다음 freeCodeCamp에 게시합니다. 다음 링크에서 책의 항상 업데이트 되고 종종 불완전한 버전을 찾을 수 있습니다.


완벽하고 안정적인 버전의 책을 찾고 있다면 freeCodeCamp가 가장 좋은 곳이 될 것입니다.


어떤 버전의 책을 읽든지 간에 의견을 알려주는 것을 잊지 마십시오. 건설적인 비판은 항상 환영합니다.


컨테이너화 및 Docker 소개 


IBM에 따르면


컨테이너화에는 모든 인프라에서 일관되고 일관되게 실행될 수 있도록 소프트웨어 코드 및 모든 종속성을 캡슐화 하거나 패키징 하는 작업이 포함됩니다. 


즉, 컨테이너화를 사용하면 모든 종속성과 함께 소프트웨어를 자체 포함 된 패키지로 묶어 번거로운 설정 프로세스를 거치지 않고 실행할 수 있습니다.


여기서 실제 시나리오를 고려해 봅시다. 당신이 소유 한 모든 책에 관한 정보를 저장할 수 있고 친구들을 위한 책 대출 시스템의 목적을 제공 할 수 있는 멋진 책 관리 애플리케이션을 개발했다고 가정 해보자.


종속성 목록을 작성하면 해당 목록은 다음과 같습니다.

  • Node.js
  • Express.js
  • SQLite3

글쎄요, 이론적으로는 이것이어야 합니다. 그러나 실제로 다른 것도 있습니다. Node.js는 네이티브 애드온을 빌드 하기 위해 node-gyp이라는 빌드 도구를 사용합니다.

공식 저장소설치 지침에 따르면 이 빌드 도구에는 Python 2 또는 3과 적절한 C / C ++ 컴파일러 도구 체인이 필요합니다.


이 모든 것을 고려하여 최종 종속성 목록은 다음과 같습니다.

  • Node.js
  • Express.js
  • SQLite3
  • Python 2 or 3
  • C/C++ tool-chain

사용하는 플랫폼에 관계없이 Python 2 또는 3을 설치하는 것은 매우 간단합니다. Linux에서는 C / C ++ 도구 체인을 설정하는 것이 매우 쉽지만 Windows와 Mac에서는 고통스러운 작업입니다.


Windows에서 C ++ 빌드 도구 패키지는 기가 바이트 단위로 측정 되며 설치하는 데 상당한 시간이 걸립니다. Mac에서는 거대한 Xcode 응용 프로그램이나 훨씬 작은 Xcode 용 명령 줄 도구 패키지를 설치할 수 있습니다.


설치하는 항목에 관계없이 OS 업데이트에서 여전히 중단 될 수 있습니다. 사실이 문제는 너무나 널리 퍼져 공식 저장소에 macOS Catalina에 대한 설치 노트가 있습니다.


종속성 설정의 모든 번거로움을 겪고 프로젝트 작업을 시작했다고 가정 해 보겠습니다. 이제 당신이 위험에서 벗어났다는 뜻인가요? 당연히 아니지.


Linux를 사용하는 동안 Windows를 사용하는 팀원이 있다면 어떨까요? 이제 이 두 운영 체제가 경로를 처리하는 방법의 불일치를 고려해야 합니다. 또는 nginx와 같은 인기 있는 기술이 Windows에서 실행되도록 최적화되어 있지 않다는 사실도 있습니다. Redis와 같은 일부 기술은 Windows 용으로 사전 구축되지 않았습니다.


전체 개발 단계를 거치더라도 서버 관리 담당자가 잘못된 배포 절차를 따르면 어떻게 됩니까?


이 모든 문제는 어떻게 든 당신이 할 수 있다면 해결할 수 있습니다.


  • 최종 배포 환경과 일치하는 격리 된 환경 (컨테이너라고 함) 내에서 애플리케이션을 개발하고 실행합니다.
  • 애플리케이션을 모든 종속성 및 필요한 배포 구성과 함께 단일 파일 (이미지라고 함)에 넣습니다.
  • 적절한 권한이 있는 모든 사람이 액세스 할 수 있는 중앙 서버 (레지스트리라고 함)를 통해 해당 이미지를 공유합니다.

그러면 팀원은 레지스트리에서 이미지를 다운로드하고, 플랫폼 별 불일치가 없는 격리 된 환경에서 애플리케이션을 실행하거나, 이미지가 모든 적절한 프로덕션 구성과 함께 제공되므로 서버에 직접 배포 할 수 있습니다.


이것이 컨테이너화의 이면에 있는 아이디어입니다. 애플리케이션을 자체 포함 된 패키지에 넣어 다양한 환경에서 이식 가능하고 재현 할 수 있도록 합니다.


이제 질문은 "여기서 Docker는 어떤 역할을 합니까?"입니다. 


이미 설명했듯이 컨테이너화는 상자에 물건을 넣어 소프트웨어 개발의 수많은 문제를 해결하는 아이디어입니다.


바로 이 아이디어에는 몇 가지 구현이 있습니다. Docker는 그러한 구현입니다. 애플리케이션을 컨테이너화 하고, 공용 또는 개인 레지스트리를 사용하여 공유하고, 오케스트레이션 할 수 있는 오픈 소스 컨테이너화 플랫폼입니다.


이제 Docker는 시장에서 유일한 컨테이너화 도구가 아니라 가장 인기 있는 도구입니다. 제가 좋아하는 또 다른 컨테이너화 엔진은 Red Hat에서 개발 한 Podman입니다. Kaniko by Google, rkt by CoreOS와 같은 다른 도구는 놀랍지 만 아직 Docker를 대체 할 준비가 되지 않았습니다.


또한 역사 강의를 원한다면 기술의 주요 전환점 대부분을 다루는 놀라운 컨테이너의 역사 : 1970 년대부터 지금까지 놀라운 내용을 읽을 수 있습니다.


Docker를 설치하는 방법 


Docker 설치는 사용 중인 운영 체제에 따라 크게 다릅니다. 그러나 그것은 전반적으로 보편적으로 간단합니다.


Docker는 Mac, Windows 및 Linux의 세 가지 주요 플랫폼 모두에서 완벽하게 실행됩니다. 세 가지 중 Mac에서의 설치 프로세스가 가장 쉬우므로 여기서 시작하겠습니다.


macOS에 Docker를 설치하는 방법 


Mac에서는 공식 다운로드 페이지로 이동하여 Mac 용 다운로드 (안정적) 버튼을 클릭하기 만하면 됩니다.


정규적으로 보이는 Apple 디스크 이미지 파일이 생성되고 파일 내부에 응용 프로그램이 있습니다. 파일을 끌어서 Applications 디렉토리에 놓기만 하면 됩니다.

drag-docker-in-applications-directory.png 

애플리케이션 아이콘을 두 번 클릭하여 Docker를 시작할 수 있습니다. 애플리케이션이 시작되면 메뉴 막대에 Docker 아이콘이 표시됩니다.


docker-icon-in-menubar.png 


이제 터미널을 열고 docker --version 및 docker-compose --version을 실행하여 설치 성공을 확인하십시오.


Windows에 Docker를 설치하는 방법 


Windows에서는 몇 가지 추가 단계를 거쳐야 한다는 점을 제외하면 절차는 거의 동일합니다. 설치 단계는 다음과 같습니다.


  1. 이 사이트로 이동하여 Windows 10에 WSL2를 설치하기 위한 지침을 따릅니다.
  2. 그런 다음 공식 다운로드 페이지로 이동하여 Windows 용 다운로드 (안정) 버튼을 클릭합니다.
  3. 다운로드 한 설치 프로그램을 두 번 클릭하고 기본값으로 설치를 진행합니다.

설치가 완료되면 시작 메뉴 또는 데스크톱에서 Docker Desktop을 시작합니다. Docker 아이콘이 작업 표시 줄에 표시되어야 합니다.


docker-icon-in-taskbar.png 


이제 Ubuntu 또는 Microsoft Store에서 설치한 배포판을 엽니다. docker --version 및 docker-compose --version 명령을 실행하여 성공적으로 설치되었는지 확인합니다.


docker-and-compose-version-on-windows.png 


일반 명령 프롬프트 또는 PowerShell에서도 Docker에 액세스 할 수 있습니다. Windows의 다른 명령 줄보다 WSL2를 사용하는 것을 선호합니다.


Linux에 Docker를 설치하는 방법 


Linux에 Docker를 설치하는 것은 약간 다른 프로세스이며 사용 중인 배포에 따라 훨씬 더 다를 수 있습니다. 그러나 솔직히 말해서 설치는 다른 두 플랫폼만큼 쉽습니다 (쉽지는 않더라도).


Windows 또는 Mac의 Docker Desktop 패키지는 Docker Engine, Docker Compose, Docker Dashboard, Kubernetes 및 기타 몇 가지 기능과 같은 도구 모음입니다.


그러나 Linux에서는 이러한 번들이 제공되지 않습니다. 대신 필요한 모든 도구를 수동으로 설치합니다. 다른 배포판의 설치 절차는 다음과 같습니다.


설치가 완료되면 터미널을 열고 docker --version 및 docker-compose --version을 실행하여 설치 성공을 확인하십시오.


docker-and-compose-version-on-linux.png 

Docker는 사용 중인 플랫폼에 관계없이 매우 잘 수행되지만 다른 플랫폼보다 Linux를 선호합니다. 이 책 전체에서 Ubuntu 20.10Fedora 33 워크 스테이션간에 전환 할 것입니다.


처음부터 명확히 하고 싶은 또 다른 점은 책 전체에서 Docker로 작업하기 위해 GUI 도구를 사용하지 않는다는 것입니다.


다양한 플랫폼에서 사용할 수 있는 멋진 GUI 도구를 알고 있지만 일반적인 도커 명령을 배우는 것이 이 책의 주요 목표 중 하나입니다.


Docker의 Hello World – Docker 기본 소개 


이제 컴퓨터에서 Docker를 실행 했으므로 첫 번째 컨테이너를 실행할 때입니다. 터미널을 열고 다음 명령을 실행하십시오.


docker run hello-world

# Unable to find image 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# 0e03bdcc26d7: Pull complete 
# Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
# Status: Downloaded newer image for hello-world:latest
# 
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# 
# To generate this message, Docker took the following steps:
#  1. The Docker client contacted the Docker daemon.
#  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#     (amd64)
#  3. The Docker daemon created a new container from that image which runs the
#     executable that produces the output you are currently reading.
#  4. The Docker daemon streamed that output to the Docker client, which sent it
#     to your terminal.
#
# To try something more ambitious, you can run an Ubuntu container with:
#  $ docker run -it ubuntu bash
# 
# Share images, automate workflows, and more with a free Docker ID:
#  https://hub.docker.com/
#
# For more examples and ideas, visit:
#  https://docs.docker.com/get-started/

hello-world 이미지는 Docker를 사용한 최소 컨테이너화의 예입니다. 여기에는 터미널에 표시되는 메시지를 인쇄하는 hello.c 파일에서 컴파일 된 단일 프로그램이 있습니다.


이제 터미널에서 docker ps -a 명령을 사용하여 현재 실행 중이거나 과거에 실행 된 모든 컨테이너를 볼 수 있습니다.


docker ps -a

# CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
# 128ec8ceab71        hello-world         "/hello"            14 seconds ago      Exited (0) 13 seconds ago                      exciting_chebyshev

출력에서는 hello-world 이미지를 사용하여 컨테이너 ID가 128ec8ceab71 인 컨테이너로 흥미로운 _chebyshev라는 컨테이너가 실행되었습니다. (0) 종료 코드는 컨테이너의 런타임 동안 오류가 생성되지 않았음을 의미하는 13 초 전에 종료되었습니다.


이제 막 뒤에서 일어난 일을 이해하려면 Docker 아키텍처와 일반적으로 다음과 같은 컨테이너화의 세 가지 매우 기본적인 개념에 익숙해져야 합니다.

세 가지 개념을 알파벳순으로 나열했으며 목록의 첫 번째 개념부터 설명을 시작하겠습니다.


---

https://www.freecodecamp.org/news/the-docker-handbook/