본문 바로가기
Container/Docker

[Docker] 도커 이미지 만들기 / Dockerfile

by @__100.s 2021. 8. 30.
반응형

  • 도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 저장하는 방법을 사용한다.
  • 예를 들어, 어떤 애플리케이션을 이미지로 만든다면 리눅스만 설치된 컨테이너에 애플리케이션을 설치하고 그 상태를 그대로 이미지로 저장하는 방식이다.

Sinatra 웹 애플리케이션 샘플

  • Ruby로 만들어진 간단한 웹 어플리케이션 도커라이징 Dockerizing (=도커 이미지를 만듦)하기

Ruby 3.0.0 에서 이미지 생성하기

  • 루비 컨테이너를 시작한다.

  • it -d 옵션은 Ruby 컨테이너가 백그라운드에서 실행되도록한다.

  • Sinatra는 기본적으로 포트 번호 4567을 사용하여 통신하므로 -p를 사용하여 컨테이너 포트 번호 4567을 호스트 포트 번호 4567에 할당한다.

  • —name을 사용하여 컨테이너 sinatra_test 이름을 지정해주었다.

    docker container run -it -d -p 4567:4567 --name sinatra_test ruby:latest
    Unable to find image 'ruby:latest' locally
    ...
    d4f1f93f0c61eb98d1007f2012e3d4d5225e9d3996e809c609be1ab6e1586169
  • app.rb 파일을 생성한다.

    mkdir sinatra_test
    cd sinatra_test
    ~/sinatra_test$ touch app.rb

    app.rb

    require 'sinatra'
    require 'socket'
    
    get '/' do
      Socket.gethostname #호스트명 출력
    end
  • sinatra_test 컨테이너에 app.rb를 복사해준다.

    docker container cp app.rb sinatra_test:/
    docker container exec -it sinatra_test bash
  • Sinatra 를 설치한다.

    root@d7f10ecf7dd::/# gem install sinatra
  • app.rb를 실행하여 웹 응용프로그램을 시작한다.

    root@d7f10ecf7dd::/# ruby app.rb -o 0.0.0.0
  • 다음과 같은 오류가 발생하였다. 루비 3.0.0에서 Ruby 2.7의 표준 구성으로 연결된 webrick이라는 응용 프로그램 서버의 라이브러리가 제거되었기 때문에 서버가 시작되지 않은 것이다.

    /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1755:in `detect_rack_handler': Server handler (thin,puma,reel,HTTP,webrick) not found. (RuntimeError)
    from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1493:in `run!'
    from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>'
  • webrick을 설치해준다.

    root@d7f10ecf7dd::/# gem install webrick
  • webrick 이 설치되었다면 app.rb를 실행한다.

    root@d7f10ecf7dd:[2021-08-30 11:00:09] INFO  WEBrick 1.7.0
    [2021-08-30 11:00:09] INFO  ruby 3.0.2 (2021-07-07) [x86_64-linux]
    == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
    [2021-08-30 11:00:09] INFO  WEBrick::HTTPServer#start: pid=32 port=4567:/# ruby myapp.rb -o 0.0.0.0

    안전하게 실행되었다!

Ruby Application Dockerfile

  • 도커는 이미지를 만들기 위해 Dockerfile이라는 이미지 빌드용 DSLDomain Specific Language 파일을 사용한다.

  • 단순 텍스트 파일로 일반적으로 소스와 함께 관리한다.

  • 새로운 폴더(sinatra_test)를 만들고 Gemfile 과 app.rb, Dockerfile을 만든다.

    mkdir sinatra_test
    cd sinatra_test

    Gemfile

    source 'https://rubygems.org'
    gem 'sinatra'

    app.rb

    require 'sinatra'
    require 'socket'
    
    get '/' do
      Socket.gethostname #호스트명 출력
    end

    Dockerfile

    # 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
    FROM       ubuntu:16.04
    MAINTAINER subicura@subicura.com
    RUN        apt-get -y update
    
    # 2. ruby 설치
    RUN apt-get -y install ruby
    RUN gem install bundler
    
    # 3. 소스 복사
    COPY . /usr/src/app
    
    # 4. Gem 패키지 설치 (실행 디렉토리 설정)
    WORKDIR /usr/src/app
    RUN     bundle install
    
    # 5. Sinatra 서버 실행 (Listen 포트 정의)
    EXPOSE 4567
    CMD    bundle exec ruby app.rb -o 0.0.0.0
    • Dockerfile을 만든 디렉토리로 이동하여 다음 명령어를 입력한다.
    • -t (—tag) 옵션으로 생성할 이미지의 이름을 지정한다.
    docker build -t app .
    • 빌드 명령어를 실행하면 Dockerfile에 정의한 내용이 한 줄 한 줄 실행되는 걸 볼 수 있다. Successfully built 메시지를 통해 이미지 생성이 완료된 것을 알 수 있다.
    Sending build context to Docker daemon 22.02 kB
    Step 1/10 : FROM ubuntu:16.04
     ---> f49eec89601e
    Step 2/10 : MAINTAINER subicura@subicura.com
     ---> Running in 06f20ac1017d
     ---> fc41cd8ac52d
    Removing intermediate container 06f20ac1017d
    Step 3/10 : RUN apt-get -y update
     ---> Running in c35738e75a51
    Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
    Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
    Get:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
    Get:4 http://archive.ubuntu.com/ubuntu xenial/main Sources [1103 kB]
    Get:5 http://archive.ubuntu.com/ubuntu xenial/restricted Sources [5179 B]
    
    ... 생략 ...
    
    Step 9/10 : EXPOSE 4567
     ---> Running in 9c514a1f0c8e
     ---> c5ce4376282e
    Removing intermediate container 9c514a1f0c8e
    Step 10/10 : CMD bundle exec ruby app.rb -o 0.0.0.0
     ---> Running in 1f7a9ba8d63c
     ---> 54d239c00f11
    Removing intermediate container 1f7a9ba8d63c
    Successfully built 54d239c00f11
    docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    app                 latest              54d239c00f11        4 minutes ago       209 MB
    ubuntu              16.04               f49eec89601e        2 weeks ago         129 MB
  • 컨테이너를 실행하여 이미지가 정상적으로 동작하는지 확인한다.

    docker run -d -p 8080:4567 app

참고

반응형