FROM <image>:<tag>
FROM ubuntu:16.04
MAINTAINER <name>
MAINTAINER anna@anna.com
COPY <src>... <dest>
COPY . /usr/src/app
ADD <src>... <dest>
ADD . /usr/src/app
RUN <command>
RUN ["executable", "param1", "param2"]
RUN bundle install
CMD ["executable","param1","param2"]
CMD command param1 param2
CMD bundle exec ruby app.rb
WORKDIR /path/to/workdir
EXPOSE <port> [<port>...]
EXPOSE 4567
VOLUME ["/data"]
ENV <key> <value>
ENV <key>=<value> ...
ENV DB_URL mysql
ARG <key>=<value>
ARG myAddress = anna.com
자세한 내용은 공식문서를 참고하자.
# 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
FROM ubuntu
MAINTAINER anna@anna.com
RUN apt-get -y update
# 2. ruby 설치
RUN apt-get -y install ruby
RUN gem install bundler
# 3. 소스 복사
COPY . /usr/src/app
# Gem 패키지 설치
WORKDIR /usr/src/app
RUN bundle install
RUN bundle add rackup
# 5. Sinatra 서버 실행 (Listen 포트 정의)
EXPOSE 4567
CMD bundle exec ruby app.rb -o 0.0.0.0
지난 게시물 → [Docker] Docker 이미지 만들고 컨테이너 생성하기
지난번에 간단한 웹 어플리케이션을 이미지로 만들기 위해 Dockerfile을 작성하고 컨테이너를 생성해보았다. 위 코드는 그때 작성한 Dockerfile 이다.
이 Dockerfile을 참고해서 도커파일의 빌드 과정을 알아보자.
Sending build context to Docker daemon 5.12 kB <-- (1)
Step 1/10 : FROM ubuntu <-- (2)
---> f49eec89601e <-- (3)
Step 2/10 : MAINTAINER anna@anna.com <-- (4)
---> Running in f4de0c750abb <-- (5)
---> 4a400609ff73 <-- (6)
Removing intermediate container f4de0c750abb <-- (7)
Step 3/10 : RUN apt-get -y update <-- (8)
...
...
Successfully built 20369cef9829 <-- (9)
위는 도커파일을 빌드하면 출력되는 로그들 이다.
한줄한줄 뜯어서 봐보자
(1) Sending build context to Docker daemon 5.12 kB
(2) Step 1/10 : FROM ubuntu
(3) ---> f49eec89601e
(4) Step 2/10 : MAINTAINER anna@anna.com
(5) ---> Running in f4de0c750abb
f49eec89601e
이미지를 기반으로 f49eec89601e
”컨테이너를 임시로 생성하여 실행”한다.(6) ---> 4a400609ff73
(7) Removing intermediate container f4de0c750abb
(8) Step 3/10 : RUN apt-get -y update
(9) Successfully built 20369cef9829
도커 빌드는 임시 컨테이너 생성
> 명령어 수행
> 이미지로 저장
> 임시 컨테이너 삭제
> 새로 만든 이미지 기반 임시 컨테이너 생성
> 명령어 수행
> 이미지로 저장
> 임시 컨테이너 삭제
> … 의 과정을 계속해서 반복한다.
명령어를 실행할 때마다 이미지 레이어를 저장하고 다시 빌드할 때 Dockerfile이 변경되지 않았다면 기존에 저장된 이미지를 그대로 캐시처럼 사용한다.
이러한 레이어 개념을 잘 이해하고 있어야 최적화된 이미지를 생성할 수 있다.
# 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
FROM ubuntu
MAINTAINER anna@anna.com
RUN apt-get -y update
# 2. ruby 설치
RUN apt-get -y install ruby
RUN gem install bundler
# 3. 소스 복사
COPY . /usr/src/app
# Gem 패키지 설치
WORKDIR /usr/src/app
RUN bundle install
RUN bundle add rackup
# 5. Sinatra 서버 실행 (Listen 포트 정의)
EXPOSE 4567
CMD bundle exec ruby app.rb -o 0.0.0.0
사실 앞서 만들었던 이미지에는 몇가지 최적화 문제가 있다.
이를 Dockerfile 수정을 통해 최적화를 해보자.
ubuntu
를 베이스로 만들었지만 사실은 더 간단한 ruby 베이스 이미지가 존재한다.진작 알려줬으면 .. 그고생은 …
# before
FROM ubuntu
MAINTAINER anna@anna.com
RUN apt-get -y update
RUN apt-get -y install ruby
RUN gem install bundler
# after
FROM ruby:3.0
MAINTAINER anna@anna.com
COPY . /usr/src/app # <- 소스파일이 변경되면 캐시가 깨짐
WORKDIR /usr/src/app
RUN bundle install # 패키지를 추가하지 않았는데 또 인스톨하게 됨 ㅠㅠ
COPY Gemfile* /usr/src/app/ # Gemfile을 먼저 복사함
WORKDIR /usr/src/app
RUN bundle install # 패키지 인스톨
COPY . /usr/src/app # <- 소스가 바꼈을 때 캐시가 깨지는 시점 ^0^
# before
RUN apt-get -y update
# after
RUN apt-get -y -qq update
-qq
옵션으로 로그를 출력하지 않게 한다.quite
옵션이 있으니 적절하게 적용하자.# before
RUN bundle install
# after
RUN bundle install --no-rdoc --no-ri
--no-doc
과 --no-ri
옵션으로 필요 없는 문서를 생성하지 않아 이미지 용량도 줄이고 빌드 속도도 더 빠르게 할 수 있다.# before
RUN apt-get -y -qq update
RUN apt-get -y -qq install ruby
# after
RUN apt-get -y -qq update && \
apt-get -y -qq install ruby
# 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
FROM ruby:3.0
MAINTAINER anna@anna.com
COPY Gemfile* /usr/src/app/
WORKDIR /usr/src/app
RUN bundle install --no-rdoc --no-ri
COPY . /usr/src/app
EXPOSE 4567
CMD bundle exec ruby app.rb -o 0.0.0.0
다음에는 도커허브에 대해 간단히 알아보고 배포에 대해서 간단히 알아보자.
📎 참고 링크
https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html