기존의 프로젝트를 진행하면서 Docker 를 사용하여 컨테이너라는 가상화된 단위로 패키징하여 쉽게 배포하고 실행하는데 그쳤다. 강의를 통해 Docker 의 기본적인 개념부터 정리할 생각입니다.
금일은 Docker 플랫폼의 image 에 대해 알아보겠습니다.
실습 내용은 이미지로 첨부하도록 하겠습니다.
Docker Images 는 Docker 실행 환경이라고 말하며 Docker 라는 가상화 환경을 실행하기 위한 준비되어 있는 하나의 파일이다.
Docker Image 를 실행하기 위한 플로우

Dockerfile 은 이미지 빌드용 DSL(Domain Specific Language) 독립적인 언어로 구성되어있다.
아래의 코드는 Dockerfile 파일안에 어떠한 이미지를 가지고 Base 를 할 것인지 Base Image 를 명시한다.
FROM ubuntu:16.04
다음은 해당 Dockerfile 를 실행 시키기 위한 명령어의 순서이다.
--tag 는 -t 로도 쓰이며 이미지명인 first_image 뒤에는 tag 명인 0.1 이 들어간다. -f 는 파일명을 명시하기 위한 옵션이며 마지막 . 은 현재 Dockerfile 의 위치이다.
run -it 옵션은 해당 Image 를 실행 시키기 위한 명령어이다.
docker build --tag first-image:0.1 -f Dockerfile .
docker image ls
docker run -it first-image:0.1 bash
Dockerfile 작성 명령어
| 명령어 | 설명 |
|---|---|
| FROM | Base Images 지정 명령어 |
| RUN | 특정 Layer 생성 |
| COPY | 이미지 파일 생성시 호스트 파일 복사 |
| ADD | 이미지 파일 생성시 호스트 파일 복사(tag, url 가능) |
| WORKDIR | 이미지 파일 생성시 명령어가 실행 될 작업 디렉토리 |
| ENTRYPOINT | 컨테이너가 실행 될 떄 가장 먼저 실행될 프로그림 저정 (컨테이너 실행 시 명령어 Overwrite 불가능) |
| CMD | 컨테이너가 실행 될 때 가장 먼저 실행될 프로그램 지정(컨테이너 실행 시 명령어 Overwirte 가능) |
| ENV | 컨테이너 내의 환경변수 설정 |
| EXPOSE | 컨테이너의 특정 포트를 외부에 오픈 |
개발 환경은 Intellij 를 활용하였습니다.
Docker 의 nodejs 의 이미지를 활용해서 host pc 의 환경 구축 없이 컨테이너를 활용하여 해당 어플리케이션을 실행해 보겠습니다.
package.json
웹브라우저에서 실행가능하기 위한 웹 애플리케이션 이므로 웹서비스가 필요하므로 express 모듈을 활용하였다.
{
"name": "example",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"build": "babel app.js -d dist",
"serve": "node app.js"
},
"dependencies": {
"express": "^4.19.2"
},
"devDependencies": {
"@babel/cli": "7.18.10",
"@babel/core": "7.19.1",
"@babel/node": "7.19.1",
"@babel/preset-env": "7.19.1",
"@babel/runtime": "7.12.5"
}
}
app.js
var express = require('express');
var app = express();
app.get('/', (req, res) => {
res.status(200).json({
message: `Hello, ${req.query.name}!`
});
});
app.listen(8000, () => {
console.log(`Example app for CI/CD listening on port 8000`)
})
Dockerfile
기존의 ubuntu 이미지보다 경량화된 alpine linux 위에 node 가 위치한 이미지를 사용하겠습니다.
FROM node:alpine
WORKDIR /home/app
COPY ./my-nodejs/package.json ./package.json
COPY ./my-nodejs/app.js ./app.js
RUN npm install
CMD ["node", "app.js"]
WORKDIR 는 Container 내부의 root 디렉토리가 아니라 사용자가 지정할 수 있는 Container 내부의 위치를 지정해준다.
docker cli 명령어
docker build -t nodejs-demo1:latest -f Dockerfile .
docker run -d -p 8000:8000 nodejs-demo1:latest
해당 포트 매핑

Docker Registry 는 Docker 를 통해 생성하는 Image 들을 저장해주는 저장소인 Repository 이다.
종류
Docker Image 들의 위치 제어 및 ci/cd 를 위한 자동화 pipeline 구축이 가능한 저장소
Docker Image의 생성과 사용 Flow
CI/CD 자동화 파이프라인

Local Registry 구축
docker pull ubuntu
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu:latest
curl http://localhost:5000/v2/_catalog
curl http://localhost:5000/v2/nodejs-demo1/tags/list
해당 명령어는 ubuntu image 앞에 registry 가 생략되어 있다. local registry 에 적재하기 위해서는 tag 명령어를 통해 이름을 변경해주어야 한다.
tags/list 명령어는 해당 이미지의 tags list 를 반환한다.
Cloud Registry
DockerHub 에 local 이미지를 올려보겠습니다.
DockerHub 에 저장소를 만들어 두자.
일반적으로 docker push nodejs-demo1:latest 명령어를 사용하면 denied 에러가 발생한다. docker.io/library 때문에 우리에게 할당된 repository로 변경이 필요하다.
docker tag nodejs-demo1:latest [user 계졍명]/nodejs-demo1:latest
docker push [user 계정명]/nodejs-demo1:lateset
docker rmi [image id]/[tags name] 또는 docker rmi -f [images id]