반응형
이미지란
도커는 계층 파일 시스템 기반으로, 이미지는 프로세스가 실행되는 파일들의 집합으로 볼 수 있다. 프로세스는 환경을 변경할 수 있으며, 이 환경을 저장해서 새로운 이미지를 만든다. 이미지 구성에는 AUFS, BTRFS, Overlayfs 등이 사용된다.
- 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의 최신버전을 생성하고 해당 컨테이너에 깃을 설치하자.
- 커밋을 하고나면 새로운 git이라는 이미지가 생성된다.
docker run -it --name git2 ubuntu:git bash
- 깃이 포함된 이미지를 기반으로 새로운 git2 컨테이너를 생성하면, 이 안에 깃이 포함되어 들어가있다.
도커 이미지 만들기
- 도커이미지를 만들기위한 명령어는 다음과 같다. 해당 명령어를 사용하면 commit을 사용하지않고 build를 통해 생성할 수 있다.
- 현재 디렉토리의 Dockerfile로 빌드한다.
- -f Dockerfile 위치 옵션을 통해 다른 위치의 Dockerfile을 사용할 수 있다.
- -t 명령어로 도커 이미지 이름을 지정한다. {네임스페이스}/{이미지이름}:{태그} 형식
- 마지막에는 빌드 컨텍스트 위치를 지정한다.
.
은 현재 디렉토리를 의미한다. 필요한 경우 다른 디렉토리를 지정할 수 있다.
Dockerfile
- 공식 문서는 https://docs.docker.com/engine/reference/builder/ 를 참고하자.
- 다음과 같이 도커파일을 생성한 후 터미널에서 빌드해보자.
- 빌드를 통해 새로운 우분투 이미지가 생성되었고, 도커파일에 설정한대로 git이 설치되어 있다.
Node js에서₩ 이미지 만들기
$ npm init
$ npm i fastify --save
- fastify를 사용해서 이미지를 만들어보자.
- fastify 문서 링크 https://www.fastify.io/docs/latest/Getting-Started/
// 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
를 생성 후 입력해보자.
- 프로젝트 구조는 다음과 같다. 이후 터미널에서
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만 설치해서 용량을 줄일 수 있다.
- 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
반응형