Làm quen với docker

Docker được giới thiệu đã lâu, tuy nhiên một phần vì bận, một phần vì dùng vagrant cho các dự án vẫn còn khá tiện, nên lười vọc docker. Cho đến gần đây, cái CI server đang dùng cho dự án mới, nó chỉ hỗ trợ docker cho việc cài thêm package lên instance của nó thì mới ngồi vọc docker một cách nghiêm túc.

Lưu ý: Note được viết trong tình trạng chưa hiểu nhiều về Docker, nên có thể có sai sót về mặt thuật ngữ, cũng như việc giải thích có thể còn sơ sài

1.Docker là gì ?

Có nhiều lời giới thiệu về Docker, tuy nhiên tóm góm lại:

Docker là một nền tảng mở hỗ trợ việc xây dựng, vận chuyển và chạy các ứng dụng phân tán.

Docker được viết bằng Go lang.

Tại sao lại là Docker mà không dùng Vagrant ?

Thực ra khi so sánh thì phải so sánh giữa nền tảng mà Docker cung cấp và Virtual Machine.
Trước khi trả lời, chúng ta cùng xem qua một chút về kiến trúc.

Virtual Machine:

Docker

Thay vì cung cấp một máy ảo đầy đủ (bao gồm cả việc cài đặt OS riêng) như Vagrant, Docker cung cấp cho bạn các Virtual Container chia sẻ chung kernel và cho phép thực thi một cách an toàn các tác vụ độc lập.

Vậy nên:

  • Về tốc độ, Docker sẽ vượt trội hơn vì không cần ship cả OS của hệ thống.
  • Về tài nguyên, dùng Docker cũng sẽ tiết kiệm hơn Vagrant, vì không phải cung cấp tài nguyên cho Guest OS.

2. Bắt đầu vọc thử Docker

Mình thử docker dùng môi trường MAC OS X 10.11

Trình tự

  • Cài đặt Docker dùng Docker toolbox
  • Chạy thử software image trong một container
  • Browse một image từ Docker Hub
  • Tạo thử một image và chạy nó trong một container
  • Tạo Docker Hub account và image repository
  • Tạo một image
  • Push image của bạn lên Docker Hub để chia sẻ với người khác.

2.1 Cài đặt Docker toolbox trên Mac OS X

Vì Docker Engine daemon sử dụng các features của Linux kernel nên bạn không thể chạy Docker Engine trực tiếp trên OS X (ở thời điểm bài viết này). Thay vào đó, bạn cần phải dùng Docker Machine command docker-machine để tạo một máy ảo Linux trên máy của bạn. Máy ảo này sẽ làm nhiệm vụ host Docker Engine cho máy của bạn.

Docker Toolbox bao gồm những gói sau:

  • Docker CLI client: chạy Docker Engine để tạo images và containers
  • Docker Machine: thực hiện Docker Engine commands từ Mac OSX terminal
  • Docker Composer: chạy lệnh docker-compose
  • Kitematic: Docker GUI
  • Docker QuickStart shell preconfigured Docker command-live enviroment
  • VirtualBox

Các bước cài đặt

  • Download Docker Toolbox
  • Mở file cài đặt và tiến hành theo hướng dẫn Xác nhận docker toolbox đã được cài đặt

Sau khi cài đặt, mở launchpad bạn sẽ thấy có Docker Quickstart terminalKitematic icon.
Thử click vào Docker Quickstart terminal, bạn sẽ thấy Docker Quickstart Terminal bắt đầu được thiết lập như ảnh dưới:
Hãy thử docker run hello-world . Nếu mọi thứ được cài đặt thành công, kết quả sẽ tương tự như ảnh bên dưới:

2.2 Tìm hiểu về images và containers

Ở cuối bước cài đặt, bạn đã thử câu lệnh docker run hello-world, câu lệnh này gồm 3 phần:

  • docker: chỉ định rằng bạn đang dùng chương trình docker
  • run: sub command tạo và chạy một Docker container
  • hello-world: chỉ định image được load vào container.

Một container là một stripped-to-basics version của hệ điều hành Linux. Một image là phần mềm bạn load vào một container. Khi bạn chạy command trên, Docker Engine sẽ làm những việc sau:

  • Kiểm tra xem bạn có image hello-world hay không
  • Download image từ Docker Hub (chi tiết về Docker Hub sẽ được giới thiệu trong phần tiếp theo)
  • Load image vào container và chạy nó. Phụ thuộc vào việc image được build như thế nào, mà một image có thể chỉ chạy một command đơn giản và kết thúc, hoặc có thể khởi tạo một phần mềm phức tạp như database, chờ user add data, store data cho những lần sử dụng sau và đợi người tiếp theo.
    Ai đã built hello-world image ? Trong trường hợp này thì Docker đã built, tuy nhiên tất cả mọi người có thể làm việc đó. Docker Engine cho phép mọi người có thể tạo và chia sẻ software thông qua Docker images. Sử dụng Docker Engine, bạn không cần phải lo lắng về việc máy tính của bạn có chạy được software trong một Docker image hay không, một Docker container sẽ luôn luôn chạy nó.

2.3 Thử chạy Whalesay image

Bạn có thể tìm các image trên Docker Hub
Search thử whalesay, và click thử docker/whalesay image. Link: https://goo.gl/3JYMUB
Mỗi image repository sẽ chứa thông tin về một image. Thường sẽ bao gồm thông tin về các software mà image chứa và cách sử dụng chúng. Bạn có thể thấy rằng whalesay image based on Ubuntu. Chúng ta sẽ thử chạy whalesay image.

Hãy mở Docker Quickstart Terminal như ở bước trước, bạn sẽ thấy terminal đuocwj hiện ra, chạy thử
docker run docker/whalesay cowsay boo Vì đây là lần đầu tiên bạn chạy image whalesay, docker sẽ không tìm thấy nó ở local của bạn, nó sẽ pull từ docker hub.

Tiếp tục bạn hãy thử câu lệnh docker images, bạn có thể thấy kết quả như dưới đây:

➜  ~ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE  
hello-world         latest              690ed74de00f        6 months ago        960 B  
docker/whalesay     latest              6b362a9f73eb        10 months ago       247 MB  

Câu lệnh docker images sẽ liệt kê toàn bộ các image đã có sẵn ở máy local của bạn. Docker chỉ download lại image trong trường hợp image source thay đổi trên docker hub.
Tất nhiên, bạn có thể delete image, tuy nhiên sẽ giới thiệu ở phần sau. Giờ hay để chúng lại ở đó, vì cần tiếp tục dùng chúng.

Thử câu lệnh docker run docker/whalesay cowsay boo-boo . Bạn sẽ thấy kết quả như dưới đây:

2.4 Tự build một Docker Image

Viết một Dockerfile

Để bắt đầu, bạn hãy bật Docker Quickstart Terminal. Tạo 1 folder lưu nội dung của bạn build. Toàn bộ các file cần cho việc build image sẽ được đặt trong folder này.

➜  ~ mkdir mydockerbuild
# di chuyển vào folder mới được tạo 
➜  ~ cd mydockerbuild 

Tạo Dockerfile

$ touch Dockerfile

Dockerfile đã được tạo ra, bạn có thể kiểm tra bằng lệnh ls.
Mở 1 editor mà bạn quen dùng. Ở đây tôi dùng nano

$ nano Dockerfile

Type FROM docker/whalesay:latest vào Dockerfile của bạn như hình dưới:
FROM keyword chỉ cho Docker image của bạn dựa trên image nào. Với câu lệnh trên image mới của bạn dựa trên whalesay image.

Thêm chương trình fortunes cho image của bạn
...

Build image từ Dockerfile

Để chắc chắn rằng Dockerfile đã được lưu hãy thử cat Dockerfile trong folder hiện tại.

Bạn có thể build image bằng câu lệnh docker build -t docker-whale .

$ docker build -t docker-whale .
Sending build context to Docker daemon 2.048 kB  
....
Removing intermediate container 598bbfd9022a  
Successfully built 9469210505a0  

Full steps

Sending build context to Docker daemon 2.048 kB  
Step 1 : FROM docker/whalesay:latest  
 ---> 6b362a9f73eb
Step 2 : RUN apt-get -y update && apt-get install -y fortunes  
 ---> Running in 9626f74deedb
Ign http://archive.ubuntu.com trusty InRelease  
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]  
Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]  
Hit http://archive.ubuntu.com trusty Release.gpg  
Get:3 http://archive.ubuntu.com trusty-updates/main Sources [342 kB]  
Get:4 http://archive.ubuntu.com trusty-updates/restricted Sources [5217 B]  
Get:5 http://archive.ubuntu.com trusty-updates/universe Sources [192 kB]  
Get:6 http://archive.ubuntu.com trusty-updates/main amd64 Packages [945 kB]  
Get:7 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [23.5 kB]  
Get:8 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [462 kB]  
Hit http://archive.ubuntu.com trusty Release  
Get:9 http://archive.ubuntu.com trusty-security/main Sources [140 kB]  
Get:10 http://archive.ubuntu.com trusty-security/restricted Sources [3920 B]  
Get:11 http://archive.ubuntu.com trusty-security/universe Sources [40.5 kB]  
Get:12 http://archive.ubuntu.com trusty-security/main amd64 Packages [566 kB]  
Get:13 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [20.2 kB]  
Get:14 http://archive.ubuntu.com trusty-security/universe amd64 Packages [164 kB]  
Hit http://archive.ubuntu.com trusty/main Sources  
Hit http://archive.ubuntu.com trusty/restricted Sources  
Hit http://archive.ubuntu.com trusty/universe Sources  
Hit http://archive.ubuntu.com trusty/main amd64 Packages  
Hit http://archive.ubuntu.com trusty/restricted amd64 Packages  
Hit http://archive.ubuntu.com trusty/universe amd64 Packages  
Fetched 3036 kB in 11s (257 kB/s)  
Reading package lists...  
Reading package lists...  
Building dependency tree...  
Reading state information...  
The following extra packages will be installed:  
  fortune-mod fortunes-min librecode0
Suggested packages:  
  x11-utils bsdmainutils
The following NEW packages will be installed:  
  fortune-mod fortunes fortunes-min librecode0
0 upgraded, 4 newly installed, 0 to remove and 80 not upgraded.  
Need to get 1961 kB of archives.  
After this operation, 4817 kB of additional disk space will be used.  
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main librecode0 amd64 3.6-21 [771 kB]  
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/universe fortune-mod amd64 1:1.99.1-7 [39.5 kB]  
Get:3 http://archive.ubuntu.com/ubuntu/ trusty/universe fortunes-min all 1:1.99.1-7 [61.8 kB]  
Get:4 http://archive.ubuntu.com/ubuntu/ trusty/universe fortunes all 1:1.99.1-7 [1089 kB]  
debconf: unable to initialize frontend: Dialog  
debconf: (TERM is not set, so the dialog frontend is not usable.)  
debconf: falling back to frontend: Readline  
debconf: unable to initialize frontend: Readline  
debconf: (This frontend requires a controlling tty.)  
debconf: falling back to frontend: Teletype  
dpkg-preconfigure: unable to re-open stdin:  
Fetched 1961 kB in 11s (175 kB/s)  
Selecting previously unselected package librecode0:amd64.  
(Reading database ... 13116 files and directories currently installed.)
Preparing to unpack .../librecode0_3.6-21_amd64.deb ...  
Unpacking librecode0:amd64 (3.6-21) ...  
Selecting previously unselected package fortune-mod.  
Preparing to unpack .../fortune-mod_1%3a1.99.1-7_amd64.deb ...  
Unpacking fortune-mod (1:1.99.1-7) ...  
Selecting previously unselected package fortunes-min.  
Preparing to unpack .../fortunes-min_1%3a1.99.1-7_all.deb ...  
Unpacking fortunes-min (1:1.99.1-7) ...  
Selecting previously unselected package fortunes.  
Preparing to unpack .../fortunes_1%3a1.99.1-7_all.deb ...  
Unpacking fortunes (1:1.99.1-7) ...  
Setting up librecode0:amd64 (3.6-21) ...  
Setting up fortune-mod (1:1.99.1-7) ...  
Setting up fortunes-min (1:1.99.1-7) ...  
Setting up fortunes (1:1.99.1-7) ...  
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...  
 ---> 669682b08bd7
Removing intermediate container 9626f74deedb  
Step 3 : CMD /usr/games/fortune -a | cowsay  
 ---> Running in 598bbfd9022a
 ---> 9469210505a0
Removing intermediate container 598bbfd9022a  
Successfully built 9469210505a0  

Chạy thử docker-whale

2.5 Tạo Docker Hub Account & Repository

Đăng ký , sau đó vào trang profile, click Create Repository. Điền form như ảnh dưới Sau khi tạo sẽ có một trang repository riêng.

2.6 Push và pull image của bạn

Dùng docker images để liệt kê toàn bộ docker images của bạn. Bạn sẽ thấy mỗi image sẽ có 1 IMAGE ID riêng. ( vùng được khoanh dấu đỏ)

Sử dụng docker tag để tag docker-whale image

docker tag 9469210505a0 chungth/docker-whale:latest  

bạn có thể thấy tag mới của image có id 9469210505a0 được tạo ra.

Login vào docker hub

docker login --username=chungth  

Push image:

$ docker push chungth/docker-whale

The push refers to a repository [docker.io/chungth/docker-whale]  
dc350df1b78e: Pushed  
5f70bf18a086: Mounted from docker/whalesay  
d061ee1340ec: Mounted from docker/whalesay  
d511ed9e12e1: Mounted from docker/whalesay  
091abc5148e4: Mounted from docker/whalesay  
b26122d57afa: Mounted from docker/whalesay  
37ee47034d9b: Mounted from docker/whalesay  
528c8710fd95: Mounted from docker/whalesay  
1154ba695078: Mounted from docker/whalesay  
latest: digest: sha256:a624cd2121eb7966f0cf7fe201a1674f1b2f2c9d90e7d1181f5936f93e95bf58 size: 8093  

Pull image mới của bạn

Bạn sẽ thử pull image mới mà bạn vừa push lên docker hub. Tuy nhiên trước đó bạn cần phải remove image trên máy của bạn, nếu không Docker sẽ không pull image từ hub về vì image đó đã có sẵn trong máy bạn rồi.

$ docker rmi -f 9469210505a0

Untagged: chungth/docker-whale:latest  
Deleted: sha256:9469210505a0da0424246ab09f346badae4cfd20fff96a5012da4064f6bddeb6  
Deleted: sha256:669682b08bd76be89d5615c270ad72a2bbdffe50bd86c42782de7a500e307516  

Pull và run image của bạn bằng lệnh

docker run chungth/docker-whale  

Tài liệu tham khảo Bài viết chủ yếu được dịch và note lại từ 2 tài liệu: