전시 패키지 만들기

DockerBeginner
지금 연습하기

소개

Marsh House는 이미지 레지스트리에 접근할 수 없는 수신 키오스크에 Along the waterline, River edition 1을 보내려고 합니다. 이 전시는 웹 서비스, 레코드 API, 컬렉션 파일 디렉터리로 구성됩니다. 다른 곳에서 이 정확한 릴리스를 실행하는 데 필요한 모든 것을 담은 폴더를 준비하세요.

기본 Docker 빌드/실행, 공개 포트, 터미널 경로를 알고 있어야 합니다. 이 실습에서는 작은 Compose 파일, 이미지 아카이브, 이동 가능한 파일 구성을 배웁니다. 프로그래밍이나 박물관 지식은 필요하지 않습니다. Docker와 두 애플리케이션 이미지가 준비되어 있습니다. 레코드와 직접 제작한 개략 일러스트는 가상의 교육용 자료입니다.

명령에는 Workstation, 정상 작동하는 예제에는 Source Exhibition을 사용하세요. Receiving Exhibition은 빈 상태로 시작합니다. 이 전달 경계는 다음 독립 실습에서 사용합니다. 이 실습의 결과는 실행 중인 수신 서비스가 아닌 완전한 패킷입니다. 읽기와 일반적인 실수를 포함해 약 45분을 예상하세요. 이는 저자의 예상 시간입니다.

전체 전시 파악하기

이 단계에서는 인계 후에도 유지되어야 할 대상을 식별하고 정확한 이미지 쌍을 저장합니다. Source Exhibition에서 시작하세요. 페이지에는 전시물 네 개가 표시됩니다. Pocket compass를 열어 일러스트와 이야기를 살펴보고 Download field sheet를 선택하세요. 에디션, 전시물 ID, 설명이 담긴 실제 텍스트 레코드가 다운로드됩니다. Back to collection으로 돌아가 Crossing ledger를 열고 그 현장 기록지도 다운로드하세요. 이들은 서로 다른 전시물로 각자의 레코드와 파일을 가집니다.

컬렉션은 각 전시물을 자체 상세 페이지 및 현장 기록지 다운로드와 연결합니다.

원본 전시에 있는 전시물 네 개

Workstation으로 전환하세요. /home/labex/project/exhibition-release에서 시작합니다. pwd는 현재 폴더를 표시하고 ls는 내용을 나열합니다. 다른 곳으로 이동했다면 cd로 돌아올 수 있습니다.

cd /home/labex/project/exhibition-release
ls

compose.yaml은 실행 중인 두 서비스를 설명합니다. release.json은 이 에디션과 태그가 가리키는 변경 불가능한 이미지 ID를 식별합니다. collection/에는 공개된 JSON 레코드, 직접 제작한 SVG 일러스트, 텍스트 다운로드가 들어 있습니다. author-notes/에는 미공개 초안이 있으며 패킷에서 제외해야 합니다. 제공된 모든 자료와 실행 중인 소스 서비스를 변경하지 마세요.

cat은 텍스트 파일을 표시합니다. 릴리스 레코드를 읽으세요.

cat release.json

web 및 api 항목을 찾으세요. 태그는 field-notes/web:pack과 field-notes/api:pack이며, 각각 sha256:으로 시작하는 이미지 ID도 있습니다. 태그는 다른 대상을 가리킬 수 있는 이름입니다. ID는 이 특정 이미지 내용을 식별합니다. 릴리스 항목을 함께 전달하세요. 작동하는 웹 이미지만으로는 레코드와 파일을 제공할 수 없습니다.

mkdir는 디렉터리를 생성합니다. -p는 없는 상위 디렉터리도 만들고 기존 디렉터리도 허용합니다. 본인의 이전 시도로 packet이 이미 있다면 ls packet으로 확인하고 계속 채우세요. 제공된 소스 폴더를 삭제하지 마세요.

mkdir -p packet

--context default는 소스 Engine을 명시적으로 대상으로 지정합니다. 컨텍스트는 Docker 데몬 연결의 이름이며 두 번째 물리적 머신이 아닙니다. docker image save는 이미지 설정, 태그, 파일시스템 레이어를 씁니다. -o는 출력 파일 이름을 지정합니다. 이 단일 아카이브에 두 릴리스 태그를 모두 포함하세요.

docker --context default image save -o packet/images.tar field-notes/web:pack field-notes/api:pack

잠시 걸릴 수 있으며 성공하면 보통 아무것도 출력하지 않습니다. docker container export는 다릅니다. 컨테이너 파일시스템을 내보내며 이미지 메타데이터를 제외하고 바인드 마운트 파일도 수집하지 않습니다. 이 이미지 인계를 대신할 수 없습니다.

런타임 파일의 관계 읽기

이 단계에서는 Compose 파일과 방금 사용한 전시의 관계를 파악하고 이동 가능한 설정을 복사합니다. Workstation에서 파일을 표시하세요.

cat compose.yaml

YAML은 들여쓰기로 관계를 표현합니다. services:에는 gallery와 records가 들어 있습니다. 각각의 image:는 준비된 이미지를 선택하며, 이 파일에는 빌드 방법이 없습니다. gallery는 브라우저 페이지를 제공하고 공개 자료를 읽는 API인 records에 컬렉션을 요청합니다.

두 서비스 모두 network_mode: host를 사용하여 Engine 호스트의 네트워크 네임스페이스를 공유합니다. 여기서 웹 서비스는 포트 9100, API는 9101에서 수신합니다. 소스 Engine은 Workstation 네트워크를 사용합니다. 수신 Engine은 자체의 격리된 컨테이너 네트워크 네임스페이스에서 실행되므로 그곳의 같은 포트 번호는 소스를 가리키지 않습니다. 이는 의도적으로 작게 구성한 로컬 교육 환경이며 일반적인 네트워크 보안 방법이 아닙니다.

API_ORIGIN은 gallery 프로그램에 전달하는 이름 있는 값인 환경 변수입니다. 값 http://127.0.0.1:9101은 같은 네임스페이스의 API를 가리킵니다. records.volumes는 ./collection을 /collection에 읽기 전용으로 바인드하며 :ro가 이를 표시합니다. ./ 경로는 compose.yaml 옆에 있는 Compose 프로젝트 디렉터리 기준의 상대 경로입니다. 이미지는 이를 포함하지 않으므로 외부 런타임 의존성입니다.

서비스를 시작하거나 변경하지 않고 Compose에 파일을 해석하도록 요청하세요.

docker --context default compose config

--context default는 준비된 소스 Engine을 명시적으로 선택합니다. 컨텍스트는 Docker 데몬으로의 이름 있는 연결이며 두 번째 물리적 컴퓨터가 아닙니다. 출력은 컬렉션의 상대 경로를 현재 소스 폴더의 절대 경로로 확장합니다. 전달할 때는 원본 파일의 상대 경로를 유지하세요. 확장된 소스 경로를 패킷에 복사하면 여전히 이전 Workstation 위치에 의존하게 됩니다.

이제 필요한 전체 집합이 명확합니다. 두 이미지의 내용, Compose 설정 하나, 공개 컬렉션 전체입니다. 받은 에디션을 시작하는 데 컴파일러, 소스 빌드 디렉터리, 초안, 실행 중인 소스 컨테이너는 필요하지 않습니다.

cp는 파일을 복사하고, -r은 디렉터리와 그 하위 항목을 재귀적으로 복사합니다. 원본의 이동 가능한 설정과 공개 컬렉션을 복사합니다.

cp compose.yaml packet/compose.yaml

이동 가능한 패킷 구성하기

이 단계에서는 공개 컬렉션으로 패킷을 완성하고 이동 가능한 전달물인지 살펴봅니다. Workstation에서 시작하세요. 패킷의 컬렉션 폴더를 만든 다음 소스 디렉터리의 내용을 재귀적으로 복사합니다. /.는 그 내용을 뜻하므로 이 명령을 반복해도 컬렉션 디렉터리가 한 단계 더 중첩되지 않습니다.

mkdir -p packet/collection
cp -r collection/. packet/collection/

결과를 살펴보세요.

ls packet
ls packet/collection
cat packet/compose.yaml

최상위에는 정확히 compose.yaml, images.tar, collection이 있습니다. 컬렉션에는 exhibits.json, art/, download/가 들어 있습니다. Compose 마운트는 여전히 ./collection으로 시작하며 소스의 절대 경로를 사용하지 않습니다. 런타임 패킷에 author-notes나 release.json을 복사하지 마세요. 후자는 소스 측의 선택 근거입니다.

파일이 있거나 아카이브가 크다는 사실만으로는 완전성을 입증할 수 없습니다. 검사는 저장한 두 이미지를 일회용 독립 이미지 저장소에 로드하고 네트워크, 소스 마운트, pull, build 없이 그곳에서 패킷을 실행합니다. 모든 레코드, 일러스트, 다운로드 바이트를 읽은 후 격리된 테스트 리소스를 제거합니다. 학습자의 현재 실습 환경에 있는 수신 측 전시를 시작하거나 변경하지 않습니다.

검사가 이미지 누락을 보고하면 release.json을 다시 읽고 두 태그를 모두 포함한 같은 저장 명령을 다시 실행하세요. 컬렉션 파일이 없으면 두 ls 결과를 비교하고 공개 디렉터리를 올바르게 복사합니다. 경로가 틀리면 제공된 이동 가능한 파일에서 packet/compose.yaml을 복원하세요. 이 실습에서는 패킷을 여기에 두세요. 다음 실습은 자체의 독립 파일로 시작합니다.

요약

두 서비스 애플리케이션의 완전한 런타임을 식별하고 정확한 이미지 쌍을 저장했으며 이동 가능한 Compose 파일 옆에 외부 컬렉션을 모았습니다. 패킷은 소스 디렉터리를 빌리지 않고 독립적인 이미지 저장소에서 시작할 수 있습니다. 이미지 레이어는 이 전달물의 일부일 뿐이었습니다.