컨테이너를 사용하여 응용 프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설꼐된 도구 이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계 입니다.
컨테이너 안에 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다.
코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 켬퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어 표준 단위이다.
- 이미지의 인스턴스
코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지입니다. 컨테이너 이미지는 런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.
- 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있습니다.
- 이미지는 시작시 실행 될 명령어와 파일 스냅샷을 가지고 있다.
docker image를 만들기 위한 설정파일입니다. 컨테이너가 어떻게 행동해야하는지 설정들을 정의합니다.
FROM
베이스 이미지
이미지 생성시 기반이 되는 이미지 레이어.
WORKDIR
- 작업 디렉토리를 지정한다.
- 해당 디렉토리가 없으면 새로 생성한다.
- 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
- 이미지안에서 어플리케이션 소스 코드를 가지고있는 디렉토리를 생성합니다.
COPY
- 파일이나 폴더를 이미지에 복사한다.
- 로컬에서 도커 컨테이너로 복사한다.
RUN
- 도커 이미지가 생성되기 전에 수행할 쉘 명령어
- 추가적으로 필요한 파일 다운 받기 위한 명령어 명시
CMD
- 컨테이너가 시작되었을 떄 실행할 실행 파일 또는 쉘 스크립트
- 해당 명령어는 docker file 내 1회만 사용가능
베이스 이미지에서 다른 종속성이나 새로운 커맨드를 추가 할때는 임시 컨테이너를 만들 후 그 컨테이너를 토대로 새로운 이미지를 만들고 임시 컨테이너를 지운다.
// 이미지를 빌드할 때 쓰일 도커 파일을 지정해준다.
docker build -f Dockerfile.dev .
예시
FROM node:alpine AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "run", "build"]
FROM nginx
EXPOSE 3000
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
# mysql 이미지를 사용 기본 설정을 변경하는 경우
FROM mysql:5.7
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
#nginx 이미지를 사용 기본 설정을 적용하는 경우
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf
공통점
차이점
도커
VM
docker rm docker ps -a -q'
다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구입니다.
멀티 컨테이너 상황에서 쉽게 네트워크를 연결 시켜주기 위해서
dokcer compose
를 이용한다.
//이미지를 빌드하기만 하며, 컨테이너를 시작하지는 않는다
docker-compose build
//이미지가 존재하지 않을경우에만 빌드하며, 컨테이너를 시작한다.
docker-compose up
//필요치 않을때도 강제로 이미지를 빌드하며, 컨테이너를 시작한다.
docker-compose up --build
//이미지 빌드 없이 컨테이너를 시작한다. 이미지가 없으면 실패한다.
docker-compose up --no-build
//docker compose로 실행시킨 컨테이너를 종료한다.
dokcer-compose down
예시
version: "3"
services:
#컨테이너 이름
react:
#dockerfile 지정
build:
context: .
dockerfile: Dockerfile.dev
#
ports:
- "4000:3000"
#로컬 머신에 있는 파일 매핑
volumes:
- /usr/src/app/node_modules
- ./:/usr/src/app
stdin_open: true
#컨테이너 이름
tests:
#dockerfile 지정
build:
context: .
dockerfile: Dockerfile.dev
#로컬 머신에 있는 파일 매핑
volumes:
- /usr/src/app/node_modules
- ./:/usr/src/app
#컨테이너 시작시 실행되는 명령어
command: ["npm", "run", "test"]
no : 재시작 안함
always : 항상 재시작
on-failure : on-failure 에러 코드와 함께 컨테이너가 멈출 때만 재시작
unless-stopped : 개발자가 임의로 멈추려고 할 때를 제외하고 항상 재시작
version: "3"
services:
nginx:
restart: always
build:
context: ./nginx
dockerfile: Dockerfile
- 이미지로 컨테이너를 생성
- 이미지는 컨테이너 생성후 읽기 전용
- 컨테이너 안에서의 변화
- 변화된 데이터를 컨테이너 안에 저장
- 컨테이너 삭제시 컨테이너 안에 저장된 데이터도 함께 삭제된다.