도커 이미지
인프런 - 초보를 위한 도커 안내서 수강 중
도커 이미지란?
프로세스가 실행되는 파일들의 집합 또는 환경
이미지에는 두 가지 종류의 이미지가 있다
- Only Read: 읽기 전용
- Writable: 쓰기 가능
이미지 생성
이미지 과정
- 기본 이미지를 불러오기
- 실행시킨 컨테이너에서 수정
- 수정 사항을 새로운 이미지로 저장
- 새로운 Custom Image를 불러와 컨테이너로 실행시키면 수정 사항이 적용됨
빌드
docker build -t name/ubuntu:git01 .
docker build -t 이름/이미지이름:태그 .
.dockerignore
- .gitgnore과 비슷한 역할
- 도커 빌드 컨텍스트에서 지정된 패턴의 파일을 무시
Dockerfile 명령어
명령어 | 설명 |
---|---|
FROM | 베이스 이미지 지정 |
RUN | 쉘 명령어 실행 |
CMD | 컨테이너 기본 실행 명령어 (Entrypoint) |
EXPOSE | 오픈되는 포트 정보 |
ENV | 환경변수 설정 |
ADD | 파일 또는 디렉토리 추가. URL/ZIP 사용 가능 |
COPY | 파일 또는 디렉토리 추가 |
ENTRYPOINT | 컨테이너 기본 실행 명령어 |
VOLUME | 외부 마운트 포인트 생성 |
USER | RUN, CMD, ENTRYPOINT를 실행하는 사용자 |
WORKDIR | 작업 디렉토리 설정 |
ARGS | 빌드타임 환경변수 설정 |
LABEL | key-value 데이터 |
ONBUILD | 다른 빌드의 베이스로 사용될때 사용하는 명령어 |
Dockerfile 예시
FROM ununtu:latest
RUN apt-get update
RUN apt-get install -y git
이미지를 생성해서 컨테이너를 실행시키고 명령어를 입력하고 다시 이미지로 생성하는 작업을 Dockerfile을 이용해 바로 이미지를 생성할 수 있다
웹서버 이미지 생성하기
서버
app.js에 서버 코드 작성
// 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}`)
})
도커 파일 작성
# 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
도커 파일 - 최적화
# 1. node 이미지 사용
FROM node:16-alpine
# 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
node:16-alpine ➡️우분투 이미지를 가져와 node를 설치할 수도 있지만 불필요한 것들을 제외하고 node만 설치되어 있는 이미지를 가져와 메모리를 줄일 수 있다
.dockerignore
node_modules/*
node_modules 파일까지 올릴 필요는 없기 때문에 이미지 생성에서 제외한다
빌드 및 실행
docker build -t web
docker run --rm -d -p 3000:3000 web
도커파일 문법
FROM
- 베이스 이미지 지정
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
COPY
- 파일 또는 디렉토리 추가
COPY [--chown=<user>:<group>] <src>... <dest>
RUN
- 명령어 실행
RUN <command>
WORKDIR
- 작업 디렉토리 변경
WORKDIR /path/to/workdir
EXPOSE
- 컨테이너에서 사용하는 포트 정보
EXPOSE <PORT>
CMD
- 컨테이너 생성시 실행할 명령어
CMD ["executable","param1","param2"]
CMD command param1 param2
이미지 저장
도커 허브 로그인
docker login
태그 생성
docker tag {이미지명} {id}/{이미지명}:{tag명}
이미지 업로드
docker push {id}/{이미지명}:{tag명}
이미지 가져오기
docker pull {id}/{이미지명}:{tag명}
이미지 배포
docker run --rm -d -p 3000:3000 web
- dockerhub에 이미지를 올리는 순간 어떤 서버에서든 컨테이너를 실행할 수 있다
- 자연스레 배포가 완성되는 것
- node 설치, 환경 설정 등 필요 없음
[참조] 인프런 - 초보를 위한 도커 안내서
끝!