Tuesday, 17 June 2014

Chơi với docker, fail lần 1

Như phần tiếp theo của bài viết này
http://www.familug.org/2014/03/vm-tu-virtualbox-en-docker.html

hôm nay mình xin kể về chuyện chơi cùng Docker, và tại sao lại thất bại, tại sao lại tạm thời chia tay chỉ ngay sau nụ hôn đầu.

Tin đồn rằng vài ngày trước, một tổ chức nguy hiểm có tên xưa cũ là dotCloud đã chính thức thả  ra (release) một yêu nữ tên là Docker - một cái tên nghe là nghĩ đến sắt thép và không được mỹ miều cho lắm (http://blog.docker.com/2014/06/its-here-docker-1-0/).

Và không gì hơn nếu thiên thời, địa lợi, nhân hoà, chính lúc ấy mình cần cài một cái máy ảo để testing vài thứ. KVM không có trên OS X, Virtualbox gần như là lựa chọn duy nhất dẫu không mấy mặn mà. Vậy là Docker được mang ra nghịch.

Cài đặt:
Không có gì đặc biệt hay khó khăn, cứ theo tut mà cài  https://docs.docker.com/installation

Sau khi cài xong thì chạy thôi, dễ như ăn kẹo cao su :3
$ docker run ubuntu:12.04 /bin/echo 'hello thon'
hello thon
thật ra nó sẽ phải download image ubuntu 12.04 một lúc, xong mới chạy được như trên. Việc sử dụng không có gì phức tạp, cứ như tut mà làm :3 https://docs.docker.com/userguide/dockerizing

Để tương tác trực tiếp, chạy lệnh "run" với option '-i'

 $ docker run -i -t ubuntu:12.04 /bin/bash
root@cf045aa71b09:/# echo $BASH_VERSION
4.2.25(1)-release
root@cf045aa71b09:/# exit
hvn@cuteanlame: ~ () $ echo $BASH_VERSION
4.3.18(1)-release
bạn có thể thực hiện cài đặt chán chê, sau đó commit lại:

$ docker commit -m 'add something' -a 'HVN' cf045aa71b09 hvn:u1204/base
187644fbf911544599df51ae023719bec1087c4639e667a70913116c4e4a8081
Trong đó:
theo sau -m:  là nội dung commit
-a: author
cf045aa71b09: ID của container là hostname(bôi đỏ đậm ở trên).
hvn:u1204/base:  repo:tag  trong đó hvn là tên repo (tuỳ ý), tag là u1204/base (cũng tuỳ ý)
Dòng kết quả trả về là image ID mới (phiên bản dài dòng).

Giờ để hiển thị danh sách image, gõ:
$ docker images | grep 1204/base
hvn:u1204/base      latest              187644fbf911        12 minutes ago      210.1 MB
Vài lệnh đơn giản đó đã cơ bản giúp bạn chạy 1 container và lưu trữ những thay đổi qua commit.

Đến đây, vấn đề quan trọng nhất bắt đầu nổ ra, và cũng chính là nơi tình yêu kết thúc, thất bại!
Khi thực hiện các thay đổi trên 1 container, nếu không commit, mọi thứ đều sẽ ra đi một cách tự nhiên như không gì níu kéo. Vì vậy bạn cần có "volume" để lưu trữ data.

Docker có hỗ trợ điều này:
https://docs.docker.com/userguide/dockervolumes/

chạy
 $ docker run -i --volume ~/Github/:/opt/familug -t hvn:u1204/base
root@7ffbd7b9eee5:/# find /opt/familug/
/opt/familug/
/opt/familug/bfs
/opt/familug/bfs/common
Đó là tất cả những gì chúng ta có, docker đã thất bại trong việc mount từ máy host vào container (khi trong ~/Github có đến hàng ngàn file).
$ find /Users/hvn/Github/ | wc -l
   10335
Google...

mọi con đường đều dẫn đến thành Rome và mọi quả chôm chôm đều phải chui vào bụng, tất cả các kết quả đều dẫn đến 1 kết luận: https://github.com/dotcloud/docker/issues/4023

Một issue dài hơn độ dài cuồn giấy VS trong phòng tắm của bạn, phần hỗ trợ volume cho OS X của docker chưa được thực hiện tại bản 1.0 này.
Có vài cách để workaround như dùng sshfs hay rsync 2 chiều, NFS...
Nhưng dù sao thì nó vẫn chưa hỗ trợ cho OS X.

Hết.
Kết luận: OS X đâu phải lúc nào cũng là hay ho.
Hẹn gặp lại ở phần tiếp theo vào một ngày nào mà mình cũng chưa biết.

PS:
nếu bạn muốn biết lý do tại sao thì hãy tìm hiểu tại sao Docker lại có thể chạy trên OS X - một OS không dùng Linux Kernel.