Trong tgian gần đây, tôi thấy trên twitter, blog Digital Ocean, hay các trang công nghệ có đề cập đến @Docker rất là nhiều. Vậy docker nó là gì và tại sao nó hữu ích mà cả thế giới tung hô và quan tâm vậy ?

docker_logo

Tôi cũng đã tham khảo qua 1 vài bài viết, hướng dẫn song vẫn còn chưa hiểu hết được về Docker. Bài viết nay điểm lại nhưng hiểu biết hiện tại của tôi và tgian tới sẽ tìm hiểu nhiều thêm về Docker và ứng dụng nó.

Nhưng 1 cách hiểu ngắn ngọn thế này, bạn tưởng tưởng trên Windows các bạn thường dùng các chương trình Portable (Application Portable: là chương trình đã cài đặt và đóng gói thành 1 file chạy) Khi bạn đem chương trình này sang máy bạn của bạn thì chương trình đó có thể chạy ngay được. Docker cũng làm 1 nhiệm vụ tương tự như vậy, nó chứa 1 ứng dụng đã deploy, sau khi “đóng gói” có thể mang đi chạy ở các môi trường khác nhau ở các máy chủ khác nhau mà ko mất công deploy lại.

Vậy, nó khác với Application Portable ở chỗ này, hãy xem những khẳng định sau đây về Docker và những giới hạn của nó:

Docker là gì ?

Docker là một nền tảng mở cho việc triển khai các ứng dụng. Nó cung cấp các công cụ mức cao, làm việc cùng nhau, được xây dựng trên một vài nhân Linux phổ biến. Mục đích là giúp developers và sysadmins giao tiếp với các ứng dụng với ít phụ thuộc nhất và những ứng dụng này có thể chạy đa nền tảng.

Định nghĩa trên trang chủ: https://www.docker.com/

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud.

Những khẳng định về Docker

  • 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).

Docker diagram

Những khẳng định khác về Docker

  • Docker không phải là Linux Container (vd như LXC)
  • Docker không phải là công cụ quản lý các file config (vd: Chef, Puppet…)
  • Docker không phải là Paas
  • Docker không tốt lắm tại việc tách biệt các Linux Container (vd: khi bạn có nhiều máy ảo cùng trên một hệ thống)

Các thuật ngữ sử dụng khi nói về @Docker

Khi nào thì sử dụng Docker

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 giống Java ở điểm nào ?

Java: viết một lần, và nó có thể chạy trên tất cả mọi hệ thống. Thì Docker cũng vậy. Chỉ có điều Java thì là code còn Docker là những dòng config.
Ví dụ: Java code viết như sau

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Docker viết trong Dockerfile như sau:

FROM ubuntu:13.10

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq -y && \
    apt-get install curl -qq -y && \
    apt-get clean

RUN curl -sSL https://get.rvm.io | bash -s stable --ruby=2.1.1

Docker server cũng giống như JVM cho hệ thống.

Docker giống với Git ở điểm nào ?

Git cho phép bạn theo dõi những thay đổi của code theo thời gian. Thì Docker cũng như vậy. Nhưng thay vì theo dõi code thì Docker theo dõi những sự thay đổi của hệ điều hành.

Ví dụ: với Git

$ git init .
$ touch README.md
$ git add .
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached ..." to unstage)

    new file:   README.md
$ git commit -am "Adding README.md"
[master (root-commit) 78184aa] Adding README.md
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
$ git push
Counting objects: 49, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (39/39), done.
Writing objects: 100% (49/49), 4.29 KiB | 0 bytes/s, done.
Total 49 (delta 13), reused 0 (delta 0)
To git@github.com:my/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
$ git pull
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:cardmagic/docker-ruby
   f98f3ac..4578f21  master     -> origin/master
Updating f98f3ac..4578f21
Fast-forward
 README.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 README.md
$ git whatchanged
commit 78184aa2a04b4a9fefb13d534d157ef4ac7e81b9
Author: Lucas Carlson <lucas@rufy.com>
Date:   Mon Apr 21 16:46:34 2014 -0700

    Adding README.md

:000000 100644 0000000... e69de29... A  README.md

Còn với Docker

$ MY_DOCKER=$(docker run -d ubuntu bash -c 'touch README.md; sleep 10000')
$ docker diff $MY_DOCKER
A /README.md
C /dev
C /dev/core
C /dev/fd
C /dev/ptmx
C /dev/stderr
C /dev/stdin
C /dev/stdout
$ docker commit -m "Adding README.md" $MY_DOCKER my/ubuntu
4d46072299621b8e5409cbc5d325d5ce825f788517101fe63f5bda448c9954da
$ docker push my/ubuntu
The push refers to a repository [my/ubuntu] (len: 1)
Sending image list
Pushing repository my/ubuntu (1 tags)
511136ea3c5a: Image already pushed, skipping 
Image 6170bb7b0ad1 already pushed, skipping
Image 9cd978db300e already pushed, skipping
de2fdfc8f7d8: Image successfully pushed 
Pushing tag for rev [de2fdfc8f7d8] on {https://registry-1.docker.io/v1/repositories/my/ubuntu/tags/latest}
$ docker pull my/ubuntu
Pulling repository my/ubuntu
de2fdfc8f7d8: Download complete 
511136ea3c5a: Download complete 
6170bb7b0ad1: Download complete 
9cd978db300e: Download complete 
$ docker history my/ubuntu
IMAGE               CREATED             CREATED BY                                      SIZE
de2fdfc8f7d8        3 minutes ago       bash -c touch README.md; sleep 10000            77 B
9cd978db300e        11 weeks ago        /bin/sh -c #(nop) ADD precise.tar.xz in /       204.4 MB
6170bb7b0ad1        11 weeks ago        /bin/sh -c #(nop) MAINTAINER Tianon Gravi

Kết luận

Sự thật là Docker đang dần thay đổi nhiều lập trình viên và đặc biệt là các admin cách làm việc của họ. Và cộng đồng Docker đang phát triển rất mạnh. Chúng ta cũng nên dùng thử và trải nghiệm sức mạnh của Docker trong những giai đoạn phát triển của phần mềm.

Tham khảo:

1. Docker explained: https://www.digitalocean.com/community/tutorials/docker-explained-how-to-create-docker-containers-running-memcached
2. Docker Getting Started: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-getting-started
3. What Docker does right and what it doesn’t do right: http://www.zdnet.com/what-docker-does-right-and-what-it-doesnt-do-right-yet-7000032889/
4. Twitter: @docker

About The Author