Viblo Learning
+4

Vi vu về docker basic với một số lệnh cơ bản, và dạo chơi cùng một số ví dụ hay ho

1: Docker là gì

Theo document:

Docker overview

Estimated reading time: 10 minutes

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

The Docker platform Docker provides the ability to package and run an application in a loosely isolated environment called a container. The isolation and security allow you to run many containers simultaneously on a given host. Containers are lightweight because they don’t need the extra load of a hypervisor, but run directly within the host machine’s kernel. This means you can run more containers on a given hardware combination than if you were using virtual machines. You can even run Docker containers within host machines that are actually virtual machines!

Docker provides tooling and a platform to manage the lifecycle of your containers:

  • Develop your application and its supporting components using containers.

  • The container becomes the unit for distributing and testing your application.

  • When you’re ready, deploy your application into your production environment, as a container or an orchestrated service. This works the same whether your production environment is a local data center, a cloud provider, or a hybrid of the two.

Đoạn trên chắc có lẽ đã giải thích chi tiết được docker là gì rồi, nhưng mình cũng mới học docker trong thời gian ngắn, nên khi mới đọc xong đoạn trên mình cũng thấy hơi khó hiểu ở một số chỗ, như vậy tại sao chúng ta cần "đóng gói" môi trường. Sau khi mình vào dự án thực tế thì task không phải chỉ mình bạn làm, mà còn rất nhiều người trong dự án cùng đang phát triển. Giả sử mình có một package nó yêu cầu node version 12 nhưng máy bạn khác trong team lại đang cài node version 10 và bùm nó không chạy, thế là bọn mình lại ngồi cả ngày tìm ra xem nó không chạy với ti tỉ lý do. Hay một ví dụ tuy lạ mà quen, tại sao code trên máy thì chạy ngon lành nhưng khi deploy nên server thì chết, các bạn lại phải ngồi mò từng log, tìm mọi cách tái hiện mà ngày báo tiến độ đã dí sát rồi ... Không cần kể thêm thì các bạn cũng đã hình dung nó tồi tệ đến như thế nào rồi đúng không ạ.

Và docker có một số thứ rất hay ho và này nọ mang tên dockerfile và docker-compose, chi tiết mình sẽ giải thích sau nhưng các bạn có thể hiểu các bạn có thể dựng một kịch bản sẵn mà mỗi lần các bạn chỉ cần up nó thì nó sẽ build cho các bạn một máy ảo với môi trường như mong muốn

2: Một số khái niệm cơ bản mà bạn cần nằm lòng

Docker Engine là công cụ Client - Server hỗ trợ công nghệ container để xử lý các nhiệm vụ và quy trình công việc liên quan đến việc xây dựng các ứng dụng dựa trên container. Engine tạo ra một quy trình daemon phía máy chủ lưu trữ images (đa phần được quản lý tại https://hub.docker.com/) chạy môi trường ảo hóa containers, và các networks, share vùng nhớ chung volumes. Daemon cũng cung cấp giao diện dòng lệnh phía máy khách (CLI) cho phép người dùng tương tác với daemon thông qua giao diện lập trình ứng dụng Docker. Ở trên mình có đề cập đến các từ khóa quan trọng như:

  • Image: là thành phần để đóng gói ứng dụng và các thành phần mà ứng dụng phụ thuộc để chạy. Và image được lưu trữ ở trên local hoặc trên một Registry thường là docker-hub.

  • Containers: là một instance của một image, khi các bạn chạy từ một image nên container các bạn sẽ cần ảo hóa, ghi thêm các thành phần để tạo nên container. Bạn có thể create, start, stop, move or delete container dựa trên Docker API hoặc Docker CLI

  • Network: cho phép kết nối các container lại với nhau. Kết nối này có thể trên 1 host hoặc nhiều host.

  • volume: là phần dữ liệu được tạo ra (thường thì sẽ ở máy host) và share cho các container cùng sử dụng. Các bạn có thể hiểu mình có một folder cấu hình nginx và khi mình tạo các máy ảo mình muốn chúng có cùng môi trường config này

  • docker-hub: là Registry lớn nhất của Docker Images. Có thể tìm thấy images và lưu trữ images của riêng bạn trên Docker Hub nó hoàn toàn miễn phí. Mình thấy nó cũng khá tương tự như git 😄, bà chị sư tử có viết một bài tìm hiểu nếu bạn muốn tìm hiểu sâu hơn.

3: Một số lệnh cơ bản khi sử dụng docker

Đầu tiên bạn cài đặt docker cho ubuntu

Đầu tiên các bạn nên update lại ubuntu của mình đã cho chắc 😄

sudo apt-get update

Bạn sẽ cần chạy các lệnh này để cho phép hệ điều hành của mình truy cập kho lưu trữ Docker qua HTTPS.

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

apt-transport-https: Cho phép trình quản lý gói truyền tệp và dữ liệu qua https

ca-certificate: Cho phép hệ thống (và trình duyệt web) kiểm tra chứng chỉ bảo mật

curl: Đây là một công cụ để truyền dữ liệu

software-properties-common: Thêm tập lệnh để quản lý phần mềm

Thêm key chính thức của Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

Thêm Repositories stable:

sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"

sau đó các bạn có thể test xem mình đã cài đặt được docker chưa bằng lệnh

docker -v

Các lệnh cơ bản mà mình hay sử dụng

list image:

docker images

để search các image:

docker search keyword

(chú ý: các phiên bản ở phần tags)

để pull image nào thì

docker pull keyword:phiên bản(hoặc mới nhất thì là latest)

Xóa image nào đó

docker image rm keyword:phiên bản (hoặc có thể sử dụng id)

Để tạo và chạy một container:

docker run thamso Image command thamsolenh

VD:

docker run -it name_image --name "name_container" -h name_host keyword:latest (hoặc là id_image)

Chú ý: exit để đóng container nếu bạn đang bên trong container đó

-it là tham số, ở đây tham số i có nghĩa là container có thể nhận tương tác, tham số t là có thể kết nối với terminal

--name: đặt name cho container này

-h: đặt name cho host này

keyword:latest: là images ta dùng để tạo ra container

Để kiểm tra xem container nào đang chạy sử dụng lệnh

docker ps

Để kiểm tra các container nào đang có kể cả không chạy sử dụng

docker ps -a

Khởi chạy một container đang dừng

docker start name_container(hoặc id_container)

Nếu muốn quay lại, truy cập vào một container vẫn đang chạy thì sử dụng lệnh

docker attach name_container(id_container)

thoát khỏi container đang chạy, mà không exit container đấy

ctrl + p + q

Nếu đang đứng ngoài máy host mà muốn dừng container đó thì dùng lệnh:

docker stop name_container

Nếu không sử dụng container đấy nữa có thể xóa đi

docker rm name_container

Nếu container đấy đang chạy mà muốn xóa nó dùng lệnh

docker rm -f name_container 

Nếu chúng ta đang đứng ở máy host muốn chạy một lệnh vào container mà không muốn truy cập vào container đấy thì chúng ta sử dụng lệnh

docker exec name_container command(lệnh muốn thực thi)

Lưu trữ container thành một image

Chú ý: Muốn commit một container nào thành image thì container đấy phải dừng (docker ps -a)

docker commit name_container new_name_image

Xong kiểm tra lại bằng lệnh docker images để xem images mới đã được tạo ra hay chưa

Từ image build thành một file: Tới đường dẫn muốn image file ở đó

docker save --output name_file.tar name_image(hoặc id_image)

Xóa image:

docker image rm id_image -f

Chạy file image.tar để build image đã đóng thành file đấy bằng lệnh

docker load -i name_file.tar

đổi tên image và tag của nó:

docker tag id_image new_name_image

4: Ví dụ basic với docker

Ở đây mình sẽ cài php theo 2 hướng đó là cài đặt theo lệnh và cài đặt theo docker file.

Cài bằng lệnh

  • Kéo image php về bằng lệnh:
docker pull php:7.3-fpm
  • kiểm tra xem đã kéo thành công chưa:
docker images
  • Tạo ra một network chia sẻ:
docker network create --driver bridge www-net
  • Tạo folder: mycode/www/index.html

  • Tạo container:

docker run -d --name c-php -h php -v ~/Documents/dockertest/mycode/www:/home/mycode/ --network www-net php:7.3-fpm

với

-d: cho biết container tạo xong được chạy nên luôn

--name c-php: name của container

-h php: host name của container này là php

-v ~/Documents/dockertest/mycode/www:/home/phpcode/: Ánh xạ thư mục(volume) từ ~/Documents/dockertest/mycode/www(đường dẫn tuyệt đối) máy host sang /home/phpcode/ của container

--network www-net: Sử dụng mạng network www-net php:7.3-fpm: Phiên bản php được chỉ định chạy

  • Truy cập vào container
docker exec -it c-php bash

(với c-php name container)

  • vào mycode/www/ trên máy host và tạo một file .php để test

  • sau đó trong terminator của container run lệnh chạy file php đấy:

php name_file.php

Chú ý: Nhớ vào thư mục được share trong container ở trên: /home/phpcode

  • Hoặc có thể check bằng lệnh: php -version

  • Chúng ta có thể sửa, các file trong thư mục ~/Documents/dockertest/mycode/www và nó sẽ được cập nhập /home/phpcode/

  • Sau khi xong chúng ta có thể sử dụng lệnh

docker ps -a

để kiểm tra.

Như hình trên, một container có tên c-php được tạo ra, chạy với lệnh script mặc định docker-php-entrypoint, dịch vụ PHP-FPM chạy và lắng nghe ở cổng 9000. Script mặc định này mô tả trong một file Dockerfile

docker inspect image_name_or_id (docker inspect php:7.3-fpm)

Trong image php:7.3-fpm chúng ta chú ý thông tin

"Entrypoint": [ "docker-php-entrypoint"],

Vì Entrypoint quy định các lệnh chạy mặc định khi tạo - chạy container, nên bạn thấy script docker-php-entrypoint được chạy

Cài bằng docker file

trước khi cài đặt mình có một số thông tin các bạn cần lắm như sau:

FROM : mọi Docker file đều có chỉ thị này, chỉ định image cơ sở

COPY ADD : sao chép dữ liệu (set từ vị trí của Dockerfile)

ENV : thiết lập biến môi trường

RUN : chạy các lệnh.

VOLUME : gắn ổ đĩa, thư mục

USER : user

WORKDIR : Định nghĩa directory cho CMD

EXPOSE : thiết lập cổng

ENTRYPOINT: container sẽ mặc định chạy tiến trình nào

CMD: thiết lập tham số cho ENTRYPOINT

COPY: Copy một file từ host machine tới docker image. Có thể sử dụng URL cho tệp tin cần copy, khi đó docker sẽ tiến hành tải tệp tin đó đến thư mục đích.

Tạo ra một file với name Dockerfile với nội dung

FROM php:7.3-fpm

RUN docker-php-ext-install mysqli
RUN docker-php-ext-install pdo_mysql

WORKDIR /home/nguyen.trung.thanh/Documents/dockertest/mycode/sites/site1

Lệnh build dockerfile:

docker build -t myimage:v1 -f Dockerfile .

-t là name và tags của nó

-f chỉ định file docker sẽ chạy

. đường dẫn của thư mục, vì chạy luôn tại thư mục chứa dockerfile nên chỉ để là .

5: Kết luận

Đọc tới đây chắc các bạn cũng đã hình dung được Docker là gì cũng như cách sử dụng, hoạt động của nó rồi đúng không ạ 😃. Nếu thấy bài viết hay đừng quên để lại 1 like và comment nhé thank !!!


All Rights Reserved