출처 : A fast and easy Docker tutorial for beginners (video series) - freecodecamp
도커는 애플리케이션 뿐만 아니라 실행에 필요한 시스템 환경을 모아서 컨테이너(Container)로 관리합니다. 이렇게 만든걸 Docker Image라고 한다. 이 Image로 만든 컨테이너는 도커가 설치된 어디든 똑같이 동작합니다.
출처 : https://programmaticponderings.files.wordpress.com/2015/06/introdockercompose.png
커밋(from 개발자) -> Jenkins CI -> Docker Image로 빌드 -> Image repository에서 이미지를 버전별로 관리
해당 이미지를 어느 환경이든 배포만 하면 독립적으로 동작하기 때문에 CD ( Continuous Deployment )가 가능합니다.
주요 클라우드 프로바이더들은 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공
출처 : https://aws.amazon.com/ko/containers/
도커 컨테이너는 도커 이미지로부터 만들어집니다.
도커는 애플리케이션과 실행에 필요한 라이브러리, 미들웨어, OS, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지로 만듭니다.
도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만, 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수도 있습니다.
docker build 명령은 Dockerfile을 이용해서 이미지를 만드는 작업을 함.
https://sungwookkang.com/1304
보통 이미지에는 하나의 애플리케이션만 넣고 여러 컨테이너를 조합해서 서비스를 구축하는 방법을 사용합니다. 또한 이미지를 여러 개 같이 사용할 수 도 있습니다. 예를 들어, CentOS 리눅스 이미지와 NginX 웹 서버 이미지를 겹쳐서 새로운 이미지를 만들 수 있습니다.
출처 : https://docs.docker.com/engine/docker-overview/#docker-architecture
도커 레지스트리 ( docker registry ) : 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리라고 합니다. 대표적으로는 Docker Hub이 있습니다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있습니다.
이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있습니다. 내가 만든 애플리케이션 또한 이미지를 만들어서 업로드하고 공유할 수 있습니다. Github와 같은 형상 관리툴과 연동해서 Dockerfile을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능합니다.
출처 : https://aws.amazon.com/ko/ecr/
퍼블릭 클라우드에서는 비공개 레지스트리와 CI/CD를 쉽게 구성할 수 있는 아키텍쳐를 제공합니다.
도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킵니다. 하나의 이미지를 가지고 여러 개의 컨테이너를 만들어 낼 수도 있습니다. 도커는 컨테이너를 생성하고 관리하기 위한 여러 명령을 제공합니다.
도커는 빌드한 이미지를 쉽게 공유할 수 있다는 장점이 있음. 도커에서는 공식 저장소를 제공함.
https://www.44bits.io/ko/post/running-docker-registry-and-using-s3-storage
도커 레지스트리는 도커 이미지를 공유하기 위한 서버 애플리케이션.
도커 이미지 빌드를 위한 Dockerfile을 github 저장소에서 제공하고 있음. 그리고 Dockerfile로 빌드된 이미지를 도커 공식 저장소에서 제공함.
docker pull 명령어를 통해 공식 저장소에서 도커 레지스트리 이미지의 최신 버전을 받아옴.
Dockerfile을 만들고 스크립트 넣음.
레퍼런스 : 도커 Docker 기초 확실히 다지기 - futurecreator.github.io
Dockerfile은 Docker를 실행할때 사용하는 이미지파일을 생성하는 Docker이미지 생성파일입니다.
Dockerfile의 결과로 Docker image가 생성되고 그 Docker image로 docker run
명령어를 통해 도커 컨테이너를 구성할 수 있습니다.
## COPY <호스트OS 파일 경로> <Docker 컨테이너 안에서의 경로>
COPY test.sh /root/copy/test.sh
COPY의 경우 호스트OS에서 컨테이너 안으로 복사만 가능하지만, ADD의 경우 원격 파일 다운로드 또는 압축 해제 등과 같은 기능을 갖고 있습니다. 즉, 호스트OS에서 컨테이너로 단순히 복사만을 처리할 때 COPY를 사용 합니다.
## ADD <다운 받을 URL> <Docker 컨테이너 안에서의 경로>
ADD http://~~~~~~/index.php /root/add_url/index.php
ARG로 환경변수를 쓸 수 없음. Docker build 전까지만 사용되는 변수이기 때문임.
도커 명령을 실행할 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
멀티 스테이지가 빌드가 뭔가?
빌드환경 이미지와 실행환경 이미지를 분리할 수 있고,
빌드환경 이미지에 실행환경 이미지를 넣을 수 있는 기능
예를 들어, 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로 복사합니다.
https://medium.com/@chzbrgr71/docker-multi-stage-builds-size-matters-e71ae0f08ae8
https://docs.docker.com/develop/develop-images/multistage-build/