[Docker 기본(4/8)] docker build & push

yjs0997
yjs0997
Jan 9, 2019 · 8 min read

Docker 환경에 Service 및 Application을 구동시키 위한 전체적인 과정은 다음과 같습니다.

Image for post
Image for post

지금까지는, Docker Registry(Docker Hub)에 배포되어 있는 있는 Image를 이용해 Container를 구동시켰습니다. 이제부터는 위에서 정리한 과정대로, Dockerfile로 Image를 생성하고 다른 Machine에서 배포된 Image로 Container를 실행시켜 보겠습니다.

Image for post
Image for post

신규 Image 생성에서 배포까지

Dockerfile 작성

Image for post
Image for post

image-build-test 폴더의 내부 구조는 다음과 같습니다.

Image for post
Image for post

Image Build

Image for post
Image for post
Image for post
Image for post

처음 Image를 Build하게 되면, Local Instance에 저장된 Base Image(여기서는 Ubuntu Image입니다)가 존재하지 않기 때문에, Docker Registry(Docker Hub)로부터 Pull을 받습니다. 그 후, Dockerfile의 COPY명령어가 새로운 Layer로 생성되고, ${username}/my-base-image:1.0 Image가 Build됩니다.

생성된 Image를 확인해 보겠습니다.

Image for post
Image for post

Container를 Run

Image for post
Image for post

Image를 Docker Hub에 배포

Image for post
Image for post

로그인이 정상적으로 되었다면 docker push로 생성한 Image를 Docker Registry에 등록하겠습니다.

Image for post
Image for post

Console에 찍힌 로그를 보면, Unbuntu Image는 이미 Docker Registry에 존재하기 때문에 Mount만 되고, 그 외에 생성한 Layer만 추가로 Push되는 것을 볼 수 있습니다.

Image for post
Image for post

Hello World를 만들어 보자

Dockerfile 변경

Image for post
Image for post

다음과 같은 내용으로 hello.sh를 생성합니다.

Image for post
Image for post

hello.sh 파일을 저장하고 실행가능한 상태로 변경합니다.

Image for post
Image for post

변경된 폴더 구조는 다음과 같습니다.

Image for post
Image for post

Hello World Image Build

Image for post
Image for post

처음에 Build했을 때 보다는 월등히 빠르게 Build되는 것을 알 수 있습니다. ${username}/my-final-image:1.0의 Base Image가 이미 Local에 존재하기 때문에 CMD에 해당하는 Layer만 생성하면 되기 때문입니다.

생성된 Image를 확인합니다.

Image for post
Image for post

docker history [OPTIONS] IMAGE로 각 Image를 구성하는 Layer를 한번 확인해 보겠습니다. 두 Image 사이에서 공유하는 Layer는 암호화된 ID가 동일하다는 것을 확인할 수 있습니다.

${username}/my-base-image:1.0

Image for post
Image for post

${username}/my-final-image:1.0

Image for post
Image for post

다시 Push

Image for post
Image for post

다른 곳에서 Hello World를 실행해보자

Image for post
Image for post

새로 구성한 Docker 환경에 docker-machine ssh로 접속하겠습니다.

Image for post
Image for post

지금 만든 Image를 Pull받고,..

Image for post
Image for post

새로 구성된 환경이라 Image의 모든 Layer들을 내려받습니다. 그리고, docker run을 실행하면 !!!

Image for post
Image for post

처음에 정리했던 Build — Push — Pull — Run의 과정으로 Container가 실행되는 것을 확인할 수 있었습니다. Docker Engine이 설치된 어떤 환경에서도 지금 만든 Hello world는 실행될 것입니다. 여기서 더 나아가 Hello world는 다양한 메시지를 입력받거나 혹은, 저장되어 있는 메시지들을 출력하는 Application으로 발전할 수도 있습니다. 그렇다면, 이 Application의 기능이 Upgrade되어, 새로운 버전의 Image를 만들고 새로운 Container를 기동시켜야 한다면, 변경된 내용(입력받거나 혹은 저장된 메시지들)들은 어떻게 될까요?

우리는 이전에 Image와 Container의 Layer 구조를 살펴보면서, 해당 Container에 읽기/쓰기가 가능한 Layer내에 변경된 내용들이 저장된다는 것을 알고 있습니다. 그리고, 이 데이터들은 해당 Container와 같이 소멸된다는 것도 알고 있습니다. 그럼, Container가 소멸되었다가 새로 생성되어도, 이전의 데이터들을 유지하여 사용할 방법은 없을까요? 이 다음에는 Docker의 Volume을 이용하여, 데이터를 보존하는 방법에 대해서 확인해볼 필요가 있겠네요.

DT Evangelist 기술 블로그

Digital Transformation Evangelist

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store