Cài đặt và Làm quen với việc sử dụng Docker

1 năm trước

 

Nhãn

 

Cài đặt và Làm quen với việc sử dụng Docker

Note: Bài viết này chỉ mang tính chất tham khảo do được viết trên một nền tàng phần mềm đã cũ.
Nếu muốn một hướng dẫn trên một nền tảng mới hơn, hãy xem bài viết Cách Cài đặt và Sử dụng Docker trên Ubuntu 16.04

Giới thiệu

Các trường hợp nảy sinh trong quá trình sử dụng cần được xử lí là vô hạn và sự cần thiết cho một giải pháp vẫn luôn gia tăng. Docker được phát triển để cung cấp cho bạn một cách nhanh chóng hiệu quả để chạy ứng dụng trên nhiều hệ thống và máy móc. Nó nhẹ và rất hiệu quả, cho phép bạn nhanh chóng "đóng gói" ứng dụng và chạy chúng trong môi trường an toàn của chính nó (thông qua Linux Containers: LXC).

Bài viết này sẽ giới thiệu cho bạn về Docker, một trong số những dự án mã nguồn mở thú vị và mạnh mẽ nhất được giới thiệu trong nhữn năm gần đây. Docker có thể giúp đỡ bạn nhiều đến mức thật khó để đề cập đầy đủ về chúng chỉ trong một bài viết.

Các thuật ngữ:

1. Docker

2. Docker Project và các bộ phận chính của nó

3. Docker element (Phần tử của Docker)

  1. Docker Container
  2. Docker Image
  3. Dockerfile

4.Cách cài đặt Docker

5. Cách sử dụng Docker

  1. Mở đầu
  2. Làm việc với Image
  3. Làm việc với Container
 

Docker

Từ máy tính đến một remote server, việc đóng gói tất cả mọi thứ cần thiết để sử dụng một ứng dụng ở nơi khác luôn luôn là một thách thức với ứng dụng cùng các phụ thuộc của nó. Trong thực tế, thách thức là vô cùng lớn và giải pháp cho đến nay vẫn chưa thực sự tỏ ra thành công trong tất cả trường hợp.

Docker là một project cho phép bạn hoàn thành một tập hợp các công cụ để mang tất cả mọi thứ cần thiết để chạy một ứng dụng thông qua các thiết bị và cả server  - cả dạng ảo và vật lí - cùng với nhiều tiện ích bên trong nó.

Docker đạt được khả năng đóng gói ứng dụng (và theo kèm với các tiến trình và tài nguyên) mạnh mẽ của nó thông qua Linux Container (ví dụ như namespaces và các tính năng khác của nhân kernel). Khả năng xa hơn của nó đến từ các bộ phận và các thành phần riêng, trong đó loại bỏ tất cả sự phức tạp của việc làm việc với các tool/API cấp thấp của Linux được sử dụng cho hệ thống và quản lý ứng dụng liên quan cùng với việc bảo mật các tiến trình chạy trong nó.

 

Docker Project và các thành phần chính của nó

Docker project ( được phát hành bởi dotCloud vào 13/3/2013) bao gồm một vài bộ phận chính (các ứng dụng) và các element (được sử dụng bởi các ứng dụng trên) được xây dựng hầu hết trên nền tảng những tính năng, thư viện và framework, hoạt động trên kernel của Linux và các thành tố thuộc bên thứ ba ( LXC, device-mapper...).

Các thành phần chính của Docker

  1. docker daemon: dùng để quản lí docker (LXC) container trên host nó đang chạy
  2. docker CLI: dùng để chạy lệnh và giao tiếp với docker daemon
  3. docker image index: là một repository (public hoặc private) dành cho các docker image.

Phần tử chính của Docker

  1. docker container: thư mục chứa mọi thứ để chạy ứng dụng
  2. docker imags: snapshot của container hoặc base image của OS (chăng hạn Ubuntu)
  3. Dockerfile: những đoạn mã giúp tự động hóa quá trình build image
 

Các phần tử chính của Docker( Docker Element)

 

Docker Container

 

Docker container về cơ bản là thư mục có khả năng nén (như tar-archived) giống các thư mục khác, được chia sẻ và chạy trên nhiều máy và nền tảng khác nhau (là các host). Phụ thuộc duy nhất của nó khi chạy là host phải có khả năng chạy container ( nghĩa là có được cài docker). Việc đóng gói này ở đây được thực hiện qua Linux Container (LXC).

LXC (Linux Container)

Linux Container có thể được định nghĩa là sự kết hợp của nhiều tính năng của các tầng kernel ( những thứ Linux-kernel có thể làm) cho phép quản lí các ứng dụng (và tài nguyên chúng sử dụng) nằm trong môi trường độc lập với bên ngoài. Bằng cách sử dụng một số tính năng cụ thể ( như namespaces, chroots, cgroups và SELinux profiles),LXC có thể chứa được các tiến trình ứng dụng và quản lí chúng trong một giới hạn về tài nguyên, không cho phép chúng tác động đến các phân vùng tài nguyên khác .

Docker cùng với container của nó sử dụng LXC, tuy nhiên còn áp dụng thêm nhiều tính năng hay ho khác.

Docker Container

Docker container có một vài tính năng chính sau:

Cung cấp:

  • Tính linh động cho ứng dụng
  • Tiến trình cô lập (bị tách biệt với các tiến trình khác)
  • Không tác động đến bên ngoài
  • Quản lí tài nguyên hiệu quả.

Không cho phép:

  • Lẫn lộn giữa các tiến trình khác nhau
  • Gây ra "dependency hell"
  • Không hoạt động trên các nền tàng khác
  • Dễ bị tấn công và lãng phí tài nguyên hệ thống

Được xây dựng dựa trên và phụ thuộc vào LXC, các container giống như một thư mục được định dạng riêng. Điều này cho phép tính linh động và khả năng build theo từng bước của container.

Mỗi container được phân thành nhiều tầng và mỗi hành động được thực hiện trong container bao gồm việc đặt một khối (được chuyển thành những thay đổi đơn giản trong hệ thống file) bên trên một block khác. 

Lợi ích của việc có các container là việc dễ dàng chạy và tạo container và image mới có dung lượng nhẹ (nhờ cách xây dựng dần dần và theo từng lớp của chúng). Vì mọi thứ đều dựa trên các tập tin hệ thống, việc chụp các snapshot và thực hiện việc roll-back khá dễ dàng và không tốn về tài nguyên, giống như hệ thống kiểm soát phiên bản (Version Control System).

Mỗi docker container chạy từ docker image ( thứ giúp định hình những yêu cầu cho việc chạy các ứng dụng và layer khác) 

Docker Image

Docker image tạo nên cơ sở của docker container. Chúng gần giống với các disk image mặc định của các hệ điều hành, thứ được sử dụng để chạy ứng dụng trên servers hoặc máy tính các nhân.

Việc có những image này(ví dụ Ubuntu base) cho phép tính di động liền mạch trên hệ thống. Chúng tạo ra một nền tảng vững chắc, phù hợp và đáng tin cậy với tất cả những thứ cần thiết để chạy các ứng dụng. Khi mọi thứ đều khép kín và nguy cơ cập nhật hoặc sửa đổi hệ thống được loại bỏ, container trở nên miễn nhiễm với tác động bên ngoài mà có thể làm nó mất trật tự dẫn đến trạng thái dependency hell.

Khi càng nhiều lớp (công cụ, ứng dụng...) được thêm vào bên trên cơ sở, image mới có thể được hình thành bằng việc giữ lại những thay đổi này. Khi một container mới được tạo ra từ một image đã được cập nhật thay đổi (ví dụ cam),mọi thứ sẽ đưuọc thực hiện tiếp từ lúc quá trình bị tạm dừng, và hệ thống tập tin liên minh (union file system) kết hợp tất cả các lớp với nhau như một thực thể duy nhất khi bạn làm việc với một container.

Các base image có thể được khởi động thông qua docker CLI để trực tiếp tạo một container mới, hoặc được đưa vào trong Dockerfile cho việc tự động build image.

Dockerfile

 

Dockerfile là những đoạn script có chứa một chuỗi các chỉ dẫn, hướng dẫn, và các lệnh đó được thực hiện để tạo thành một Docker Image mới. Mỗi lệnh thực hiện dịch vào một lớp mới để tạo thành sản phẩm cuối cùng.

Về cơ bản chúng thay thế quá trình làm tất cả mọi thứ bằng tay và lặp đi lặp lại thành một mẫu dựng sẵn. Khi một Dockerfile được thực thi xong, bạn sẽ có một image theo mẫu để tạo một container mới.

 

Cách cài Docker

Đầu tiên, Docker chỉ khả dụng trên Ubuntu. Ngày nay, ta có thể triển khai docker trên các hệ thống dứa trên RHEL (như CentOS)  cũng như các nền tảng khác.

Ở đây ta sẽ nó đến việc cài đặt nó trên Ubuntu.

 

Hướng dẫn cài đặt Docker cho Ubuntu

 

Update server:

sudo apt-get update
sudo apt-get -y upgrade

Đảm bảo rằng aufs support khả dụng với lệnh:

sudo apt-get install linux-image-extra-`uname -r`

Thêm docker repository key đến apt-key để xác thực gói:

sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Thêm docker repository đến nguồn Apt:

echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list

Update lại repository:

sudo apt-get update

Cuối cùng download và cài docker:

sudo apt-get install docker-engine

Tường lửa mặc định của Ubuntu (UFW: Uncomplicated Firewall) mặc định chặn tất các các kết nối trực tiếp, nên ta cần cho phép kết nối của Docker.

Mở file cấu hình UFW với nano:

sudo nano /etc/default/ufw

Kéo xuống và tìm dòng DEFAULTFORWARDPOLICY.

Thay thế:

DEFAULT_FORWARD_POLICY="DROP"

Bằng:

DEFAULT_FORWARD_POLICY="ACCEPT"

Bấm CTRL+X rồi Y để lưu và đóng.

Reload UFW:

sudo ufw reload

Để xem đây đủ hướng dẫn việc cài đặt Docker, hãy xem tài liệu chính thức của nhà phát triển ở đây.

 

Cách sử dụng Docker

 

Sau khi cài xong, ta sẽ học cách sử dụng cơ bản cho docker.

Đầu tiên chay docker daemon:

sudo docker -d &

Sử dụng docker (qua CLI) thông qua cú pháp chung của lệnh như sau:

sudo docker [option] [command] [arguments]

Note: Hướng dẫn và giải thích dưới đây được cung cấp để được sử dụng để cung cấp cho bạn một ý tưởng chung của việc sử dụng và làm việc với Docker. Cách tốt nhất để làm quen với nó là thực hành trên một VPS mới. Đừng ngại nếu chẳng may phá hỏng thứ gì- hãy tự do phá vớ mọi thứ đi vì bạn đang dùng một VPS mới! Với Docker, bạn có thể lưu tiến bộ của bạn và tiếp tục từ đó rất dễ dàng.

Bắt đầu

 

Xem danh sách lệnh của Docker với lệnh:

sudo docker

Các lệnh sau được hỗ trợ trong phiên bản 0.7.1

attach Attach to a running container
build Build a container from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders from the containers filesystem to the host path
diff Inspect changes on a container's filesystem
events Get real time events from the server
export Stream the contents of a container as a tar archive
history Show the history of an image
images List images
import Create a new filesystem image from the contents of a tarball
info Display system-wide information
insert Insert a file in an image
inspect Return low-level information on a container
kill Kill a running container
load Load an image from a tar archive
login Register or Login to the docker registry server
logs Fetch the logs of a container
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps List containers
pull Pull an image or a repository from the docker registry server
push Push an image or a repository to the docker registry server
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image to a tar archive
search Search for an image in the docker index
start Start a stopped container
stop Stop a running container
tag Tag an image into a repository
top Lookup the running processes of a container
version Show the docker version information
wait Block until a container stops, then print its exit code

Kiểm tra thông tin về hệ thống và bản cài đặt Docker với các lệnh:

# For system-wide information on docker:
sudo docker info
# For docker version:
sudo docker version

Làm việc với Image

Như đã thảo luận, chìa khóa để bắt đầu làm việc với bất kỳ Docker container nào là sử dụng image. Có rất nhiều image có sẵn miễn phí chia sẻ thông qua docker image index và CLI cho phép truy cập đơn giản để truy cập các image repository và download image mới.

Tìm một docker image:

# Usage: sudo docker search [image name]
sudo docker search ubuntu

Output sẽ cho bạn một danh sách rất dài các image khớp với từ khóa: Ubuntu.

Download (PULL) một image:

Khi bạn đang build hay tạo một container hoặc kể cả trước khi thực hiện bất cứ diều gì với Docker Project, bạn sẽ cần phải có một image tại máy chủ, nơi container sẽ tồn tại. Để tải về image, bạn có thể thực hiện lệnh pull .

# Usage: sudo docker pull [image name]
sudo docker pull ubuntu

Liệt kê các image:

Tất cả image trên hệ thống, kể cả các image được tạo bằng việc xác nhận và lưu thay đổi trên một image gốc (xem bên dưới),có thể được liêt kê với “images”. Lệnh này cho ta một danh sách đầy đủ về các image đang hoạt động.

# Example: sudo docker images
sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
my_img latest 72461793563e 36 seconds ago 128 MB
ubuntu 12.04 8dbd9e392a96 8 months ago 128 MB
ubuntu latest 8dbd9e392a96 8 months ago 128 MB
ubuntu precise 8dbd9e392a96 8 months ago 128 MB
ubuntu 12.10 b750fe79269d 8 months ago 175.3 MB
ubuntu quantal b750fe79269d 8 months ago 175.3 MB

Lưu thay đổi đến một image:

Khi bạn làm việc với một container và tiếp tục thực hiện các thao tác trên nó (ví dụ như tải về và cài đặt phần mềm, cấu hình các tập tin...),để có lưu giữ trạng thái của nó, bạn cần phải “cam kết”. Cam kết đảm bảo rằng trạng thái hiện tại của container sẽ được lưu lại cho các lần sử dụng tiếp theo qua một image.

# Usage: sudo docker commit [container ID] [image name]
sudo docker commit 8dbd9e392a96 my_img

Chia sẻ (PUSH) image:

Khi đã tạo riêng cho mình một image , bạn có thể push nó lên để mọi người có thể download và sử dụng nó.

Nhớ là hãy xác nhận tất cả các thay đổi.

# Usage: sudo docker push [username/image name] 
sudo docker push my_username/my_first_image

Note: Bạn cần đăng kí tại địa chỉ index.docker.io để push image lên kho docker index.

Làm việc với Container

Khi chạy bất cứ tiến trình nào với image, bạn sẽ có một container. Khi tiến trình đó chạy ở chể độ notavitvely, container sẽ là một non-running container. Nếu không,tất cả chúng sẽ ở lại hệ thống của bạn đến khi bạn gỡ bỏ chúng với lệnh rm.

Liệt kê danh sách các container:

Lệnh này hiển thị tất cả các container đang hoạt động:

sudo docker ps

Đề hiển thị thêm cả các non-running container, dùng lệnh:

sudo docker ps -l 

Tạo một Container mới

 

Bạn sẽ không thể tạo container mà không chạy thứ gì ( chẳng hạn các lệnh). Để tạo một container mới, bạn cần sử dụng base image và xác định lệnh để chạy:

# Usage: sudo docker run [image name] [command to run]
sudo docker run my_img echo "hello"
# To name a container instead of having long IDs
# Usage: sudo docker run -name [name] [image name] [comm.]
sudo docker run -name my_cont_1 my_img echo "hello"

Lệnh trên sẽ hiển thị "hello" trên shell của thiết bị.

Vì bạn không thể sửa lệnh đã chạy sau khi kích hoạt container , bạn nên sử dụng các trình quản lí tiến trình và tạo ra các đoạn script cho phép chạy nhiều lệnh khác nhau.

Chạy container:

Sau khi tạo container xong (sau khi quá trình xử lí xong, hoặc bạn dừng nó giữa chừng)),bạn có thể dùng lệnh “run” để container hoạt động trở lại với đúng những lệnh bạn đã cài cho nó:

# Usage: sudo docker run [container ID]
sudo docker run c629b7d70666

Bạn có thể tìm kiếm một container thông qua lệnh liệt kê danh sách container ở trên.

Dừng một container:

# Usage: sudo docker stop [container ID]
sudo docker stop c629b7d70666

Lưu (xác nhận) một container:

Để lưu các tiến trình và thay đổi bạn đã thực hiện với container, bạn cần phải "xác thực"  và lưu nó thành một image.

Nhớ rằng với docker, việc xác nhận là rất dễ dàng. Đừng hiểu nhầm nó với việc tạo image để lưu tiến trình với container hay quay lại khi cần thiết (như snapshot).

Gỡ/ Xóa container:

Sử dụng ID của container, bạn có thể gỡ nó với rm.

# Usage: sudo docker rm [container ID]
sudo docker rm c629b7d70666