Tìm hiểu về docker

1. Docker là gì?

    Docker là một nền tảng cung cấp cho lập trình viên cách building, deploying và running ứng dụng một cách dễ dàng bằng biện pháp sử dụng containers (nền tảng ảo hóa). Ban đầu, Docker được viết bằng Python nhưng đến hiện tại thì nó đã chuyển sang Golang.

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

  • Docker image: nó được xem là những template nằm trong Docker Container. Nó bao gồm tất cả những thứ cần thiết để dự án của bạn có thể chạy được ví dụ như nó có thể là file hình ảnh, file của một nền tảng, một ngôn ngữ hoặc của một hệ điều hành hay 1 mã nguồn. Các Image được chia sẻ công khai ở Docker Hub để tất cả mọi người có thể cùng nhau sử dụng và phát triển.
  • Docker Container: là một máy ảo và là phiên bản thực thi các lệnh của Docker Image khi *Container *nắm giữ toàn bộ các package cần thiết để khởi động và chạy ứng dụng.
  • Docker Hub: là dịch vụ cloud gần giống như Github có khả năng tự động hóa chuỗi các công việc liên tục và chia sẻ các ứng dụng. Nó cho phép người dùng thao tác pull/ push với các images.
  • Docker Engine: như là 1 công cụ có thể đóng gói ứng dụng và vận hành chúng.

3. Tại sao phải sử dụng Docker?

  • Chia sẻ, lưu trữ môi trường dự án của nhóm: các Container trong Docker cho phép người dùng lưu trữ và chia sẻ môi trường dự án và làm việc với nhiều người trong nhóm một cách dễ dàng.
  • Giả lập môi trường trên server ở dưới máy local: việc sử dụng Docker sẽ cho phép người dùng giả lập hoàn toàn một môi trường server mới dưới máy local một cách nhanh chóng và hoàn hảo nhất.
  • Trải nghiệm và dùng thử một hệ điều hành mới: với Docker bạn sẽ không cần phải sử dụng* Virtual Studio* khi muốn trải nghiệm và dùng thử một hệ điều hành mới.

4. Dockerfile là gì? Làm thế nào để tạo ra một Docker Imgae từ Dockerfile?

    Docker sẽ xây dựng (build) Docker Image một cách tự động bằng cách đọc các chỉ thị (instruction) đã được khai báo trong một file có tên là Dockerfile. Dockerfile là một file văn bản chứa toàn bộ các chỉ thị lệnh mà người dùng muốn thực thi để tạo ra một Docker Image.

    Một số lệnh thường dùng trong Dockerfile

  • FROM <image>:<phiên_bản>: dùng cho quá trình khởi tạo xây dựng một Docker Image mới và dùng để chỉ ra image gốc nào sẽ là cơ sở để build Image thực hiện các chỉ thị kế tiếp.
  • RUN <command>: sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.
  • CMD <command>: Trong Dockerfile chỉ có duy nhất 1 lệnh CMD, được sử dụng để cung cấp câu lệnh mặc định sẽ được chạy khi Docker Container khởi động từ Image đã build. CMD không thực thi câu lệnh ở quá trình build image, mà sẽ thực thi trong quá trình chạy Docker Container từ Image đó.
  • ENTRYPOINT<command>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.
  • SHELL ["executable", "parameters"]: Chỉ thị Shell cho phép các shell form khác, có thể ghi đè shell mặc định.
  • ENV <key> <value>: dùng để khai báo biến môi trường tên <key> với giá trị <value> trong Container.
  • LABEL <key>=<value>: dùng để thêm các thông tin metadata vào* Docker Image* khi được build. Một Image có thể có nhiều nhãn (label) thông tin metadata.
  • WORKDIR

        :

    dùng để khai báo thư mục làm việc cho các lệnh chỉ thị: RUN, CMD, ENTRYPOINT, COPYADD.
  • EXPOSE <port> : lắng nghe kết nối trên các cổng được chỉ định khi khởi chạy.
  • VOLUME <folder_name>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.
  • ADD <src>...<dest>: dùng để copy file, thư mục từ vị trí thư mục đang build trên local client hoặc remote files URL (src) và thêm chúng vào filesystem của Image (dest).
  • USER <user>[:<group>]: dùng để khai báo thông tin username sử dụng khi chạy Image và cũng là user dùng để chạy các lệnh chỉ thị khác như :RUN, CMDENTRYPOINT.
  • MAINTAINER <name>: câu lệnh này dùng để khai báo trên người tạo ra Image, chúng ta có thể khai báo nó hoặc không. Bây giờ chúng ta sẽ bắt đầu tạo ra Image từ Dockerfile. Chúng ta tạo 1 thư mục rỗng sau đó tạo 1 file có tên là Dockerfile có nội dung như sau:
    FROM ubuntu
     RUN apt-get update
     RUN apt-get install wget -y
    

    Sau đó, chúng ta trỏ đến thư mục chứa file Dockerfile và chạy câu lệnh docker build ./ và đón xem kết quả:

Sending build context to Docker daemon  2.048kB
 Step 1/3 : FROM ubuntu
  ---> ba6acccedd29
 Step 2/3 : RUN apt-get update
  ---> Using cache
  ---> 9c0a684e07fa
 Step 3/3 : RUN apt-get install wget -y
  ---> Using cache
  ---> a67e49323141
 Successfully built a67e49323141

    Sau khi build thành công, chúng ta thực hiện run Image bằng lệnh:

docker run -p 8002:8002 a67e49323141

5. Cách tạo Docker Image trên Docker Hub:

    Để tạo được Docker Image trên Docker Hub ta cần thực hiện các bước sau:

  1.     Tạo tài khoản và đăng nhập vào trang hub.docker.com

  2.     Tìm và click Create Repository

  3.     Điền các thông tin cần thiết và chọn public

  4.     Đăng nhập Docker Hub bằng command line:

    $ sudo docker login --username=<your_docker_hub_username>
    
  5.     Kiểm tra ID của image cần sử dụng:

        $ sudo docker images

        Nếu image chưa được gắn tag thì hãy gắn tag cho nó bằng câu lệnh:

    docker tag <image_id> <your_hub_username>/<your_repository>:<tag>
    
  6.     Để đưa Image lên Docker Hub bạn cần sử dụng câu lệnh:

    docker push <your_hub_username>/<your_repository>:tag_name
    

6. Tổng hợp các câu lệnh khi thao tác với Docker Container:

    Dưới đây là những thao tác thường được sử dụng với Docker Container, ngoài ra còn nhiều câu lệnh khác các bạn có thể tham khảo tại Đây

  • docker container commit: Tạo Image mới từ những thay đổi của Container.
  • docker container create: Tạo Container mới.
  • docker container exec: Chạy các command khi Container đang hoạt động.
  • docker container kill: Chấm dứt hoạt động của một hoặc nhiều Container.
  • docker container pause: Tạm dừng tất cả tiến trình bên trong một hoặc nhiều Container.
  • docker container run: Chạy các command trong một Container mới.
  • docker container start: Chạy một Container hoặc nhiều Container đã dừng.
  • docker container rename: Đổi tên Container.
  • docker container restart: Khởi động lại một hoặc nhiều Container
  • docker container stop: Dừng 1 hoặc nhiều Container đang chạy
  • docker container rm: Xóa 1 hoặc nhiều Container

7. Tổng hợp các câu lệnh thường dùng khi thao tác với Docker Image:

  • docker images: Liệt kê các Image
  • docker image build: Build image từ file Dockerfile.
  • docker image history: Xem lịch sử của Image.
  • docker image import: Import nội dung từ tarball để tạo ra filesystem của Image.
  • docker image inspect: Hiển thị thông tin chi tiết của một hoặc nhiều Image.
  • docker image load: Nạp image từ file *.tar hoặc STDIN.
  • docker image prune: Xóa các Image không sử dụng.
  • docker image pull: Pull một Image hoặc repository từ Docker HUB đăng ký.
  • docker image push: Đẩy Image, repository lên Docker HUB.
  • docker image save: Lưu một hoặc nhiều image vào file *.tar.
  • docker image tag: Gắn tag cho TARGET_IMAGE tương ứng với SOURCE_IMAGE.

8. Docker Volume là gì?

    Như chúng ta đều biết, đặc điểm của Docker Container là chúng chạy độc lập, và không ảnh hưởng đến nhau, thế nhưng vì một lí do nào đó, chúng ta lại muốn chia sẻ data giữa các Container ví dụ, bạn có 1, 2, 3 web server nginx và mong muốn khi chúng share chung các file config, hay html tĩnh. May mắn docker cung cấp volume để thực hiện việc đó.

    Docker volume là một volume được tạo ra cho phép các container mount volume vào trong các container hay dễ hiểu hơn là đocker sử dụng Volume đó thay thế cho 1 folder của container. Về hoạt động Volume tương tự như Bind mounts, nhưng Volume được quản lý bởi Docker. Trong khi bind mounts, file hoặc thư mục cần mount phải được tồn tại trên docker host.Volume hoạt động trên cả Linux và Windows container.

    Sử dụng Volume khi nào?

  • Khi chia sẻ dữ liệu giữa nhiều container đang chạy.
  • Lưu dữ liệu tới một server remote hoặc cloud.
  • Khi cần backup, restore hoặc migrate dữ liệu từ Docker Host này sang Docker Host khác.
  • Cần quản lý dễ dàng và thuận tiện hơn so với bind mounts.

9. Docker Compose là gì?

    Docker compose là công cụ dùng để định nghĩa và run multi-container cho ứng dụng Docker. Với Compose bạn sử dụng file YAML để config các services cho application của bạn. Sau đó dùng command để create và run từ những config đó.

    Để sử dụng Docker Compose thì chỉ với ba bước:

  • Khai báo app’s environment trong Dockerfile.
  • Khai báo các services cần thiết để chạy application trong file docker-compose.yml.
  • Run docker-compose up để start và run app.

    Các cú pháp sử dụng trong file config Docker Compose:

  •     version: chỉ ra phiên bản docker-compose đã sử dụng.

  •     services: thiết lập các services (containers) muốn cài đặt và chạy.

  •     image: chỉ ra image được sử dụng trong lúc tạo ra container.

  •     build: dùng để tạo container.

  •     ports: thiết lập ports chạy tại máy host và trong container.

  •     restart: tự động khởi chạy khi container bị tắt.

  •     environment: thiết lập biến môi trường ( thường sử dụng trong lúc config các thông số của DB).

  •     depends_on: chỉ ra sự phụ thuộc. Tức là services nào phải được cài đặt và chạy trước thì service được config tại đó mới được chạy.

  •     volumes: dùng để mount hai thư mục trên host và container với nhau.

        Để run Docker Compose chạy lệnh: docker-compose up -d

Tổng kết:

    Trong bài này, mình chủ yếu là giới thiệu lý thuyết để mình hiểu về Docker và các thành phần chính của Docker. Trong quá trình viết bài mình cũng cần tìm hiểu và học được rất nhiều cái mới mẻ. Mình rất mong nhận được sự góp ý của các bạn qua phần comment bên dưới nhé! Cảm ơn các bạn đã lắng nghe bài chia sẻ của mình.

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan