도커 스터디

노요셉·2019년 12월 16일
0

docker

image.png
출처 : A fast and easy Docker tutorial for beginners (video series) - freecodecamp

도커는 애플리케이션 뿐만 아니라 실행에 필요한 시스템 환경을 모아서 컨테이너(Container)로 관리합니다. 이렇게 만든걸 Docker Image라고 한다. 이 Image로 만든 컨테이너는 도커가 설치된 어디든 똑같이 동작합니다.

image.png
출처 : https://programmaticponderings.files.wordpress.com/2015/06/introdockercompose.png

커밋(from 개발자) -> Jenkins CI -> Docker Image로 빌드 -> Image repository에서 이미지를 버전별로 관리

해당 이미지를 어느 환경이든 배포만 하면 독립적으로 동작하기 때문에 CD ( Continuous Deployment )가 가능합니다.

주요 클라우드 프로바이더들은 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공

  • Amazon Elastic Container Service
  • Microsoft Azure Container Instances
  • Google Cloud Platform Kubernetes Engine

도커의 기능

build - 이미지 만들기

image.png
출처 : https://aws.amazon.com/ko/containers/

도커 컨테이너는 도커 이미지로부터 만들어집니다.

도커는 애플리케이션과 실행에 필요한 라이브러리, 미들웨어, OS, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지로 만듭니다.
도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만, 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수도 있습니다.

docker build 명령은 Dockerfile을 이용해서 이미지를 만드는 작업을 함.
https://sungwookkang.com/1304

보통 이미지에는 하나의 애플리케이션만 넣고 여러 컨테이너를 조합해서 서비스를 구축하는 방법을 사용합니다. 또한 이미지를 여러 개 같이 사용할 수 도 있습니다. 예를 들어, CentOS 리눅스 이미지와 NginX 웹 서버 이미지를 겹쳐서 새로운 이미지를 만들 수 있습니다.

image.png
출처 : https://docs.docker.com/engine/docker-overview/#docker-architecture

도커 레지스트리 ( docker registry ) : 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리라고 합니다. 대표적으로는 Docker Hub이 있습니다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있습니다.

이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있습니다. 내가 만든 애플리케이션 또한 이미지를 만들어서 업로드하고 공유할 수 있습니다. Github와 같은 형상 관리툴과 연동해서 Dockerfile을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능합니다.

image.png
출처 : https://aws.amazon.com/ko/ecr/

퍼블릭 클라우드에서는 비공개 레지스트리와 CI/CD를 쉽게 구성할 수 있는 아키텍쳐를 제공합니다.

  • Amazon Elastic Container Registry
  • GCP의 Container Registry

Run - 컨테이너 동작

도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킵니다. 하나의 이미지를 가지고 여러 개의 컨테이너를 만들어 낼 수도 있습니다. 도커는 컨테이너를 생성하고 관리하기 위한 여러 명령을 제공합니다.

도커를 구성하는 컴포넌트

image.png
출처 : http://kimstar.kr/7695/

  • Docker Engine : 도커 이미지를 생성하고 컨테이너를 실행하는 핵심 기능.
  • Docker Registry : 도커 이미지 공개 및 공유. 도커 허브도 도커 레지스트리를 사용.
  • Docker Compose : 여러 컨테이너를 관리하기 위한 툴.
  • Docker Machine : 로컬의 VirtualBox 나 퍼블릭 클라우드에 도커 실행 환경을 구축하는 툴.
  • Docker Swarm : 여러 도커 호스트를 마스터(Master)와 노드(Node) 구조로 클러스터화하는 툴. 쿠버네티스와 비슷한 기능.

도커 레지스트리

도커는 빌드한 이미지를 쉽게 공유할 수 있다는 장점이 있음. 도커에서는 공식 저장소를 제공함.
https://www.44bits.io/ko/post/running-docker-registry-and-using-s3-storage

도커 레지스트리는 도커 이미지를 공유하기 위한 서버 애플리케이션.

도커 이미지 빌드를 위한 Dockerfile을 github 저장소에서 제공하고 있음. 그리고 Dockerfile로 빌드된 이미지를 도커 공식 저장소에서 제공함.

도커 레지스트리 설치

docker pull 명령어를 통해 공식 저장소에서 도커 레지스트리 이미지의 최신 버전을 받아옴.

도커 레지스트리 실행 ( 레지스트리 서버가 실행됌 )

도커 레지스트리 사용하기

도커 이미지 만들기

Dockerfile을 만들고 스크립트 넣음.

도커 레지스트리에 생성한 도커 이미지 push 하기

도커 레지스트리에 Pull 받아 실행하기

레퍼런스 : 도커 Docker 기초 확실히 다지기 - futurecreator.github.io

Dockerfile 생성

Dockerfile은 Docker를 실행할때 사용하는 이미지파일을 생성하는 Docker이미지 생성파일입니다.
Dockerfile의 결과로 Docker image가 생성되고 그 Docker image로 docker run 명령어를 통해 도커 컨테이너를 구성할 수 있습니다.

COPY 명령어

## COPY <호스트OS 파일 경로> <Docker 컨테이너 안에서의 경로>
COPY test.sh /root/copy/test.sh

COPY의 경우 호스트OS에서 컨테이너 안으로 복사만 가능하지만, ADD의 경우 원격 파일 다운로드 또는 압축 해제 등과 같은 기능을 갖고 있습니다. 즉, 호스트OS에서 컨테이너로 단순히 복사만을 처리할 때 COPY를 사용 합니다.

ADD 명령어

## ADD <다운 받을 URL> <Docker 컨테이너 안에서의 경로>
ADD http://~~~~~~/index.php /root/add_url/index.php

ENV, ARG

ARG로 환경변수를 쓸 수 없음. Docker build 전까지만 사용되는 변수이기 때문임.

WORKDIR

도커 명령을 실행할 path에 DockerFile와 Dockerizing 하려는 코드들이 존재할 겁니다.

WORKDIR은 컨테이너 안에 작업 디렉토리를 결정하는거에요.
WORKDIR /usr/src/app 으로 지정한다면

Dockerfile에 명령어들이 실행되는 Path가 /usr/src/app가 된다고 보시면 됩니다.

# /usr/src/app 폴더를 WORKDIR로 지정
WORKDIR /usr/src/app

# package 복사
COPY package.json ./
COPY yarn.lock ./

위에 나온 COPY 명령과 같이 쓰이는건데요. WORKDIR이 /usr/src/app이 되었으니, docker 명령을 실행하는 host path에 package.json, yarn.lock 파일이 컨테이너의 /usr/src/app로 복사될 것입니다.

레퍼런스: https://nirsa.tistory.com/69
Node.js 프로젝트를 Docker로 배포하기 - https://medium.com/extales/node-js-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-docker%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-2-cfff76ebae7e


Multi stage

멀티 스테이지가 빌드가 뭔가?

빌드환경 이미지와 실행환경 이미지를 분리할 수 있고,
빌드환경 이미지에 실행환경 이미지를 넣을 수 있는 기능

예를 들어, Dockerfile

# build 이미지
FROM golang:1.8.4-jessie as builder

# install package
WORKDIR /go/src/github.com/asashiho/greet
RUN go get -d -v github.com/urfave/cli

# build modules
COPY main.go .
RUN GOOS=linux go build -a -o greet .

# Production Image
FROM busybox
WORDIR /opt/greet/bin

# Deploy modules
COPY --from=builder /go/src/github.com/asashiho/greet/ .
ENTRYPOINT ["./greet"]

빌드 환경용 Docker 이미지
go1.8.4를 베이스 이미지로 하여 builder라는 별명을 붙입니다.
그리고 개발에 필요한 버전을 설치하여 로컬환경에 있는 소스코드를 go build 명령으로 빌드하여 greet 이라는 실행 가능 바이너리 파일을 작성합니다.

실행 환경용 Docker Image로는 busybox를 사용합니다. BusyBox는 기본적으로 Linux 명령들을 하나의 파일로 모아놓은 것으로, 최소한으로 필요한 Linux 쉘 환경을 제공하는 경우 이용합니다.
그 다음 빌드 환경의 Docker Image로 빌드한 greet이란 이름을 실행 가능 바이너리 파일을 실행환경 Docker image로 복사합니다.

그럼 mutli-staged build에서 얻는 이득이 뭘까?

https://medium.com/@chzbrgr71/docker-multi-stage-builds-size-matters-e71ae0f08ae8

https://docs.docker.com/develop/develop-images/multistage-build/

레퍼런스: https://kimjingo.tistory.com/64?category=944803

profile
서로 아는 것들을 공유해요~

0개의 댓글