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ả.