제육's 휘발성 코딩
Published 2022. 6. 21. 17:56
[Docker] 이미지 생성 및 배포 Infra
반응형

이미지란

도커는 계층 파일 시스템 기반으로, 이미지는 프로세스가 실행되는 파일들의 집합으로 볼 수 있다. 프로세스는 환경을 변경할 수 있으며, 이 환경을 저장해서 새로운 이미지를 만든다. 이미지 구성에는 AUFS, BTRFS, Overlayfs 등이 사용된다.

image

  • Base Image : 읽기 전용으로 해당 이미지를 변경할 수 없지만, 해당 내용에 추가적으로 변경할 수 있다.
  • Container : Git이 포함된 새로운 이미지로 Commit을 하게되면 새로운 이미지로 변경할 수 있다.

Git 설치

docker run -it --name git ubuntu:latest bash
apt-get update
apt-get install -y git
git --version
  • git이라는 이름의 컨테이너로 ubuntu의 최신버전을 생성하고 해당 컨테이너에 깃을 설치하자.

image

  • 커밋을 하고나면 새로운 git이라는 이미지가 생성된다.
docker run -it --name git2 ubuntu:git bash
  • 깃이 포함된 이미지를 기반으로 새로운 git2 컨테이너를 생성하면, 이 안에 깃이 포함되어 들어가있다.

도커 이미지 만들기

image

  • 도커이미지를 만들기위한 명령어는 다음과 같다. 해당 명령어를 사용하면 commit을 사용하지않고 build를 통해 생성할 수 있다.
  • 현재 디렉토리의 Dockerfile로 빌드한다.
    • -f Dockerfile 위치 옵션을 통해 다른 위치의 Dockerfile을 사용할 수 있다.
    • -t 명령어로 도커 이미지 이름을 지정한다. {네임스페이스}/{이미지이름}:{태그} 형식
  • 마지막에는 빌드 컨텍스트 위치를 지정한다.
    • . 은 현재 디렉토리를 의미한다. 필요한 경우 다른 디렉토리를 지정할 수 있다.

Dockerfile

imageimage

image

  • 다음과 같이 도커파일을 생성한 후 터미널에서 빌드해보자.

image

  • 빌드를 통해 새로운 우분투 이미지가 생성되었고, 도커파일에 설정한대로 git이 설치되어 있다.

Node js에서₩ 이미지 만들기

$ npm init
$ npm i fastify --save
// Require the framework and instantiate it
const fastify = require('fastify')({
    logger: true
  })
  // Declare a route
  fastify.get('/', function (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}`)
  })
  • 문서에 나와있는 hello 출력을 위한 app.js 를 생성 후 입력해보자.

image

  • 프로젝트 구조는 다음과 같다. 이후 터미널에서 node app.js 를 실행하면 localhost:3000 에 hello가 출력되는 것을 볼 수 있다.

Dockerfile

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

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

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

# 4. WEB 서버 실행 (Listen 포트 정의)
EXPOSE 3000
CMD node app.js
  • 애플리케이션을 이미지로 만들기 위해 도커파일을 생성하고 다음과 같이 실행하자.

.dockerignore

node_modules/*
  • 로컬 데이터는 전달하지 않기 위해 이그노어 설정을 하자.

이미지 빌드하기

$ docker build -t sasca/app .
  • sasca/app 이라는 이름으로 이미지를 만들고 빌드하자.

컨테이너 실행하기

$ docker run --rm -d -p 3000:3000 sasca/app

Docker file 추상화 하기

# 1. node 이미지 사용
FROM    node:14

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

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

# 4. WEB 서버 실행 (Listen 포트 정의)
EXPOSE 3000
CMD node app.js
  • 만들어진 버전 14의 노드 이미지를 바로 가져와서 사용할 수 있다. 즉, 불필요한 노드 설치를 할 필요가 없다. 도커에는 캐시 기능이 있다. 도커 파일의 변경사항이 없다면 재 빌드시 빠르게 된다.
# 1. node 이미지 사용
FROM    node:14

#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
  • 변경사항이 있는 경우 재 빌드 속도가 느리게 되는데 npm install을 먼저 처리하고, 그 다음에 소스를 복사하면 성능이 좋아진다.

alpine 이미지 사용

FROM    node:14-alpine
  • alpine 을 사용하면 불필요한 라이브러리 없이 node만 설치해서 용량을 줄일 수 있다.

image

  • alpine은 125MB, 기본은 900MB인 것을 확인할 수 있다.

도커 Hub

$ docker login
$ docker push {ID}/example
$ docker pull {ID}/example
  • https://hub.docker.com/ 도커 허브 로그인을 통해서 ID를 통해 이미지를 올려서 공유할 수 있다. 무료 버전의 경우 하나의 이미지를 제외하고 모든 이미지가 공유된다.
  • 도커 허브에 올리는 순간 어느 서버에서든지 이미지를 가져와서 사용할 수 있다. 즉, 배포가 된다.

REFERENCES

https://www.inflearn.com/course/%EB%8F%84%EC%BB%A4-%EC%9E%85%EB%AC%B8/dashboard

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^