반응형
- 도커는 이미지를 만들기 위해 컨테이너의 상태를 그대로 저장하는 방법을 사용한다.
- 예를 들어, 어떤 애플리케이션을 이미지로 만든다면 리눅스만 설치된 컨테이너에 애플리케이션을 설치하고 그 상태를 그대로 이미지로 저장하는 방식이다.
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
참고
반응형
'Container > Docker' 카테고리의 다른 글
[Docker] docker 실행 시 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock." 에러 해결 방법 (0) | 2021.08.31 |
---|---|
[Docker] Dockerhub에 도커 이미지 배포하기 (0) | 2021.08.31 |
[Docker] Dockerfile 기본 명령어 (0) | 2021.08.31 |
[Docker] 도커 Docker / 컨테이너 Container /이미지 Image 란? (0) | 2021.08.31 |
[Docker] Docker run option 종류 (0) | 2021.08.31 |