Docker Essentials - Image

INHEES·2024년 12월 30일
post-thumbnail

기존의 프로젝트를 진행하면서 Docker 를 사용하여 컨테이너라는 가상화된 단위로 패키징하여 쉽게 배포하고 실행하는데 그쳤다. 강의를 통해 Docker 의 기본적인 개념부터 정리할 생각입니다.

금일은 Docker 플랫폼의 image 에 대해 알아보겠습니다.
실습 내용은 이미지로 첨부하도록 하겠습니다.


목차

  • Docker Image
  • Dockerfile
  • 가상화 시스템 구축
  • Docker Registry

Docker Image

Docker Images 는 Docker 실행 환경이라고 말하며 Docker 라는 가상화 환경을 실행하기 위한 준비되어 있는 하나의 파일이다.

  • 컨테이너를 만드는 데에 필요한 인기 전용 상태의 템플릿
  • 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있지만, 상태 값은 존재하지 않는다.
  • Docker Image 가 존재해야 실체화 되어있는 Container 가 실행 가능하다.

Docker Image 를 실행하기 위한 플로우

  • Registry 는 여러개의 Repository 로 구성되어 있다.
  • Docker deamon 은 Image 를 통해 Container 를 작업할 수 있도록 도와주며 Docker cli 역할을 하는 Client 의 Command 를 실행 가능케 하는 역할이다.

Dockerfile

Dockerfile 은 이미지 빌드용 DSL(Domain Specific Language) 독립적인 언어로 구성되어있다.

  • 기본적으로 Dockerfile 이름으로 작성하며 사용자 정의로 Dockefile_test 형식으로 작성도 가능하다.

아래의 코드는 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 작성 명령어

명령어설명
FROMBase Images 지정 명령어
RUN특정 Layer 생성
COPY이미지 파일 생성시 호스트 파일 복사
ADD이미지 파일 생성시 호스트 파일 복사(tag, url 가능)
WORKDIR이미지 파일 생성시 명령어가 실행 될 작업 디렉토리
ENTRYPOINT컨테이너가 실행 될 떄 가장 먼저 실행될 프로그림 저정 (컨테이너 실행 시 명령어 Overwrite 불가능)
CMD컨테이너가 실행 될 때 가장 먼저 실행될 프로그램 지정(컨테이너 실행 시 명령어 Overwirte 가능)
ENV컨테이너 내의 환경변수 설정
EXPOSE컨테이너의 특정 포트를 외부에 오픈

Docker 가상화 시스템 구축 - Node.js

개발 환경은 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 Registry 는 Docker 를 통해 생성하는 Image 들을 저장해주는 저장소인 Repository 이다.
종류

  • DockerHub 에 있는 public registry
  • 기업망 내부와 자신의 Local PC 에 위치해 있는 private registry 가 있다.

Docker Image 들의 위치 제어 및 ci/cd 를 위한 자동화 pipeline 구축이 가능한 저장소

  • dockerhub(public repository)
  • harbor(private repository)
  • amazon ECR(container registry)

Docker Image의 생성과 사용 Flow

  • commit : container 의 상태를 변경하여 images 를 생성하는 명령어
  • save : 해당 image 를 tar 압축 파일로 변경하는 명령어
  • load : 다른 pc 에 설치되어 있는 것을 images 에 업로드 하는 명령어

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]

참고자료
https://www.inflearn.com/course/devops-docker-%EA%B0%80%EC%83%81%ED%99%94-%EA%B8%B0%EC%88%A0/dashboard

profile
이유를 찾아보자

0개의 댓글