[Docker] 도커 이미지 만들기-기본

2023. 8. 8. 01:31초기 과업/DevSecOps

작성자알 수 없는 사용자

728x90
반응형

안녕하세요. 기깔나는 사람들에서 DMSO를 맡고있는 정우입니다.

오늘은 도커의 이미지란 무엇이고 어떻게 생성하는지 알아볼게요.


이미지란?

컨테이너를 만들기 위해 필요한 설정이나 종속성을 가지고 있는 소프트웨어 패키지 

 

 

 

도커는 레이어드 파일 시스템 기반
이미지 구성 방식 종류 : AUFS, BTRFS, Overlayfs, ...
이미지는 프로세스가 실행되는 파일들의 집합(환경) 

프로세스는 환경(파일)을 변경할 수 있습니다.

이미지를 통해 컨테이너를 만든다

이미지는 어떻게 작동이 되는가? 

 

  1. 시작 시 실행될 명령어  ex) run kakaotalk
  2. 파일 스냅샷(명령어만 가지고 카카오톡을 가질수 없기때문에)   ex ) 카카오톡 파일

 

 

 

 

이미지는 읽기 영역 과 쓰기영역으로 나뉩니다

 

예를들어  ubuntu를 설치했을때

우분투 자체는 원본을 바꾸진 못하지만 안에서 추가 할수 있습니다.

 

실습 : 

$ docker run -it --name git ubuntu:latest bash

깃이름의 우분투를 run해볼게요.

 

git이 설치가 되어있나 확인

$ git

$ #안되어 있으니 update먼저

$ apt-get update

 

깃을 설치해 줍니다. 

$ apt-get install -y git

$ git version

설치 완료입니다!

 


git commit

 

 

$ docker commit git ubuntu:git

 

git이라는 컨테이너를 ubuntu에 git이라는 tag를 걸어줍니다.

 

 

그럼 만들어뒀던 컨테이너에 사용해볼게요.

$ docker run -it --name git2 ubuntu:git bash

그전과 다른건, latest를 사용했을땐 git을 설치해야했지만 

이것은 그냥 사용이 가능해집니다.

 

 

도커 이미지를 만들기 위한 명령어

 

docker build -t <이름공간>/<이미지이름>:<태그>

 

도커파일 사용

Dockerfile 

   -  FROM : 기본이미지

   -  RUN  : 쉘 명령어 실행

   -  CMD : 컨테이너 기본 실행 명령어

   -  EXPOSE  : 오픈되는 포트 정보 

   -  ENV : 환경변수 설정

   -  ADD  : 파일 또는 디렉토리 추가 URL/ZIP 사용가능

   -  COPY : 파일 또는 디렉토리 추가

   -  ENTRYPOINT : 컨테이너 기본 실행 명령어  

 

도커ignore 파일 사용가능합니다. 

필요없는 것을 제외가능해집니다. 

 

 

Git을 설치한 ubuntu 이미지

깃을 설치한 우분투 이미지를 다른 이미지에도 만들어줄게요

# git 파일을 하나 만들어줄게요
$ mkdir git

# Dockerfile 파일 만들어주기
$ touch Dockerfile

 

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y git

 

$ docker build -t ubuntu:git-dockerfile .

 

 

 

$ docker images

 

그럼 만든 git을 실행해볼게요

$ docker run -it --name git3 ubuntu:git-dockerfile bash

 

도커 파일로 만들어서 사용시 좋은점

- 최초부터 어떤작업을 거쳐서 설치되는지 알수 있습니다.


도커 이미지 만들기

도커이미지 생성 순서

Dockerfile작성 -> 도커 클라이언트 -> 도커 서버 -> 이미지 생성

 

 

Fastify 를 사용해볼게요

 

https://fastify.dev/docs/latest/Guides/Getting-Started/

 

공식문서에서 나와있듯이 npm을 사용하기 이전에 npm이 존재하지 않기때문에 install받아줍니다.

$ sudo apt install npm

다운이 완료되면 

 

web 이라는 폴더를 하나 만들어줄게요

$ mkdir web

 

 

 

npm을 사용하려면 초기화를 먼저 해줘야합니다.

$ npm init

 

fastify 패키지 설치

$ npm i fastify --save

 

현재 위치에서 app.js 파일 하나 만들어줄게요.

// Require the framework and instantiate it

// ESM
import Fastify from 'fastify'
const fastify = Fastify({
  logger: true
})
// CommonJs
const fastify = require('fastify')({
  logger: true
})

// Declare a route
fastify.get('/', (request, reply) => {
  reply.send({ hello: 'world' })
})


// Run the server!
fastify.listen(3000, '0.0.0.0', function (err, address) {
	if (err) {
		fastify.log.error(err)
		process.exit(1)
	}
	fastify.log.info(`server listening on ${address}`)
})

 

 

만든 js를 node로 실행해볼게요 

$ node app.js

에러발생


Syntax error 가 났습니다.

import Fastify from 'fastify'
       ^^^^^^^

SyntaxError: Unexpected identifier

 

 

구글링을 해보니 현재 버전은 10.19.0인데

nodejs 16 버전부터 가능해서 나는 에러라고 하네요

 

node 버전확인

$ node --version
$ node -v

 


해결방법 : 

npm init으로 다시 초기화를 해줍니다

$ npm init

 

 

$  npm install -g n                  # root계정이아니면 permission denied 날거에요

$  sudo npm install -g n         # root로 실행

$ sudo n latest                       # 최근 버전으로 실행

 

 

새로운 세션에서 nodejs 버전을 확인합니다.

저는 20버전입니다.

 

다시 문서에서 처럼 노드 컨테이너를 실행해볼게요

$ npm i fastify

$ node app.js

 

로컬에서 실행해보면 : 

 

https://velog.io/@wnsqud70/Dockernode-js-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

 

[Docker]node js, 이미지, 컨테이너

학습목표 이번 시간에는 node js 간단한 웹애플리케이션을 만들고 이것을 도커 이미지로 만들고 그걸 컨테이너로 만드는 시간이다. fastify 라는 라이브러리를 사용할 예정 실습 fastify 라이브러리

velog.io

https://blog.hubspot.com/website/update-node-js

 

How To Update Node Versions Using Mac, Windows, and Linux

Learn how to update your Node versions on Mac, Windows, and Linux.

blog.hubspot.com

 


1. dockerfile만들기

Dockerfile이란 :

도커 이미지를 만들기 위한 설정 파일이며, 컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의해 주는 곳입니다.

 

 

위에 실행한 방법을 dockerfile을 만들어서 해봅니다. 

 

도커파일 만드는 순서

  1. 베이스 이미지를 명시해준다. (파일 스냅샷에 해당)
  2. 추가적으로 필요한 파일을 다운 받기 위한 몇 가지 명령어를 명시해준다. (파일 스냅샷에 해당)
  3. 컨테이너 시작 시 실행될 명령어를 명시해준다. (시작 시 실행될 명령어에 해당)

 

Dockerfile 을 만들어줄겁니다. 

 

$ touch Dockerfile

$ vi Dockerfile

Dockerfile

# 1. node 설치
FROM ubuntu:22.04
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs

# 2. 소스 복사
COPY . /usr/src/app

# 3. Nodejs 패키지 설치
WORKDIR /usr/src/app
RUN npm install

# 4. WEB 서버 실행 (Listen 포트 정의)
EXPOSE 3000
CMD node app.js

 

 

이제 필요없는 파일을 dockerignore로 제외시켜줄게요

$ vi .dockerignore
node_modules/*                  #==>  - dockerignore 제외할것 지정

 

 

nodejs 이미지를 만들어 볼게요

$ docker build -t web .

 

 


최적화하기 

1. 이미 있는 이미지에 추가하기 

예를들어 :

FROM node:12 

- node:12 라는 이미 있는 이미지를사용해 서버를 실행하겠다

 

도커에는 Using cache 를 사용하는데 

뭔가 변경이되면 cache가 깨지면서 속도가 느려질 수도 있습니다. 

 

npm install 때문에 느려지는데

미리 패키지를 복사하면 조금 더 빠르게 사용할 수 있습니다. 

 

 

처음 build는 느리겠지만 

 

app.js를 수정하고 (world -> docker 로 수정)

 

다시 build를 하면 

 

굉장히 빨라지는것을 볼 수 있습니다. 

 

2. 용량을 줄이는 방법(alpine 버전)

node:16.3.0-alpine 

(강의는 12버전이지만 현재 사용하는건 16.3.0 버전입니다.)

# 1. node 이미지 사용
FROM node:12-alphine

# 2. 패키지 우선 복사
COPY ./package* /usr/src/app/
WORKDIR /usr/src/app
RUN npm install

# 3. 소스 복사
COPY . /usr/src/app

# 4. WEB 서버 실행 (Listen 포트 정의)
EXPOSE 3000
CMD node app.js

 

용량차이 확인해볼게요

$ docker images

 

 

 

 

Alpine 리눅스는 경량적으로 가볍게 사용이가능하다는 장점이있는데요,

보안 취약점이 발견되면서 보안측면에서는 지양한다는 얘기가 나왔습니다. 

▼ 더보기

더보기

알파인의 기본 패키지 관리자를 APK라고 하는데, 먼저는 여기서 몇 가지 버그가 발견됐다고 합니다. 

이 버그들 중 네트워크 내에서 중간자 공격을 통해 임의의 코드를 실행시킬 수 있게 해주는 취약점이 발견됐습니다. 

이렇게 되면 공격자가 알파인 기반 도커 하나를 겨냥해 침해하고, 코드를 실행시킬 수 있게 됩니다.

 

관련 뉴스: 

https://www.boannews.com/media/news_print.asp?idx=73111 

 

보안뉴스_뉴스

알파인 리눅스, 용량 작고 부팅 빨라 도커와 함께 널리 사용돼가장 치명적인 버그는 중간자 공격 통해 코드 실행하게 해주는 것 [보안뉴스 문가용 기자] 한 보안 전문가가 알파인 리눅스(Alpine Lin

www.boannews.com

 

 

 

 

 


이미지 저장소

다른사람도 사용하게 하려면 

이미지 저장소를 사용해야합니다.

 

이미지 저장 명령어

$ docker login

$ docker push {ID}/example

$ docker pull {ID}/example

 

 

 

docker hub

docker hub로 가기

 

 

주의할 점은 유무료가 있는데

무료는 모든 사람들에게 공개입니다. 

중요한정보를 가지고 있을 시에

사용 할 수 있습니다. 

 

 

 

 

배포하기

컨테이너 실행 = 이미지 pull + 컨테이너 start

도커를 이용하면 손쉽게 배포가 가능해집니다. 

 

 


참고자료

🔗 - 인프런 - 초보를 위한 도커 안내서

🔗 - 인프런 - 따라하며 배우는 도커와 CI환경

 

 

 

 

728x90
반응형