12/08/2018, 13:56

Chạy 1 ứng dụng ruby cơ bản trên docker

Hôm nay mình sẽ giới thiệu với các bạn 1 bài viết đơn giản để cấu hình 1 server đơn giản chạy 1 app nhỏ ruby trên docker. Các phần cần chuẩn bị: images chạy nginx images chạy ruby Trong bài viết này mình sẽ tự cài images bằng Dockerfile. 1.Trước hết chúng ta sẽ tạo images chạy ruby Đây ...

Hôm nay mình sẽ giới thiệu với các bạn 1 bài viết đơn giản để cấu hình 1 server đơn giản chạy 1 app nhỏ ruby trên docker. Các phần cần chuẩn bị:

  • images chạy nginx
  • images chạy ruby

Trong bài viết này mình sẽ tự cài images bằng Dockerfile.

1.Trước hết chúng ta sẽ tạo images chạy ruby

Đây là nội dung Dockerfile cho ruby

FROM cuongtv/ubuntu:14.04

#install ruby
RUN apt-get -y update && apt-get install -y git-core 
	curl 
	zlib1g-dev 
	build-essential 
	libssl-dev 
	libreadline-dev 
	libyaml-dev 
	libsqlite3-dev 
	sqlite3 
	libxml2-dev 
	libxslt1-dev 
	libcurl4-openssl-dev 
	python-software-properties 
	libffi-dev 
	libgdbm-dev 
	libncurses5-dev 
	automake 
	libtool 
	procps 
	bison
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
RUN curl -sSL https://get.rvm.io | bash -s stable
ENV PATH /usr/local/rvm/bin:$PATH
RUN rvm install 2.3.1

#install rails
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN sudo apt-get update && apt-get install -y nodejs
ENV PATH /usr/local/rvm/rubies/ruby-2.3.1/bin:$PATH
RUN gem install rails -v 4.2.6

Ta sẽ bắt đầu với OS là ubuntu 14.04. và cài đặt ruby 2.3.1 qua rvm. Phần rails các bạn không cần bắt buộc phải cài, ở đây mình cài thêm để khi cần thiết có thể sử dụng luôn.

Tạo xong dockerfile, mình sẽ build 1 images tên ruby_2.3.1:

docker build -t ruby_2.3.1 .

2.Ok vậy là xong phần images cho ruby. ta tiếp tục với images cho nginx

Dockerfile cho nginx:

FROM cuongtv/ubuntu:14.04

#install necessary package
RUN apt-get update && apt-get install -y wget && echo "deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx 
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx" >> /etc/apt/sources.list.d/nginx.list && wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

#install nginx 1.11
RUN apt-get update && apt-get install -y nginx

#expose port
EXPOSE 80
#EXPOSE 443

CMD ["nginx","-g","daemon off;"]

#remove default config nginx
RUN rm -rf /etc/nginx/conf.d/default.conf

#copy file config from host
COPY default.conf /etc/nginx/conf.d/

Mình cũng bắt đầu với Ubuntu 14.04. và mình cài nginx theo version mới nhất 1.11.4 tại thời điểm hiện tại.

Vì bản thân khi cài nginx sẽ có file config mặc định nên mình sẽ remove file mặc định đi và add vào file config của cá nhân:

RUN rm -rf /etc/nginx/conf.d/default.conf

COPY default.conf /etc/nginx/conf.d/

nội dung file config của mình:

upstream app {
              server ruby:4567;
        }
server {
    listen 80;

#    error_page 404 /404;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
	    proxy_redirect off;
        proxy_pass http://app;
    }
}

File này sẽ gọi tới container chạy ruby qua cổng 4567.

ok. giờ đã có Dockerfile, ta sẽ build images:

docker build -t nginx_ruby .

3. Kết nối nginx và ruby

Trước hết mình sẽ chuẩn bị 1 file ruby đơn giản cuongtv.rb để chạy web:

require 'sinatra'

get '/' do
  "Cuongtv!"
end

Để chạy ruby trên web thì cần install sinatra. Mình sẽ viết 1 file Dockerfile để build tiếp từ images ruby_2.3.1 vừa create.

From ruby_2.3.1

#add current folder to /code in container
ADD . /code

#work directory
WORKDIR /code

#install sinatra
RUN gem install sinatra

Và kết nối nginx và ruby qua docker-compose. Đây là file docker-compose.yml

version: '2'
services:
#create container nginx
  nginx:
    image: nginx_ruby
    depends_on:
     - ruby
    ports:
     - "80:80"

#create container ruby
  ruby:
    build: /ruby
    command: ruby -rubygems ruby/cuongtv.rb -o 0.0.0.0
    ports:
     - "4567"
    volumes:
     - .:/code

Start container:

docker-compose up -d

Kiểm tra các container đã được up:

docker-compose ps
       Name                      Command               State            Ports
--------------------------------------------------------------------------------------
composetest_nginx_1   nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
composetest_ruby_1    ruby -rubygems cuongtv.rb  ...   Up      0.0.0.0:32775->4567/tcp

Kiểm tra lại các port đang mở:

netstat -ntap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      943/sshd
tcp        0    404 10.0.1.129:22           192.168.0.150:64133     ESTABLISHED 2466/sshd: cuongtv
tcp        0      0 10.0.1.129:22           192.168.1.150:60092     ESTABLISHED 32354/sshd: cuongtv
tcp        0      0 10.0.1.129:22           192.168.1.150:62581     ESTABLISHED 358/sshd: cuongtv [
tcp6       0      0 :::80                   :::*                    LISTEN      1213/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      943/sshd
tcp6       0      0 :::32775                :::*                    LISTEN      1126/docker-proxy

ok. chúng ta có thể connect tới http://<IP_host> để kiểm tra kết quả.

Screenshot_13.png

0