처음부터 도커 이미지 만들기

Creating Docker Image From Scratch



다른 컨테이너화 기술에 비해 Docker의 주요 장점은 Docker가 개발자와 해당 업스택 애플리케이션을 대상으로 한다는 것입니다. 적절한 컨테이너화 기술은 LXC , 구역 그리고 감옥 운영 관점에서 목표로 삼고 있습니다. 간단히 말해서 이러한 플랫폼은 클라우드에서 실행되는 가상 머신을 대체합니다. 반면 Docker는 패키지 및 실행 가능한 바이너리를 대체합니다.

느슨하게 말해서, Docker는 가능한 모든 Linux 플랫폼에서 작동하는 범용 패키지 관리자와 점점 더 유사해지고 있습니다. 컨테이너를 사용하여 개발자가 직면한 완전히 다른 문제를 해결합니다. 문제는 개발자가 데스크톱 운영 체제(예: 데스크톱 관련 패키지가 많은 Windows, macOS 또는 Linux)를 사용하여 애플리케이션을 작성한다는 것입니다. 그들이 작성하는 애플리케이션은 종종 개발자의 랩톱과는 완전히 다른 일부 Linux 배포가 있는 서버의 완전히 다른 운영 체제에서 실행됩니다.







Docker의 아이디어는 애플리케이션이 Docker 이미지로 포장되어 제공된다는 것입니다. 이 이미지를 가져와 컨테이너화된 애플리케이션으로 실행하는 것이 Docker의 작업입니다. 컨테이너화된다는 것은 애플리케이션과 해당 종속성이 개발자의 랩톱 및 프로덕션 서버와 완전히 다를 수 있는 격리된 환경에서 실행된다는 것을 의미합니다. 둘 다 Docker를 지원하는 한 둘 다 똑같은 방식으로 동일한 애플리케이션을 실행할 수 있습니다.



Docker 이미지 분석

앞서 언급했듯이 Docker 앱은 합의된 환경에서 실행됩니다. 이제 문제는 그 환경을 어떻게 만들 것인가입니다. 대부분의 애플리케이션 이미지는 Docker 기본 이미지를 가져와서 그 위에 애플리케이션을 빌드합니다.



응용 프로그램은 소프트웨어 계층으로 만들어집니다. WordPress 컨테이너 이미지는 Ubuntu 이미지 위에 빌드되는 httpd 컨테이너 이미지를 사용하여 빌드됩니다. 새 이미지가 빌드되는 이미지를 Docker 용어로 PARENT IMAGE라고 합니다. Dockerfile에서(Dockerfile이 무엇을 의미하는지 나중에 알게 됨) 이 상위 이미지는 아래와 같이 파일 상단에 언급됩니다.





우분투에서:18.04
## 나머지 Dockerfile

이 Dockerfile은 실행될 때 애플리케이션을 Docker 이미지(일종의 바이너리)로 변환한 다음 다른 곳에서 새 컨테이너를 생성하기 위해 가져올 수 있는 레지스트리로 푸시할 수 있습니다. 그러나 그들은 모두 기본 이미지로 Ubuntu:18.04를 갖고 실행 중인 Ubuntu 시스템인 것처럼 실행됩니다.

새 도커 이미지를 가져오려고 할 때 이것을 알아차렸을 수 있습니다.



처음부터 Docker 이미지 만들기

이것은 실제 애플리케이션(크기가 몇 메가바이트에 불과할 수 있음)을 가져오기 전에 끌어온 레이어 수를 보여줍니다.

이러한 이유로 우리는 기본 이미지로 알려진 것을 만들고자 합니다. 다른 어떤 것 위에 구축되지 않은 것입니다. 스크래치라는 키워드는 이 레이어가 다른 레이어 위에 구축되지 않았음을 나타내는 데 사용됩니다. 이렇게:

기스로부터
## Dcokerfile의 나머지 부분

먼저 간단한 hello-world 애플리케이션을 만든 다음 나머지 Dockerfile이 무엇인지 알아낼 것입니다. 호스트 시스템은 Ubuntu:18.04 LTS이며 실험에 Docker 버전 17.12.1-ce를 사용하고 있습니다.

정적 바이너리 생성

Docker 컨테이너는 나머지 운영 체제와 격리되어 실행되는 프로세스 모음입니다. 프로세스가 접촉하는 유일한 것은 커널입니다. 커널은 CPU에서 이러한 프로세스를 예약하고 메모리 관리 및 기타 몇 가지 기본 예약 유지 작업을 수행합니다.

그러나 대부분의 고급 응용 프로그램은 많은 시스템 라이브러리(예: glibc, musl, klibc 등 ) 및 Python, Node.js 또는 Java Runtime과 같은 많은 런타임 종속성이 있습니다. 응용 프로그램 바이너리는 내부에 사용 가능한 모든 라이브러리를 가지고 있지 않지만 실행을 시작할 때 호스트 운영 체제에서 해당 라이브러리를 호출합니다.

우리는 처음부터 이미지를 만들려고 하기 때문에 이러한 멋진 것들을 얻지 못할 것입니다. 따라서 애플리케이션은 정적 파일 또는 독립 실행형 실행 파일이어야 합니다.

MyDockerImage라는 폴더를 만들고 그 안에 hello.cc 파일을 만드는 것으로 시작하겠습니다.

$mkdir내 도커 이미지
$CD내 도커 이미지
$만지다안녕하세요.cc

즐겨 사용하는 텍스트 편집기를 사용하여 hello.cc를 열고 그 안에 다음 줄을 추가합니다.

#포함하다
네임스페이스 표준 사용;
정수기본(){
비용<< '안녕하십니까! 이 메시지는 컨테이너에서 왔습니다.N';
반품 0;

}

이것은 Hello! 이 메시지 …

앞에서 논의한 이유로 정적 플래그를 사용하여 이것을 컴파일합니다. 사용중인 컴파일러는 g++(우분투 7.3.0-16우분투3) 7.3.0.

프로그램을 컴파일하려면 동일한 디렉토리에서 다음 명령을 실행하십시오.

$ g++ -오 안녕-공전안녕하세요.DC

이것은 같은 디렉토리에 바이너리 실행 파일 hello를 생성합니다. 그것이 우리의 정적 파일입니다. 터미널에서 파일 이름을 언급하여 의도한 대로 실행 중인지 테스트합니다.

$./안녕하십니까

이제 이 간단한 프로그램을 컨테이너화할 준비가 되었습니다.

도커파일

Dockerfile은 파일 시스템 레이아웃, 노출된 포트 등과 같은 다양한 구성 매개변수와 함께 애플리케이션 파일(예: 바이너리, 소스 파일 등)을 가져와 Docker 이미지 파일로 변환하는 일련의 규칙으로 구성됩니다. 그런 다음 해당 응용 프로그램을 실행하려는 모든 사람과 이미지 파일을 공유할 수 있습니다.

Dockerfile에 사용할 수 있는 모든 옵션을 조사하지 않고 대신 매우 최소한의 Dockerfile을 작성합니다. hello 실행 파일이 있는 동일한 디렉터리에 다음과 같은 빈 파일을 만듭니다. 도커파일.

$만지다도커파일

좋아하는 텍스트 편집기로 열고 다음 줄을 작성하십시오.

기스로부터
추가 안녕하세요/
명령['/안녕하십니까']

할퀴다 상위 이미지가 아닙니다. 오히려 Docker는 이미지가 다른 이미지 위에 빌드되지 않았음을 나타냅니다. 그것은 처음부터 만들어집니다. ADD 명령은 현재 디렉토리에서 |_+_|라는 정적 바이너리를 가져와서 이미지 파일의 루트 디렉토리에 추가합니다. 마침내 이 이미지를 기반으로 컨테이너를 실행할 때 hello 실행 파일은 |_+_| 루트 디렉토리 자체 내부에서 볼 수 있습니다.

마지막으로 CMD 줄에는 문자열이 있습니다. /안녕하십니까 이 문자열은 이 이미지에서 컨테이너가 생성될 때마다 셸 명령으로 실행되므로 컨테이너에 추가한 바이너리 파일과 앱에서 작성한 메시지를 인쇄합니다.

다음을 호출하여 이미지를 빌드해 보겠습니다. 도커 빌드 Dockerfile의 내용을 살펴보고 이미지를 생성하는 명령입니다. Dockerfile 및 실행 가능한 바이너리와 동일한 디렉터리에서 다음 명령을 실행합니다.

$도커 빌드--꼬리표안녕하세요 .

NS – 태그 안녕하세요 플래그는 이미지 이름을 다음으로 설정합니다. 안녕하십니까 그리고 점( . ) 마지막에 말한다 도커 빌드 Dockerfile 및 관련 콘텐츠의 현재 디렉터리를 살펴봅니다.

도커 컨테이너 실행

방금 만든 이미지가 이미지 목록에 표시되는지 확인하려면 다음을 실행합니다.

$도커 이미지

다른 이미지와 비교할 때 Hello 이미지가 얼마나 작은지 확인하십시오. 어쨌든 컨테이너로 실행할 준비가되었습니다.

$도커 실행 안녕하세요

그게 다야! 처음부터 첫 번째 최소한의 컨테이너를 만들었습니다.

다른 옵션

이미지를 처음부터 만드는 것은 항상 옵션이지만 사람들은 종종 다른 경량 Linux 배포판에서 이미지를 만드는 경향이 있습니다. 예를 들어 alpine 및 busybox와 같은 이미지는 glibc 대신 musl과 같은 더 작은 라이브러리가 있는 정말 가벼운 환경입니다.

다음을 사용하여 상위 이미지로 사용 알파인에서:최신 결과적으로 더 작은 이미지도 나타납니다. 기본 이미지의 크기가 2-5MB에 불과하기 때문입니다. 다음에 다루길 원하는 Docker 관련 주제가 있으면 알려주십시오. 당신은 우리에게 연락할 수 있습니다 트위터 , 페이스북 또는 이메일을 통해 구독하십시오.