본문 바로가기
Programming

[Docker] 도커(Docker) 이미지 만들기 2가지 방법

by 개발자 염상진 2022. 7. 27.

도커(Docker) 이미지?

 

Docker Hub에서 필요한 이미지를 가져와 개발 환경을 구성할 수 있습니다. 하지만 해당 이미지에 원하는 모든 기능이 구현되어 있지 않은 경우에는 따로 이미지를 만들어서 사용해야 합니다. 로컬에 저장되어 있는 파일을 도커 이미지에 붙여서 새로운 이미지를 만들고 배포할 수 있습니다.

 

 

이미지를 만들어야 하는 상황을 예로 들면 웹 서버 이미지(httpd)를 받아왔지만 웹 서버 애플리케이션은 직접 작성한 경우 웹 서버 이미지에 기존 파일들을 붙여서 새로운 이미지를 만들고 배포해야 웹 서비스를 구현해낼 수 있습니다. 이미지를 새로 만드는 경우 서버에 문제가 발생할 때 웹 서버 애플리케이션과 웹 서버를 구분해서 디버깅 할 수 있게 됩니다.

도커 이미지와 로컬의 파일을 연결하는 방법은 CP(copy)와 Docker Volume을 사용하는 방법으로 구분할 수 있습니다.

  • CP(copy)는 호스트와 컨테이너 사이에 파일을 복사(Copy) 합니다.
  • Volume은 호스트와 컨테이너 사이에 공간을 Mount 합니다. 즉, 다른 장치에서 접근할 수 있도록 경로를 허용해서 하나의 저장 공간을 사용하는 것 처럼 보이게 만드는 작업입니다. 

 

 

도커(Docker) 이미지와 로컬 파일 연결하기

 

전체적인 그림은 도커 이미지(httpd)를 가져와서 팩맨 게임 파일을 붙여서 실행합니다.

팩맨 Github Repository : https://github.com/platzhersh/pacman-canvas

 

① 팩맨 Repository Clone

우선 팩맨 Repository를 Github에서 clone합니다.

$ git clone https://github.com/platzhersh/pacman-canvas

 

② httpd 웹 서버 도커 이미지 가져오기

httpd(Http Daemon) 이미지는 Apache HTTP Server를 실행하는 오픈소스 웹 서버 소프트웨어 입니다. 아파치를 써보신 분들은 알겠지만 /usr/local/apache2/htdocs/ 경로에 들어간 파일을 웹 서버에서 실행하게 됩니다. 

$ sudo docker run --name httpd_con -p 818:80 -d httpd
  • -p 옵션은 로컬 호스트와 컨테이너의 포트를 연결하는 옵션입니다. 818 포트는 로컬 호스트의 포트고, 80은 httpd_con 컨테이너의 포트입니다. 
  • -d 옵션(detach)은 해당 컨테이너가 백그라운드 형태로 작동하도록 하는 옵션입니다.
  • 위 명령을 실행 후 로컬 호스트의 포트인 localhost:818로 접속하면 정상적으로 리소스가 반환됩니다.

 

 

③ 로컬 호스트 파일을 컨테이너로 복사하기

서버가 정상적으로 작동하면, clone 해왔던 팩맨 리포지토리의 파일들을 httpd_con 컨테이너로 복사합니다. 아래 명령은 pacman-canvas 디렉토리 내부에서 실행해야 합니다. 

$ sudo docker cp ./ httpd_con:/usr/local/apache2/htdocs/

 

가져온 httpd 이미지의 터미널에 직접 접속해 정상적으로 복사가 되었는지 확인할 수 있습니다.

$ sudo docker exec -it httpd_con bash

 

컨테이너 내부의 /usr/local/apache2/htdocs/ 디렉토리 내부에 팩맨 디렉토리가 정상적으로 복사된 경우 게임이 실행됩니다. 오랜만에 팩맨 게임하니 엄청 재미있습니다.

 

 

도커(Docker) 이미지 만들기

 

로컬 파일과 도커 허브에서 가져온 이미지 파일을 연결하는데 성공했습니다. 이제 실행했던 컨테이너를 이미지 파일로 변환합니다. 이미지로 패키징 해놓으면 배포할 때 시간을 단축할 수 있습니다. 

도커 이미지로 변환하는 방법은 커밋해서 컨테이너를 이미지로 바꾸는 방법과 이미지를 빌드하기 위한 Dockerfile로 이미지를 만드는 방법 2가지가 있습니다.

1. Docker Container Commit 사용

commit 명령어를 사용해서 이전에 로컬 파일로 이미지를 결합했던 컨테이너를 first_pacman:1.0이라는 이미지로 생성합니다.

$ sudo docker container commit httpd_con first_pacman:1.0

이미지가 새로 생성되었습니다.

first_pacman               1.0       e7eb90fbbc11   8 seconds ago   216MB

 

 

생성된 이미지로 포트 8111번 포트에서 컨테이너를 실행해봅니다. 이제 팩맨을 실행하기 위해 httpd 이미지를 가져오고 팩맨 리포지토리를 클론해와서 결합할 필요없이 first_pacman:1.0 이라는 이미지만 실행하면 바로 팩맨 게임을 즐길 수 있습니다.

$ sudo docker run --name test_image -p 8111:80 -d first_pacman:1.0

 

127.0.0.1:8111로 접속합니다. 정상적으로 팩맨 게임이 실행됩니다.

 

 

 

2. Dockerfile 사용해서 이미지 빌드하는 방법

Dockerfile은 쉽게 이해하면 이미지 파일을 설명하는 문서라고 할 수 있습니다. 이미지를 빌드하는데 필요한 정보들을 기입하면 이에 맞는 이미지가 생성됩니다. 

기본 이미지는 httpd:2.4를 사용합니다.

Dockerfile이 위치한 곳의 디렉토리를 Image 내의 htdocs 디렉토리에 복사합니다.

FROM httpd:2.4
COPY ./ /usr/local/apache2/htdocs/

 

--tag 옵션으로 NAME:TAG 형식의 이미지를 빌드할 수 있습니다.

build 명령어로 지정된 경로에 위치한 Dockerfile을 빌드할 수 있습니다.

마지막 부분에 ( . )을 반드시 찍어줘야 합니다.

해당 명령어는 pacman-canvas/ 경로에 Dockerfile을 저장한 후 실행해야 합니다.

$ sudo docker build --tag second_pacman:2.0 .

 

새로운 second_pacman:2.0 이미지가 생성되었습니다. 로컬 호스트 8112 포트와 test_image2 컨테이너 포트 80을 연결합니다.

$ sudo docker run --name test_image2 -p 8112:80 -d second_pacman

 

이제 127.0.0.1:8112 로 접속하면 팩맨 게임을 즐길 수 있습니다.

 

 

 

[Docker] 도커(Docker) 사용법

도커(Docker)란? 도커(Docker)는 리눅스 컨테이너를 기반으로 소프트웨어의 격리성을 제공하고 배포를 유연하게 해주는 오픈소스 툴입니다. 도커를 사용하면 실행환경을 일치시킬 수 있고, 네트워

about-tech.tistory.com

 

 

[Docker] 도커 사용하는 이유?

컨테이너 사용 배경? 부산항에서는 무역에 필요한 물동량을 컨테이너를 이용해 처리한다. 대형 트럭이 싣고 전국 구석구석 누비는 컨테이너가 존재하지 않는다면 재래식 방법으로 현재와 같은

about-tech.tistory.com

 

댓글