Viblo CTF
+1

Thiết lập docker với remote API và ruby

Docker là gì

Thời gian gần đây có rất nhiều bài viết công nghệ đề cập đến Docker. Vậy Docker là gì và tại sao nó hữu ích. Có lẽ cũng nhiều người đã biết đến khái niệm docker, ta cùng sơ qua một số khái niệm về docker.

Image

  • Docker là một công cụ tạo môi trường được "đóng gói" (còn gọi là Container) trên máy tính mà không làm tác động tới môi trường hiện tại của máy, môi trường trong Docker sẽ chạy độc lập. Một số developer thường tạo sẵn các môi trường này, và upload lên mạng để mọi người lấy về dùng, và mấy cái này gọi là các Images.

  • Docker rất tốt tại việc xây dựng và chia sẻ Disk Image qua hệ thống Docker Index

  • Docker là một phần mềm quản lý cơ sở hạ tầng.

  • Docker làm việc tuyệt vời với các công cụ quản lý file config (vd: Chef, Puppet)

  • Docker sử dụng btrfs để giảm sát các file hệ thống và có thể được chia sẻ với user khác. (Như cách hoạt động của Git)

  • Docker có một bộ kho trung tâm của các Disk Images (có thể được public hoặc private), điều này cho phép bạn dễ dàng chạy trên nhiều hệ điều hành khác nhau (Ubuntu, Centos, Fedora, Gentoo).

Dùng docker khi nào ?

  • Docker là một công cụ đơn giản, như Git hay Java, mà cho phép bạn kết hợp chặt chẽ tới công việc phát triển hay điều hành hàng ngày của bạn.
  • Sử dụng Docker như là một phần mềm quản lý phiên bản (version control system) cho toàn hệ điều hành của bạn.
  • Sử dụng Docker khi bạn muốn đóng góp hay hợp tác hệ điều hành của bạn với một nhóm nào đó.
  • Sử dụng Docker để chạy những dòng code trên laptop của bạn trong môi trường giống hệt như trên server của bạn.
  • Sử dụng Docker khi app của bạn cần trải qua nhiều giai đoạn khác nhau của quá trình phát triển.

Docker Remote API

Nếu bạn sử dụng Docker đến thời điểm này, nó có thể được thông qua giao diện dòng lệnh mà thực sự là một khách hàng sử dụng các API từ xa. Trước khi giao tiếp với API ta phải config mở cổng cho port TCP. Có 2 cách để config.

  • Cách 1: mở file /etc/init/docker.conf và thêm
DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
  • Cách 2: Ta có thể dùng command line
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:4243

Bạn có thể tìm hiểu thêm về cài đặt và sử dụng Docker command line Tại đây

Tiếp đó ta restart lại server docker

service docker restart

Bây giờ ta có thể request đến server doker thông qua cổng 4243. Ta sẽ sử dụng curl để reques dữ liệu

curl -X GET http://139.59.148.228:4243/images/json

Ta sẽ nhận dược từ response trả về danh sách các images được lưu trên server docker.

Ngoài ra ta cũng có thể request đến server docker thông qua các công cụ rest client của firefox hoặc postman của chrome.

Như vậy là ta đã truy cập thành công server của docker.

Ruby

Bây giờ ta sẽ sử dụng gem docker-api để ta có một interface hướng đối tượng đến docker remote API.

Cài đặt
gem install docker-api

Ta sẽ test trên irb.

trước tiên ta cần require docker-api vào ứng dụng

require 'docker-api'

Bay giờ ta sẽ trỏ đường dẫn đến server docker

Docker.url = 'tcp://139.59.148.228:4243/'

Tạo image

Với docker-api, việc tạo image hết sức đơn giản

image = Docker::Image.create('fromImage' => 'rails:4.2')

Khi chạy câu lệnh trên, hệ thống sẽ download docker từ docker hub vê. Ở trên ta đã chỉ định Image name là rails và tag là 4.2 chính là version rails mà ta muốn kéo về. Ta cũng có thế sử dụng tag lastest để kéo phiên bản mới nhất về. Ví dụ ruby:lastest

Bây giờ khi chạy docker images ta sẽ thấy có 1 image rails mà ta mới kéo về.

Khi số lượng image cả bạn lên số lượng quá nhiều thì có thể chỉ định nhưng docker mà mình muốn hiển thị. Ví dụ ta chỉ muốn xem các thông tin của icác image ruby thì ta thực hiện như sau

docker images | grep ruby

Ta sẽ nhận đc các thông tin sau

  • tên của repo
  • tag: version của image
  • image ID
  • ngày tạo
  • dung lượng file

Sau khi tạo image thông qua API xong, ta có thể xem danh sách thông qua command:

Docker::Image.all

Containers

Việc tạo Containers cũng đơn giản nhu image

container = Docker::Container.create('Image' => 'rails', 'Tty' => true)

Chạy câu lệnh trên sẽ tạo 1 container với image là rails mà chúng ta đã có. Ở đây 'Tty' => true nghĩa là việc tạo container thưc hiện thông qua SSH, nếu ko add param này thì qua strinhf này sẽ bị exit và ko tạo đc container.

Sau khi tạo xong container, ta có thể khởi động

container.start

Quay trở lại màn hình irb

container.top
=> [{"UID"=>"root", "PID"=>"28267", "PPID"=>"28248", "C"=>"0", "STIME"=>"12:43", "TTY"=>"pts/5", "TIME"=>"00:00:00", "CMD"=>"/bin/bash"}]

ta đã get đc thông tin của container vừa tạo

Requesting Container

Để get 1 container mà ta đã tao, ta có thể dựa vào ID hoặc name của container đó. Ví dụ

container = Docker::Container.get('500f53b25e6e')

Trong đó, để lấy đc ID và name, ta chạy docker ps trên của sô terminal, ta sẽ lấy đc những thông tin CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES.

Ngoài viẹc get theo ID ở trên ta cũng có thể get theo name của container

container = Docker::Container.get(container name)

Tạo image từ Container

Việc tạo 1 imge từ container có sẵn là khá hữu dụng bởi lẽ trong nhiều trường hợp,ta đã thiết lập môi trường hoàn chỉnh cho 1 container và ta muốn tạo ra 1 image với các config lấy từ container kia.

Từ container, ta thực hiện taoj file config. Ta tạm đặt tên là container.conf

container.exec(["touch", "container.conf"])

Trong đó touch là câu lệnh linux để tạo 1 file trắng, còn param thứ 2 là tên file config ta muốn đặt.

Bây giờ chạy lại câu lệnh exec bên trên container.exec(["ls") ta sẽ thấy trong danh sác các file của container sẽ có file mới mà ta vừa tạo.

Bài viét tạm thời dừng lại ở đây. Trong bài sau ta sẽ quan tâm đến chuyện bảo mật khi connec tới API.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.