[ 이성미 도커 #3 ] 이미지 빌드 및 배포

정동욱·2023년 11월 22일
0
post-thumbnail

이번 글에서는 컨테이너에 필요한 요소들을 알아보고 이미지를 직접 만들어보겠습니다.

1. 이미지 빌드 개념

컨테이너는 개발한 실행파일과 운영환경이 모두 들어있는 독립된 공간입니다. 실행파일는 우리가 작성한 소스코드일테고, 운영환경이라고 한다면 자바 프로그램을 실행시킬 jre나 혹은 실행 스크립트 등을 말합니다. 우리가 운영환경, 즉 이미지를 빌드하기 위해서는 Dockerfile이라는 텍스트 문서가 필요합니다. 아래는 dockerfile을 만드는 가장 기본적인 예시입니다.

Ex)

vi dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]

docker build -t hello.js:latest .

이 dockerfile을 만들 때에는 고유의 명령어가 있습니다.

\# : comment
FROM : 컨테이너의 BASE IMAGE(운영환경). 가장 먼저 나오는 문법
MAINTAINER : 이미지를 생성한 사람의 이름 및 정보
LABEL : 컨테이너 이미지에 컨테이너의 정보를 저장 (팀명, 빌드일시 등 간단한 정보)
RUN : 컨테이너 빌드를 위해 BASE IMAGE에서 실행할 COMMANDS
COPY : 컨테이너 빌드 시 호스트의 파일을 컨테이너로 복사 (리눅스 서버의 파일을 컨테이너로 복사)
ADD : 컨테이너 빌드 시 호스트의 파일(tar, url 등)을 컨테이너로 복사 (리눅스 서버의 파일을 컨테이너로 복사)
WORKDIR : 컨테이너 빌드 시 명령이 실행될 작업 디렉토리 지정
ENV : 환경변수 지정
USER : 명령 및 컨테이너 실행 시 적용할 유저 설정
VOLUME : 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
EXPOSE : 컨테이너 동작 시 외부에서 사용할 포트 지정
CMD : 컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정
ENTRYPOINT : CMD와 함께 사용하면서 COMMAND 지정 시 사용

2. hellojs 이미지 빌드

이제 제가 직접 이미지를 만들어 볼텐데요, 위에서 말했다시피 실행파일과 운영환경이 필요합니다. 먼저 실행파일, 즉 소스를 만들어보겠습니다. hello.js라는 이름의 간단한 파일입니다.

cat > hello.js

const http = require('http');
const os = require('os');
console.log('test server starting...');

var handler = function(request, response) {
  console.log('received request from ' + request.connection.remoteAddress);
  response.writeHead(200);
  response.end('container hostname: ' + os.hostname() + '\n');
};

var www = http.createServer(handler);
www.listen(8080);

그런 다음 이 소스를 실행시킬 운영환경이 필요합니다. 바로 node.js인데요, dockerfile을 통해 생성합니다.

cat > dockerfile

FROM node:12                 => 베이스 이미지를 dockerHub에 있는 node라는 이미지의 12버전으로부터 가져온다.
COPY hello.js /              => 현재 디렉토리의 hello.js라는 파일을 컨테이너의 최상위 경로로 복사한다.
CMD ["node", "/hello.js"]    => "node"라는 명령어로 컨테이너 최상위 경로의 "hello.js"라는 파일을 동작한다.

그리고 이 이미지를 빌드합니다.

docker build -t hellojs:latest .
-t: 이미지 이름:태그(버전)
.: 현재 디렉토리를 기준으로 작업

조금의 시간이 지나면 빌드과정이 끝납니다. 현재 설치되어 있는 이미지를 확인해보겠습니다. 이전에 다운로드 받은 node 이미지 조금 전 생성한 hellojs라는 직접 만든 이미지가 있는 걸 볼 수 있습니다.

docker images

우리가 위에서 dockerfile을 생성하면서 FROM, COPY, CMD까지 3개의 명령어를 사용했는데요, 이 사용한 명령어의 수만큼 Layer가 생기는 것입니다. 즉, 이 hellojs라는 이미지는 3개의 Layer로 이루어져 있는 것이죠.

3. apache 이미지 빌드

똑같은 방식으로 아파치 이미지를 생성해보겠습니다. 똑같이 dockerfile을 생성합니다. 이번엔 명령어를 조금 더 사용해보겠습니다.

# install apache

FROM centos:7											 => 베이스 이미지를 centos 7버전으로 부터 생성한다.
LABEL maintainer="jeongdonguk <foodsmith96@naver.com>"   => 작업자를 명시한다.
RUN yum update \										 => yum 패키지를 업데이트하고, httpd를 설치한다.
    && yum install httpd -y								 => \ &&를 통해 2줄의 RUN을 1줄로 줄인다.
RUN echo "TEST WEB" > /var/www/html/index.html			 => 인덱스 화면의 내용을 "TEST WEB"으로 덮어씌운다.
EXPOSE 80												 => 80포트를 사용한다.
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]			 		 => "httpd" 데몬을 "-DFOREGROUND" 옵션으로 실행한다.

이렇게 되면 6개의 Layer를 가진 dockerfile이 생성됩니다. 그리고 이 dockerfile을 이미지로 빌드합니다.

docker build -t webserver:v1 .
-t: 이미지 이름:태그(버전)
.: 현재 디렉토리를 기준으로 작업

생성된 이미지를 확인합니다.

docker images

그렇다면 이 웹서버를 이제 실행시켜보겠습니다. 컨테이너 고유 ID가 뜨면 성공적으로 실행된 것입니다.

docker run -d -p 80:80 --name web webserver:v1

그럼 이제 이 웹서버에 curl을 날려서 apache 웹서버가 정상적으로 띄워졌는지 확인해보겠습니다.

현재 실행중인 컨테이너를 확인해보겠습니다.

모두 정상적으로 작동됐음을 확인했으니 이제 이 컨테이너를 종료시켜야 하는데요, 이번에는 다른 명령어를 사용해 중지와 삭제를 동시에 해보겠습니다.

docker rm -f web (컨테이너의 NAME을 명시해야 한다.)

그리고 현재 실행중인 컨테이너를 볼텐데요, -a 옵션을 붙이면 실행중이지 않은 컨테이너도 모두 보여줍니다. 우리는 rm -f로 삭제했기 때문에 아무것도 뜨지 않습니다.

컨테이너만 삭제된 것이지 이미지는 그대로 있습니다.

4. 이미지 배포

우리가 만든 이미지를 이제 도커허브에 배포해보겠습니다. 그러기 위해서는 도커허브에 계정이 필요하기 때문에 하나 생성해줍니다. 그런 다음 우리가 만든 이미지들의 이름을 조금 바꿔야 하는데요, 이미지의 이름 앞에 도커허브 계정이 붙어야되기 때문입니다.

docker tag webserver:v1 jdk96/webserver:v1
docker tag hellojs:latest jdk96/hellojs:latest

tag: 이미지명을 변경하거나, 새로운 태그명을 붙일 때 사용. 새로운 이름의 이미지로 복사.

그런 다음 명령어를 통해 배포를 진행합니다.

docker push jdk96/hellojs

배포가 끝나면 도커허브 계정의 리파지토리가 하나 생성됩니다.

이미지를 빌드하고 배포하는 과정에 대해 알아봤습니다. 다음 글에서는 컨테이너의 보관창고와 사용법에 대해 알아보겠습니다.

profile
거인의 어깨 위에서 탭댄스를

0개의 댓글

관련 채용 정보