Tìm hiểu về Docker

1. Docker là gì?

Docker

Docker là một open platform cung cấp cho người sử dụng những công cụ và service để người sử dụng có thể đóng gói và chạy chương trình của mình trên các môi trường khác nhau một cách nhanh nhất. Docker bao gồm:

  • Docker Engine: Chứa các tool, engine để có thể đóng gói chương trình và vận hành chúng một cách đơn giản nhất.
  • Docker Hub: Giống như Github, là nơi bạn có thể lưu trữ các chương trình đã được đóng gói (image) của mình và quản lý các image.

Vậy lợi ích của Docker là gì? Một ví dụ đơn giản là chúng ta sử dụng image của ubuntu 12.04 (có sẵn trên Docker Hub). Cài vào image đó ruby on rails, đóng gói và chúng ta đã có 1 bản ubuntu chứa ruby on rails mà có thể lấy và sử dụng ở bất cứ đâu.

Hoặc một ví dụ trong Ruby on rail, việc deploy app sẽ trở nên dễ dàng hơn. Không còn những câu lệnh để deploy mà thay vào đó chỉ cần upload image của app lên server rồi sau đó chạy image là xong.

Ngoài ra còn có Docker Hub cho phép quản lý các image với những câu lệnh giống như Github như push, pull… để bạn có thể quản lý dễ dàng image của mình. Docker Hub có số lượng image cực kì đa dạng từ các OS như Ubuntu, CentOS… đến các phiên bản Ruby, các phiên bản Rails… để bạn có thể tùy chỉnh các phiên bản này.

2. Cài đặt Docker

Để cài đặt Docker cần tùy thuộc vào os đang sử dụng. Tham khảo link dưới đây để cài Docker:

https://docs.docker.com/installation/#installation

3. Sử dụng Dcoker Hub

Docker Hub có cách sử dụng gần giống như là GitHub nên rất dễ dàng để có thể tiếp cận.

Để có thể dử dụng DockerHub thì cần đăng kí tài khoản ở link dưới đây:

https://hub.docker.com/account/signup/

Để đăng nhập vào Docker Hub trên terminal thì sử dụng câu lệnh sau

sudo docker login

VÍ dụ cần tìm kiếm image về các phiên bản của ubuntu thì gõ lệnh dưới đây

sudo docker search ubuntu

Kết quả trả về sẽ như dưới đây

|NAME|DESCRIPTION |STARS|OFFICIAL| AUTOMATED
|:———|:————|:——|:——|
| ubuntu | Official Ubuntu base image | 1749| [OK] | |
| ansible/ubuntu14.04-ansible | Ubuntu 14.04 LTS with ansible|44| |[OK]

Để kéo về và sử dụng Ubuntu 12.04 thì dùng câu lệnh

sudo docker pull ubuntu:12.04

Sau khi đóng gói chương trình để push lên repo của mình thì dùng câu lệnh

sudo docker push linuxhjkaru/ubuntu_with_rvm

Một điểm cần lưu ý là cần tạo repo trên Docker Hub rồi mới có thể push lên được.

4. Sử dụng Docker Engine

Docker sẽ chứa các image là các chương trình đã được đóng gói. Image có thể là Ubuntu 12.04 cho đến Ruby 2.1.2,… Các image như trên có thể được down từ DockerHub và sử dụng free.
Để show toàn bộ image có trên máy:

sudo docker images

|REPOSITORY|TAG|IMAGE ID|CREATED|VIRTUAL SIZE
|:———|:————|:——|
| training/webapp | latest | fc77f57ad303 | 3 weeks ago | 280.5 MB
| ubuntu | 13.10 | fc77f57ad303 |4 weeks ago | 180 MB
| ubuntu | saucy | fc77f57ad303 |4 weeks ago | 180 MB
| ubuntu | 12.04 | fc77f57ad303 |4 weeks ago | 209.6 MB

Ví dụ để chạy ubuntu 12.04 thì chạy câu lệnh dưới đây

sudo docker run -t -i ubuntu:12.04 /bin/bash

[email protected]:/#

và như vậy chúng ta đã có 1 ubuntu 12.04 trong OS đang chạy.

(Trong trường hợp trong máy không có ubuntu 12.04 thì Docker sẽ tự động kéo image này về cho mình)

Mở một terminal khác và gõ lệnh:

sudo docker ps

sẽ hiển thị kết quả

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAME
8358ba8fee06 ubuntu:12.04 “/bin/bash” 2 minutes ago Up 2 minutes happy_hoover

Mỗi một image khi chạy sẽ được gán 1 container id cũng như 1 tên. Điểm thú vị là 1 image có thể chạy câu lệnh run nhiều lần vì mỗi container là độc lập với nhau. Do đó chúng ta có thể có rất nhiều ubuntu 12.04 hay 14.04 chạy trong ubuntu 12.04 chẳng hạn Các Container sẽ chỉ link đến nhau khi chúng ta setting với cái tham số khi chạy image.

Quay lại với terminal đang chạy ubuntu 12.04. Chúng ta đang trong ubuntu 12.04 và sẽ cài rvm vào đây với các câu lệnh cài rvm đơn giản:

apt-get install curl

source ~/.rvm/scripts/rvm

rvm requirements

Chuyển sang terminal để chạy câu lệnh check containe và chạy 1 câu lệnh trông hết sức quen thuộc sau đây:

sudo docker commit -m "Added rvm to Ubuntu 12.04" -a "Linuxhjkaru" 0b2616b0e5a8 linuxhjkaru/ubuntu_with_rvm:v1

Trông câu lệnh trên thì:

  • 0b2616b0e5a8 là container ID của image 12.04 đang chạy (có thể thay thế bằng tên của Container)
  • linuxhjkaru/ubuntu_with_rvm là tên user và tên repo trên Docker Hub
  • V1 là tag version của image

Sau khi chạy câu lệnh trên, check lại bằng sudo docker images sẽ hiển thị kết quả

|REPOSITORY|TAG|IMAGE ID|CREATED|VIRTUAL SIZE
|:———|:————|:——|
| training/webapp | latest | fc77f57ad303 | 3 weeks ago | 280.5 MB
| ubuntu | 13.10 | fc77f57ad303 |4 weeks ago | 180 MB
| ubuntu | saucy | fc77f57ad303 |4 weeks ago | 180 MB
| ubuntu | 12.04 | fc77f57ad303 |4 weeks ago | 209.6 MB
| linuxhjkaru/ubuntu_with_rvm | v1 | fc77f57ad303 |1 minute ago | 209.6 MB

Và như vậy chúng ta đã tạo được một image là ubuntu 12.04 có chứa sẵn RVM. Có thể thấy câu lệnh commit ở trên rất giống với Git, thế nhưng nếu như ở Git ta theo dõi sự thay đổi của file thì ở Docker là sự thay đổi của 1 hệ điều hành như Ubuntu 12.04 ở trên.

5. Dockerfile

Ở phần 4 chúng ta đã biết cách tạo Image. Tuy nhiên thường thì khi tạo một image chúng ta sẽ tạo một Dockerfile rồi sau đó chạy Dockerfile đó để create image. Ví dụ cho một Dockerfile

FROM ubuntu:12.04
MAINTAINER Linuxhjkaru, [email protected]

RUN apt-get update

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

RUN apt-get update
RUN apt-get install -y mongodb-10gen

RUN mkdir -p /data/db
EXPOSE 27017
CMD ["--port 27017"]
ENTRYPOINT /usr/bin/mongod

Dockerfile cơ bản bao gồm có

  • FROM: base image để từ đó tạo image riêng
  • MAINTAINER: bao gồm tên và email của người create
  • COMMAND: Các câu lệnh chạy trong image. Ở Docker file trên là các câu lệnh để download và cài đặt mongodb.

Sau khi tạo xong Dockerfile thì chạy lệnh sau để tạo image

sudo docker build -t linuxhjkaru/ubuntu_with_mongo:v1 .

Nhuw vậy chúng ta đã có một image là ubuntu có cài sẵn mongodb.

6. Docker vs Vagrant

Điểm khác biệt lớn nhất giữa Docker và Vagrant là
Docker không phải là một Virtual Machine, Docker là Virtual Enviroment. Do đó không giống như Vagrant, Docker sẽ không tạo một OS với các thông số như kernel, hay RAM, processor… Docker chỉ tạo các container dựa trên các kernel’s image có sẵn để chạy image là các ứng dụng.

Docker được sử dụng để có thể vận hành và sử dụng app một cách nhanh nhất. Nếu như Vận hành trên Vagrant hay Deploy app có thể mất vài phút thì với Docker chỉ mất một vài giây.
Ngoài ra điểm mạnh của Docker là rất dễ học và sử dụng trong khi Vagrant thì khá mất thời gian để tiếp cận

Điểm yếu của Docker chính là hiện tại image trên Docker Hub chỉ hỗ trợ OS là Linux không như Vagrant hỗ trợ cả Windows. Ngoài ra với việc chạy trên các kernel’s image có sẵn thì khó có thể đảm bảo việc quản lý tài nguyên đến phần cứng như Vagrant.