Chưa phân loại

Tôi đã dùng Docker như thế nào?

Ngày nay, các công cụ như Docker hay Vagrant rất hay được nhắc đến trong giới công nghệ, đặc biệt, đây là các công cụ cần thiết cho mọi Devops.

Nhưng đó là việc của bọn Devops, còn đối với chúng ta, những developer chân đất, sáng ngậm đắng (cà phê), tối nuốt cay (bia rượu), buổi trưa ngồi code thì có cần quan tâm không?

Xin thưa là có. Bất cứ một công cụ nào sinh ra cũng cần có người xài, và bất cứ ai cũng có thể xài.

alt text

Đứng ở phương diện của một Developer, chúng ta có thể sử dụng DockerVagrant để thiết lập môi trường ảo cho một dự án nào đó, mà không cần tốn quá nhiều công sức cài đặt hoặc làm ảnh hưởng tới máy tính hiện tại. Làm thế nào để sử dụng? Làm thế nào để tạo môi trường ảo, và vì sao phải làm như vậy? Xin mời các bạn đừng hỏi nữa, cứ đọc tiếp.

Disclaimer: Bài viết sau có đề cập đến project của một thành viên của Kipalog nhưng không hề có sự móc nối, PR hay mối tư thù nào giữa tác giả và thành viên này cả :sweat_smile:

Disclaimer #2: Để tiện cho việc theo dõi bài viết, các bạn không cần có chút khái niệm nào về Docker, nhưng cần cài đặt sẵn nó trên máy tính. Sau bài viết này các bạn sẽ dùng được Docker để làm các công việc đơn giản của một Developer, và có kiến thức nền cơ bản để tìm hiểu sâu hơn về công cụ này. Bài viết sẽ không đề cập tới chuyện so sánh giữa DockerVagrant tuy nhiên các bạn có thể comment bên dưới để thảo luận về vấn đề này.

Disclaimer #3: Dành cho bạn nào chưa biết về Github, đây là một “mạng xã hội” dành cho các Developer, dùng để chia sẽ các dự án mã nguồn mở. Một người tạo project trên đó, up source code của mình lên, các developer khác nếu thích có thể tham gia đóng góp vào project (fix bug, thêm chức năng, sửa code, review code,…), và hoạt động này gọi chung là Contribute, người đóng góp được gọi là Contributor.

Một contributor muốn contribute cho một project nào đó trên Github thì chỉ việc Fork project đó về, sửa rồi commit, sau đó tạo Pull request để người chủ project biết và sử dụng bản fix của bạn vào project của họ.
Nếu cảm thấy project hay ho, có thể đánh bấm nút Star để “like” cho project đó.
Nếu có một project đạt được nhiều stars trên Github thì người developer đó sẽ cảm thấy rất “sướng” =)) giống như mấy bạn hot gơn muốn có được nhiều like trên Facebook vậy.
Trở thành contributor của một project nhiều sao (stars) cũng rất “sướng”.
Các developer thời nay cũng sống ảo chả khác gì các em hot gơn cả, các bạn ạ…

Chuyện kể rằng…

Buổi sáng hôm đó, trời nắng đẹp và se lạnh. Sau khi đánh một giấc đã đời trên xe bus, chàng developer cần mẫn lếch xác vào công ty, việc đầu tiên anh làm là mở máy tính lên và đọc báo, lướt facebook, github,…

Tình cờ trông thấy ông @huydx vừa tạo một project mới trên github (cái nàyhttps://github.com/huydx/scalresume)

Tò mò vào xem thử, hoá ra lão ấy viết bằng Scala. Tính bỏ qua rồi nhưng cũng muốn contribute chút gì đó cho cái project.

Thấy README.md của lão viết sơ sài quá, nảy ra ý định add thêm vài dòng hướng dẫn và screenshot cho nó hấp dẫn (đây cũng là cách để trở thành một contributor nhiệt tình trên Github, các bạn chú ý nhá).

Nhưng hồi nào giờ có làm Scala đâu, chả lẽ vì cái project bé tí này =)) mà phải ngồi cài một đống tool vào máy, nào là Java, nào là Scala, SBT,… để build và chụp cho được cái screenshot sao :joy: Chưa kể có một đống dự án của công ty, chưa hoàn thành, ở trong máy, nếu rủi cài vài rồi hư máy thì biết ăn nói làm sao với sếp.

Giải pháp

Thế là nghĩ ngay đến chuyện dùng Docker.

Đối với các bạn chưa biết Docker là gì, thì đây là một công cụ tạo môi trường đượ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ột số developer thường tạo sẵn các môi trường này, và upload lên mạng để mọi người lấy về dùng, và mấy cái này gọi là các Images

Đại khái là sẽ làm thế này:

  • Dùng docker tạo một container chứa toàn bộ môi trường develop cần thiết cho Scala
  • Get project về và build, chạy thử
  • Chụp hình add vào README.md
  • Tạo pull request để đóng góp cho cái project này
  • Nghiễm nhiên trở thành contributor dù ko biết chút gì về Scala

Thực hiện

Bước 1: Tìm và tải image Docker cho Scala

Đầu tiên chúng ta cần tìm một image chạy Scala cho Docker. Bước này thì dễ thôi, có thể search trên Google với từ khoá:

Docker image for Scala

Yeah, rất nhiều images, chọn đại cái kết quả đầu tiên trên Docker Hub:https://hub.docker.com/r/lukasz/docker-scala/

Docker Hub là nơi để mọi người upload, chia sẽ các images Docker của mình

Sau khi tìm ra image rồi, chúng ta tiến hành download nó về, bước này gọi là Pull, chúng ta gõ lệnh sau:

docker pull lukasz/docker-scala

Với lukasz/docker-scala là tên của image. Tên này gồm 2 phần, phần đầu trước dấu xoẹt /, lukasz là tên thằng tác giả, và phần sau docker-scala là tên của image.

Dung lượng của image này hơi lớn một tí (1GB) nên có thể pull hơi lâu, các bạn có thể sử dụng mạng của công ty để quá trình pulling diễn ra nhanh hơn :sweat_smile:

alt text

Sau khi pull xong, các bạn có thể dùng lệnh sau để xem danh sách các images được pull về sẵn trong máy:

docker images

Kết quả trả về như sau:

REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                latest              91e54dfb1179        6 weeks ago         188.4 MB
lukasz/docker-scala   latest              90b5825bae47        20 months ago       1.217 GB

Như kết quả trên thì trong máy mình đang có 2 images: ubuntulukasz/docker-scala

Các images này các bạn chỉ cần tải về 1 lần và để đó dùng lại cho các lần sau được. Nên yên tâm về cái khoản chờ đợi. Trừ khi bạn buồn tình xoá chúng đi :laughing:

Bước 2: Lấy code từ Github về

Trước khi tạo môi trường ảo để chạy, chúng ta sẽ lấy code từ Github về trước. Ví dụ mình lấy code về và lưu ở thư mục /Users/huy/Code

git clone https://github.com/huydx/scalresume.git /Users/huy/Code

Bước 3: Tạo môi trường ảo Scala liên kết với thư mục Code

Bây giờ chúng ta sẽ tạo một môi trường ảo, còn gọi là một container sử dụng image Scala vừa pull về ở bước trên.

Container này liên kết với thư mục code hiện tại của chúng ta, và như thế chúng ta sẽ truy cập được vào thư mục code từ bên trong container.

Gõ lệnh sau:

docker run -v /Users/huy/Code:/src -it lukasz/docker-scala /bin/bash

Ý nghĩa của câu lệnh trên:

  • docker run : lệnh tạo một container cho Docker
  • tham số -v /Users/huy/Code:/src: để liên kết thư mục /Users/huy/Code ở máy tính hiện tại, vào thư mục/src của container.
  • tham số -it lukasz/docker-scala /bin/bash: Để chỉ định images cần tạo là lukasz/docker-scala 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.

Bước 4: Sử dụng container để build và chạy code

Sau khi chạy lệnh run thì cửa sổ terminal của chúng ta thay đổi thành như thế này:

root@4cc671941ee3:/# 

Lúc này, bạn đã truy cập vào bên trong container docker-scala.

Thử gõ lệnh ls để liệt kê các thư mục hiện có:

ls

Kết quả:

root@4cc671941ee3:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  src  srv  sys  tmp  usr  var
root@4cc671941ee3:/#

Giống y chang một máy tính Linux! Giờ chúng ta thử kiểm tra môi trường hiện tại xem, gõ lệnh:

scala

Kết quả trên màn hình:

root@4cc671941ee3:/# scala
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

Như vậy, chúng ta hiện đang có Scala phiên bản 2.10.3 chạy trên nền Java 1.7.0_51

Bây giờ chúng ta có thể build và chạy thử ứng dụng Scala vừa lấy về từ Github và tiến hành Contribute cho nó. Về bước này, mình sẽ nói ở một bài viết khác, dài hơn :))

Để thoát ra khỏi môi trường ảo hiện tại, bạn chỉ cần gõ lệnh:

exit

Tổng hợp (dành cho ai thấy dài quá ko đọc):

Pull một image từ Docker Hub

docker pull <image name>

Tạo một container từ image có sẵn

docker run -v <thư mục trên máy tính>:<thư mục trong container> -it <image name> /bin/bash

Lệnh trên tạo container, liên kết một thư mục trên máy tính vào bên trong container, và truy cập vào chế độ dòng lệnh của container đó.

Đối với các ứng dụng như web, container sẽ tạo một web server trên một cổng nào đó, khi đó chúng ta cần phải map cổng đó từ container ra máy tính ngoài, khi đó chúng ta dùng thêm tham số -p như sau:

docker run -v /abc:/abc -p 80:80 -it ubuntu /bin/bash

Lệnh trên map cổng 80 của container ra cổng 80 của máy tính hiện tại.

Ngoài ra, Còn một số lệnh khác mà các bạn có thể dùng để quản lý Docker của mình:

Liệt kê các images hiện có

docker images

Trong kết quả trả về của lệnh này, chúng ta lưu ý các thông số:

  • TAG: là tên của image, ví dụ lukasz/docker-scala
  • IMAGE ID: là ID của image lưu trong hệ thống, ví dụ 91e54dfb1179

Liệt kê các container đang chạy

docker ps

Trong kết quả của lệnh này cũng có các thông số chúng ta cần lưu ý, đó là:

  • CONTAINER ID: Là ID của container đó, ví dụ 4cc671941ee3
  • NAME: Là tên riêng của container, được tạo ra một cách ngẫu nhiên hoặc có thể tự đặt, ví dụ stupefied_blackwell

Liệt kê toàn bộ các container đang chạy và đã tắt
Sau khi các bạn thoát khỏi container, nếu nó không còn chạy bất cứ một tiến trình nào nữa, thì nó sẽ tự động tắt, nhưng chưa hoàn toàn bị xoá, khi đó chạy lệnh docker ps sẽ ko thấy được. Để xem lại nó thì chúng ta dùng lệnh sau.

docker ps -a

Khởi động và truy cập lại vào một container đã tắt
Nếu một container đã tắt (không xuất hiện khi dùng lệnh docker ps nữa, chúng ta có thể chạy lệnh docker ps -a để lấy ID hoặc NAME của nó, sau đó dùng lệnh sau để khởi động và truy cập lại vào đó)

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

Xoá một container
Nếu một container đã hết giá trị lợi dụng, dù nó đã tắt nhưng nó vẫn chiếm một phần dung lượng trên máy tính, để xoá nó đi, chúng ta dùng lệnh rm

docker rm <ID hoặc NAME>

Nếu container đang chạy, bạn cũng có thể xoá nhưng phải thêm tham số -f vào sau rm để force remove:

docker rm -f <ID hoặc NAME>

Xoá một image
Cũng như container, nếu bạn đã ko còn nhu cầu sử dụng một image nào đó nữa, thì nên xoá nó đi, vì dung lượng nó khá là nặng, để lại chật máy. Dùng lệnh rmi (tức là remove image đó)

docker rmi <ID hoặc NAME>

hoặc

docker rmi -f <ID hoặc NAME>

Trên đây là một số thao tác sử dụng Docker đơn giản, đủ xài đối với 1 developer với mục đích sử dụng Docker làm công cụ tạo môi trường ảo.

Với các mục đích sử dụng khác, các bạn nên tìm hiểu kĩ hơn về Docker từ những kiến thức cơ bản trong bài viết này.

Happy Dockering ^^

From http://kipalog.com/posts/Toi-da-dung-Docker-nhu-the-nao

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s