Docker basic

Tại sao lại chọn Docker

Trước khi nghiên cứu về một công nghệ nào đó thì điều đầu tiên mình tìm hiểu là tính ứng dụng của nó. Do đó mình đã lên google và search về tính ứng dụng của docker sau đây mình sẽ tổng hợp lại những lợi ích về docker mà mình tìm được:

  • Docker cho phép giả lập môi trường trên production ở dưới máy local
  • Chia sẻ môi trường lập trình cho nhóm làm việc -> môi trường làm việc của các developer sẽ giống nhau
  • Thành viên mới tham gia nhóm phát triển có thể dễ dàng cài đặt môi trường phát triển phần mềm
  • Tính mềm dẻo: Docker gồm nhiều tools hỗ trợ, các tools này đều có thể chạy riêng rẽ, nên rất dễ sử dụng
  • Dễ dàng kiểm thử với mọi công cụ khác nhau, môi trường khác nhau.

Docker là gì

Docker - là một công cụ tạo môi trường ảo và đượ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. Hay có thể hiểu docker là một hệ điều hành khác chạy độc lập với hệ điều hành hiện tại của máy. Một số developer còn cài đặt các phần mềm hay giao thức để giả lập các môi trường phát triển và upload lên mạng để các developer khác lấy về sử dụng được gọi là images. Đọc đến đây liệu bạn có thắc mắc là nó có khác gì so với một máy ảo VM không? VM model: ta thấy cấu trúc của một VM model trong hình trên bản chất là sự nhân bản ra 3 hệ điều chạy độc lập các ứng dụng trên đó -> không hiệu quả, nặng nề. Container model: các container tuy chạy độc lập nhưng lại chạy chung trên một nền tảng của docker và chia sẻ thư viện, tài nguyên -> hiệu quả hơn, xử lý nhẹ nhàng hơn. Tóm lại:

  • Docker là một framework tạo ra container virtualization (container ảo)
  • Các container là các linux instance chứa các ứng dụng được cài đặt.
  • Khó sử dụng do chỉ làm việc trên môi trường Linux
  • Docker là open source và được cộng đồng hỗ trợ

Các lệnh cơ bản trong Docker

Container Tham khảo tại đây: https://docs.docker.com/engine/reference/commandline/docker/ Sau đây là một số câu lệnh được sử dụng phổ biến nhất:

Lệnh cơ bản Ý nghĩa
docker run khởi tạo hoặc chạy một container
docker rm <ID hoặc NAME> xóa một container(đầu vào sẽ là container ID)
docker kill <ID hoặc NAME> trong trường hợp container chạy không như mong muốn, thì có thể bắt buộc để dừng lại
docker run --rm <ID hoặc NAME> xóa container sau khi container dừng chạy
docker ps liệt kê các container đang chạy
docker ps -a liệt kê tất tất cả các container bao gồm cả đang chạy và đã dừng
docker inspect <ID hoặc NAME> hiển thị thông tin của container

Ví dụ: Để tạo một conainer sử dụng câu lệnh docker run hello-world vơi hello-world là một image được tạo sẵn để thử nghiệm

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Chạy lệnh docker ps -a để xem các container hiện tại trên máy

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                     PORTS                  NAMES
703c91e4e0ce        hello-world          "/hello"                 41 seconds ago      Exited (0) 40 seconds ago                          laughing_archimedes
cf55f56745ea        lerenn/sftp-server   "/bin/sh -c /docke..."   10 months ago       Exited (255) 8 weeks ago    0.0.0.0:2222->22/tcp   sftp

Để xóa container vừa tạo ra ta sử dụng docker rm 703c91e4e0ce

FRAMGIA\[email protected]:~/docker rm 703c91e4e0ce
703c91e4e0ce

Images

Lệnh cơ bản Ý nghĩa
docker images hiển thị toàn bộ image
docker build tạo một image từ Dockerfile
docker commit tạo image từ container
docker rmi <ID hoặc NAME> xóa một image
docker save lưu một image vào một file nén
docker import import một image từ file nén
docker history hiển thị lịch sử của image
docker tag gán tên cho một image

ĐỂ có thể khởi động và chạy một conatiner đã tắt ta sẽ chạy lệnh docker ps -a để lấy id hoặc tên của container sau đó chạy lệnh sau

docker start <ID hoặc NAME>
docker exec -it <ID hoặc NAME> /bin/bash

Image Docker cho Rails

Phần tiếp theo mình sẽ thực hiện theo một work flow cơ bản để tạo môi trường rails container

  1. Để tìm các images mong muốn ta sẽ gõ lệnh sau docker search ten_image
[email protected]:~$ docker search rails
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
rails                                  Rails is an open-source web application fr...   721       [OK]       
redmine                                Redmine is a flexible project management w...   504       [OK]       
jonsharratt/rails                      Ubuntu 12.04 LTS, Rails 4.0, Ruby 2.0.0-p2...   7                    
bluebu/rails-alpine                    rails-alpine with different ruby version, ...   7                    [OK]
bitnami/rails                          Bitnami Ruby on Rails Docker Image              6                    [OK]
versioneye/rails_app                   VersionEye Web App                              5                    
asux/rails                             Docker base image: Rails + Puma                 4                    [OK]
instedd/nginx-rails                    nginx rails                                     3                    [OK]
ledermann/docker-rails                 Simple Rails application to demonstrate us...   2                    [OK]
newsdev/rails                          The base Ruby image with additions to supp...   2                    [OK]
opensnp/rails                          opensnp.org                                     1                    [OK]
asux/rails-phantomjs                   Rails + Puma + PhantomJS                        1                    [OK]
opensnp/rails-sidekiq                  Sidekiq container for opensnp.org               1                    [OK]
convox/rails                           Convox base image for Ruby on Rails             1                    [OK]
dharmamike/pmx-rails                   This is a base Rails app meant only for ex...   1                    [OK]
mikeda/rails-test-with-elasticsearch   rails-test-with-elasticsearch                   1                    [OK]
  1. Trong các images trên mình sẽ chọn image chính thức do chính đội phát triển rails cung cấp
docker pull rails
#Sau khi image được pull về máy ta sẽ kiểm tra lại bằng câu lệnh sau
[email protected]:~$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
lerenn/sftp-server   latest              468dae2a33b3        10 months ago       154MB
rails                latest              660f41442a27        11 months ago       840MB
  1. Tạo container cho image rails vừa được pull về sudo docker run -p 3000:3000 --name vible_server_1 -it rails /bin/bash.Ý nghĩa của câu lệnh:
  • docker run : lệnh tạo một container cho Docker
  • --name vible_server_1: tên của conatainer
  • -p 3000:3000: cho phép binding cổng 3000 từ container ra ngoài localhost
  • tham số -it rails /bin/bash: Để chỉ định images cần tạo là rails và tự động chạy lệnh /bin/bash sau khi khởi tạo xong, nhờ đó chúng ta sẽ truy cập được vào chế độ dòng lệnh của container và quản lý nó giống như một máy tính thông thường.
  1. Sau khi chạy lệnh trên thì trên terminal sẽ hiển thị như sau:
[email protected]:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/# cat /etc/*release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
[email protected]:/# ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
[email protected]:/# rails -v
Rails 5.0.6

Ta có thể thấy rằng container vừa được tạo chứa hệ điều hành Debian8, ruby phiên bản 2.3.3 và rails 5. 5. Tạo một trang web trên docker Bây giờ ta sẽ thực hiện build một ứng dụng rails ngay trên conatiner bằng lệnh rails new app_name sau khi hệ thống cài đặt các gem cần thiết chạy rails s để khỏi động server. Kết quả như sau

[email protected]:/home/testing# rails s
=> Booting Puma
=> Rails 5.0.6 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.0 (ruby 2.3.3-p222), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

Kết thúc

Bài viết của mình xin được tạm dừng tại đây, cảm ơn các bạn đã đọc bài, nếu có chỗ nào chưa đúng các bạn có thể comment phía để trao đổi. Phần tiếp theo mình sẽ viết về cách xây dựng cho một images để cấu hình container tương tự môi trường của server trên production.