Cách cài đặt và Sử dụng Docker Compose on CentOS 7

2 năm trước
 

Giới Thiệu 

Docker là một công cụ tuyệt vời, nhưng để tận dụng tối đa tiềm năng của nó, tốt nhất là nếu mỗi thành phần của ứng dụng của bạn chạy trong container của nó. Đối với các ứng dụng phức tạp với nhiều thành phần, việc dàn xếp tất cả các container để khởi động và tắt cùng nhau (không kể đến việc nói chuyện với nhau) có thể nhanh chóng trở nên khó sử dụng.

Cộng đồng Docker đã đưa ra một giải pháp phổ biến có tên là Fig, cho phép bạn sử dụng một tệp YAML duy nhất để dàn xếp tất cả các containers và cấu hình Docker của bạn. Điều này đã trở nên phổ biến đến nỗi nhóm Docker cuối cùng đã quyết định tạo phiên bản của riêng mình dựa trên nguồn Fig. Họ gọi nó là Docker Compose. Tóm lại, nó làm cho việc xử lý các quy trình phối hợp của các Docker container (như khởi động, tắt, và thiết lập liên kết và khối lượng trong container) thực sự dễ dàng.

Đến cuối bài viết này, bạn sẽ cài đặt Docker và Docker Compose và có hiểu biết cơ bản về cách Docker Compose hoạt động.

Docker và Docker Compose Concepts

Sử dụng Docker Compose đòi hỏi sự kết hợp của một loạt các khái niệm Docker khác nhau trong một, vì vậy trước khi bắt đầu, chúng ta hãy dành một phút để xem xét các khái niệm khác nhau có liên quan. Nếu bạn đã quen với các khái niệm Docker như volumes, links và chuyển tiếp cổng thì hãy tiếp tục và chuyển sang phần tiếp theo.

Docker Images

Mỗi Docker container là một thể hiện cục bộ của một hình ảnh Docker. Bạn có thể nghĩ về một hình ảnh Docker như là một cài đặt Linux hoàn chỉnh. Thông thường, một cài đặt tối thiểu chỉ chứa các gói cần thiết để chạy hình ảnh. Những hình ảnh này sử dụng hạt nhân của hệ thống máy chủ, nhưng vì chúng đang chạy bên trong  Docker container và chỉ thấy hệ thống tệp riêng của chúng, nên có thể chạy phân phối như CentOS trên máy chủ Ubuntu (hoặc ngược lại).

Hầu hết các hình ảnh Docker được phân phối thông qua Docker Hub, được duy trì bởi nhóm Docker. Hầu hết các dự án mã nguồn mở phổ biến đều có một hình ảnh tương ứng được tải lên  Docker Registry, mà bạn có thể sử dụng để triển khai phần mềm. Khi có thể, tốt nhất là nên chụp các hình ảnh "chính thức", vì chúng được đảm bảo bởi nhóm Docker để thực hiện theo các phương pháp hay nhất của Docker.

Giao tiếp giữa các Docker Images

Các Docker containers được phân lập từ máy chủ theo mặc định, có nghĩa là theo mặc định, máy chủ không có quyền truy cập vào hệ thống tệp bên trong Docker container, cũng như không có bất kỳ phương tiện giao tiếp nào với nó qua mạng. Không cần phải nói, điều này làm cho việc định cấu hình và làm việc với hình ảnh chạy bên trong một Docker container khó theo mặc định.

Docker có ba cách chính để giải quyết vấn đề này. Đầu tiên và phổ biến nhất là để Docker chỉ định các biến môi trường sẽ được đặt bên trong Docker container. Mã chạy bên trong  Docker container sau đó sẽ kiểm tra các giá trị của các biến môi trường này khi khởi động và sử dụng chúng để cấu hình chính xác.

Một phương pháp thường được sử dụng khác là Docker dât volume. Docker volumes có cả - nội bộ và chia sẻ

Chỉ định một volume nội bộ chỉ  nghĩa là đối với một thư mục bạn chỉ định cho một  Docker container cụ thể, dữ liệu sẽ được lưu lại khi container được xóa. Ví dụ: nếu bạn muốn đảm bảo tệp nhật ký của mình bị treo xung quanh, bạn có thể chỉ định volume nội bộ /var/log .

Một volume được chia sẻ map một thư mục bên trong một  Docker container vào một thư mục trên máy chủ. Điều này cho phép bạn dễ dàng chia sẻ tệp giữa Docker containers và máy chủ lưu trữ .

Cách thứ ba để giao tiếp vớ  Docker container là thông qua mạng. Docker cho phép giao tiếp giữa các Docker container khác nhau thông qua links, cũng như chuyển tiếp cổng, cho phép bạn chuyển tiếp các cổng từ bên trong Docker container đến các cổng trên máy chủ lưu trữ. Ví dụ, bạn có thể tạo một liên kết để cho phép các  WordPress và MariaDB Docker containers của bạn trao đổi với nhau và chuyển tiếp cổng để đưa WordPress ra thế giới bên ngoài để người dùng có thể kết nối với nó.

 

Yêu Cầu  

Để làm theo hướng dẫn này , bạn cần:

 

Bước 1 — Cài đặt Docker

Trước tiên, cài đặt Docker nếu bạn chưa có. Cách nhanh nhất để cài đặt Docker là tải xuống và cài đặt tập lệnh cài đặt của chúng (bạn sẽ được nhắc nhập mật khẩu sudo).

wget -qO- https://get.docker.com/ | sh

Lệnh trên tải xuống và thực hiện một tập lệnh cài đặt nhỏ được viết bởi nhóm Docker. 

Làm việc với Docker là một hình phạt nếu người dùng của bạn không được cấu hình đúng, vì vậy hãy thêm người dùng của bạn vào nhóm docker với lệnh sau đây.

sudo usermod -aG docker $(whoami)

Đăng xuất và đăng nhập từ máy chủ của bạn để kích hoạt các nhóm mới của bạn.

Đặt Docker để tự khởi động lúc mở:

sudo systemctl enable docker.service

Cuối cùng, khởi động dịch vụ Docker:

sudo systemctl start docker.service
 

Bước 2 — Cài đặt Docker Compose

Bây giờ bạn đã cài đặt Docker, hãy tiếp tục và cài đặt Docker Compose. Đầu tiên, cài đặt python-pip  như là điều kiện tiên quyết:

sudo yum install epel-release
sudo yum install -y python-pip
  •  

Sau đó cài đặt Docker Compose:

sudo pip install docker-compose

Bạn cũng sẽ cần phải nâng cấp các gói Python của bạn trên CentOS 7 để docker-compose chạy thành công:

sudo yum upgrade python*

Bước 3 — Chạy một Container với Docker Compose

Đăng ký Docker công cộng, Docker Hub, bao gồm một hình ảnh Hello World đơn giản. Bây giờ chúng ta đã cài đặt Docker Compose, hãy thử nghiệm nó với ví dụ thực sự đơn giản này.

Đầu tiên, tạo một thư mục cho file YAML của chúng ta:

mkdir hello-world

Sau đó thay đổi thành thư mục:

cd hello-world

Bây giờ tạo tập tin YAML bằng cách sử dụng trình soạn thảo văn bản yêu thích của bạn (chúng ta sẽ sử dụng nano):

nano docker-compose.yml

Đặt các nội dung sau vào tệp, lưu tệp và thoát khỏi trình chỉnh sửa văn bản:

docker-compose.yml
my-test:
image: hello-world

Dòng đầu tiên sẽ được sử dụng như một phần của tên container. Dòng thứ hai chỉ định hình ảnh sẽ sử dụng để tạo container. Hình ảnh sẽ được tải xuống từ kho lưu trữ Docker Hub chính thức.

Trong khi vẫn còn trong thư mục ~/hello-world, hãy thực hiện lệnh sau để tạo container:

docker-compose up

Đầu ra sẽ bắt đầu với những điều sau đây:

output of docker-compose up
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 | 
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 | 
 

Đầu ra sau đó giải thích Docker đang làm gì:

  1. Trình khách Docker đã kết nối với Docker daemon.
  2. Docker daemon đã kéo hình ảnh "hello-world" từ Docker Hub.
  3. Docker daemon đã tạo một container mới từ hình ảnh đó mà  chạy tập tin thực thi để tạo ra kết quả bạn đang đọc.
  4.  Docker daemon đã truyền trực tiếp đầu ra đó tới trình khách Docker, nó đã gửi đến thiết bị đầu cuối của bạn.

Nếu quá trình không tự thoát, hãy nhấn CTRL-C.

Thử nghiệm đơn giản này không cho thấy một trong những lợi ích chính của Docker Compose - có thể mang theo một nhóm các Docker container lên và xuống cùng một lúc. Cách cài đặt Wordpress và PhpMyAdmin với Docker Soạn trên Ubuntu 14.04 bài viết cho thấy làm thế nào để sử dụng Docker Compose để chạy ba container như một nhóm ứng dụng. Nó được viết cho Ubuntu 14.04, nhưng các bước có thể dễ dàng được điều chỉnh cho CentOS 7.

 

Bước 4 - Tìm hiểu các lệnh Docker Compose

Hãy xem qua các lệnh mà công cụ docker-compose hỗ trợ.

Lệnh docker-compose  hoạt động trên cơ sở từng thư mục. Bạn có thể có nhiều nhóm Docker containers chạy trên một máy - chỉ cần tạo một thư mục cho mỗi container và một tệp docker-compose.yml cho mỗi container bên trong thư mục của nó.  

Cho đến nay chúng ta đã chạy docker-compose up của riêng chúng ta và sử dụng CTRL-C để tắt nó. Điều này cho phép thông báo gỡ lỗi được hiển thị trong cửa sổ ở cuối. Mặc dù vậy ,đây không phải là lý tưởng, khi chạy trong sản xuất bạn sẽ muốn có hành động docker-compose giống như một dịch vụ. Một cách đơn giản để làm điều này là chỉ cần thêm tùy chọn -d khi bạn up phiên của mình:

docker-compose up -d

docker-compose bây giờ sẽ rẽ nhánh xuống nền.

Để hiển thị nhóm Docker container của bạn (cả hai đã dừng và hiện đang chạy),hãy sử dụng lệnh sau:

 docker-compose ps
    •  

    Ví dụ: phần sau cho thấy container helloworld_my-test_1bị dừng lại:

     Output of `docker-compose ps`
    Name Command State Ports 
    -----------------------------------------------
    helloworld_my-test_1 /hello Exit 0 
     

    Một container đang chạy sẽ hiển thị trạng thái  Up:

    Output of `docker-compose ps`
    Name Command State Ports 
    ---------------------------------------------------------------
    nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp 

    Để dừng tất cả các Docker container đang chạy cho một nhóm ứng dụng, hãy đưa ra lệnh sau trong cùng thư mục với tệp docker-compose.yml được sử dụng để khởi động nhóm Docker:

    docker-compose stop

    Chú ý: docker-compose kill cũng có sẵn nếu bạn cần tắt mọi thứ một cách mạnh mẽ hơn.

    Trong một số trường hợp,  Docker container sẽ lưu trữ thông tin cũ của chúng trong một ổ đĩa bên trong. Nếu bạn muốn bắt đầu từ đầu, bạn có thể sử dụng lệnh rm để xóa hoàn toàn tất cả các container tạo nên nhóm container của bạn:

    docker-compose rm 

    Nếu bạn thử bất kỳ lệnh nào trong số các lệnh này từ thư mục khác với thư mục chứa Docker container và tệp .yml, nó sẽ khiếu nại và không hiển thị cho bạn container của bạn

     Output from wrong directory
    Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
    Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
     

    Bước 5 - Truy cập hệ thống tệp Docker container (Tùy chọn)

    Nếu bạn cần phải làm việc trên dấu nhắc lệnh bên trong một container,hãy sử dụng lệnh docker exec .

    Hello World! ví dụ thoát sau khi nó được chạy, vì vậy chúng ta cần phải bắt đầu một container sẽ tiếp tục chạy để sau đó có thể sử dụng docker exec để truy cập vào hệ thống tập tin cho container. Chúng ta hãy xem Nginx image từ Docker Hub.

    Tạo một thư mục mới cho nó và thay đổi nó:

    mkdir ~/nginx && cd $_
    •  

    Tạo một tệp docker-compose.yml trong thư mục mới:

    nano docker-compose.yml

    và dán vào các mục sau:

    ~/nginx/docker-compose.yml
    nginx:
    image: nginx

    Lưu file và thoát. Chúng ta chỉ cần bắt đầu container Nginx như là một tiến trình nền với lệnh sau:

     docker-compose up -d

     

      Hình ảnh Nginx sẽ được tải xuống và sau đó container sẽ được bắt đầu ở chế độ nền.

      Bây giờ chúng ta cần CONTAINER ID cho container. Danh sách tất cả các container đang chạy:

       docker ps

       

        Bạn sẽ thấy một cái gì đó tương tự như sau:

        Output of `docker ps`
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1

        Chú ý: Chỉ các containers đang chạy được liệt kê với lệnh docker ps .

        Nếu chúng ta muốn thay đổi hệ thống tập tin bên trong container này,  lấy ID của nó (trong ví dụ này là e90e12f70418) và sử dụng docker exec để khởi động một trình bao bên trong container:

         docker exec -it e90e12f70418 /bin/bash

         

          Tùy chọn -tmở ra một thiết bị đầu cuối, và tùy chọn -i làm cho nó tương tác. Các tùy chọn /bin/bash sẽ mở một bash shell vào container đang chạy. Hãy chắc chắn sử dụng ID cho container của bạn.

          Bạn sẽ thấy dấu nhắc bash cho container tương tự như:

          root@e90e12f70418:/#

          Từ đây, bạn có thể làm việc từ dấu nhắc lệnh. Tuy nhiên, hãy nhớ rằng trừ khi bạn đang ở trong một thư mục được lưu dưới dạng một phần của volume dữ liệu, các thay đổi của bạn sẽ biến mất ngay sau khi container được khởi động lại. Một lưu ý nữa là hầu hết các hình ảnh Docker được tạo ra với các cài đặt Linux rất nhỏ, vì vậy một số tiện ích dòng lệnh và các công cụ bạn đang sử dụng có thể không có mặt.

           

          Kết Luận 

          Tuyệt vời, các khái niệm cơ bản về Docker Compose và cách cài đặt và chạy nó. Kiểm tra Deploying Wordpress và PHPMyAdmin với Docker Compose trên Ubuntu 14.04 hướng dẫn cho một ví dụ phức tạp hơn về cách triển khai một ứng dụng với Docker Compose. Nó được viết cho Ubuntu 14.04, nhưng các bước có thể dễ dàng được điều chỉnh cho CentOS 7.

          Để có danh sách đầy đủ các tùy chọn cấu hình cho tệp docker-compose.yml, hãy tham khảo  Compose file reference.

          Tìm hiểu thêm những điều thú vị  tại ViCloud Community