Chạy 1 ứng dụng ruby cơ bản trên docker
Bài đăng này đã không được cập nhật trong 3 năm
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 \ndeb-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ả.
All rights reserved