Khóa học docker

Networking trong Docker là gì?

0 phút đọc

Docker là một nền tảng mã nguồn mở giúp đơn giản hóa quá trình phát triển, triển khai và chạy các ứng dụng bằng cách sử dụng các container. Một trong những khía cạnh quan trọng của Docker là khả năng quản lý mạng (networking) để đảm bảo rằng các container có thể giao tiếp với nhau và với thế giới bên ngoài. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về networking trong Docker, các loại mạng khác nhau, cách thiết lập và sử dụng chúng, và cung cấp các ví dụ cụ thể để minh họa.

Tổng Quan Về Docker Networking

Docker networking cho phép các container kết nối và giao tiếp với nhau hoặc với các workload không phải Docker. Mạng Docker là một mạng ảo được tạo ra bởi Docker để cho phép các container giao tiếp với nhau. Các container có thể giao tiếp với nhau mà không cần phải mở các cổng ra bên ngoài nếu chúng chạy trên cùng một host.

Các Loại Mạng Trong Docker

Docker cung cấp nhiều loại mạng khác nhau, mỗi loại phù hợp với các trường hợp sử dụng cụ thể. Các loại mạng chính bao gồm:

  1. Bridge Network: Mạng cầu nối (bridge) là loại mạng mặc định trong Docker. Các container kết nối với mạng này có thể giao tiếp với nhau nhưng bị cô lập với các container khác không thuộc mạng này.
  2. Host Network: Mạng host loại bỏ sự cô lập mạng giữa container và host Docker. Container sẽ chia sẻ stack mạng của host.
  3. None Network: Mạng none hoàn toàn cô lập container khỏi mạng, không có kết nối mạng nào được thiết lập.
  4. Overlay Network: Mạng overlay kết nối nhiều Docker daemon lại với nhau, cho phép các container trên các host khác nhau giao tiếp với nhau.
  5. IPvlan Network: Mạng IPvlan cung cấp quyền kiểm soát hoàn toàn đối với địa chỉ IPv4 và IPv6 được gán cho các container.
  6. Macvlan Network: Mạng Macvlan cho phép gán địa chỉ MAC cho container, làm cho container xuất hiện như một thiết bị vật lý trên mạng.

Cách Thiết Lập và Sử Dụng Docker Networking

Tạo Mạng Mặc Định

Khi Docker được cài đặt, một mạng cầu nối mặc định có tên là bridge được tạo ra. Mỗi container mới được tạo ra sẽ tự động kết nối với mạng này, trừ khi một mạng tùy chỉnh được chỉ định.

Tạo Mạng Tùy Chỉnh

Bạn có thể tạo các mạng tùy chỉnh và kết nối nhiều container vào cùng một mạng. Ví dụ, để tạo một mạng sử dụng driver bridge:

docker network create -d bridge my-bridge-net

Kết Nối Container Với Mạng

Bạn có thể kết nối container với mạng khi tạo container hoặc sau khi container đã được tạo.

  1. Kết Nối Khi Tạo Container

    Sử dụng tùy chọn --network để kết nối container với mạng khi tạo container:

    docker run -d --network=my-bridge-net --name=my-container nginx
  2. Kết Nối Sau Khi Tạo Container

    Sử dụng lệnh docker network connect để kết nối container với mạng sau khi container đã được tạo:

    docker network connect my-bridge-net my-container

Kiểm Tra Mạng

Sử dụng lệnh docker network inspect để kiểm tra thông tin chi tiết về một mạng Docker:

docker network inspect my-bridge-net

Lệnh này sẽ hiển thị thông tin về mạng, bao gồm các container được kết nối, driver mạng, và các thông tin cấu hình khác.

Ví Dụ: Tạo và Sử Dụng Docker Networking

Trong ví dụ này, chúng ta sẽ tạo và sử dụng Docker networking để kết nối hai container và cho phép chúng giao tiếp với nhau.

  1. Tạo Mạng Tùy Chỉnh

    Tạo một mạng cầu nối tùy chỉnh có tên là my-bridge-net:

    docker network create -d bridge my-bridge-net
  2. Tạo Dockerfile Cho Ứng Dụng Web

    Tạo một file có tên là Dockerfile với nội dung sau:

    # Sử dụng image chính thức của Node.js làm base image
    FROM node:14
    
    # Tạo thư mục làm việc trong container
    WORKDIR /app
    
    # Sao chép package.json và package-lock.json vào thư mục làm việc
    COPY package*.json ./
    
    # Cài đặt các phụ thuộc của ứng dụng
    RUN npm install
    
    # Sao chép mã nguồn ứng dụng vào thư mục làm việc
    COPY . .
    
    # Mở cổng 8080 để truy cập ứng dụng
    EXPOSE 8080
    
    # Chạy ứng dụng khi container khởi động
    CMD ["node", "app.js"]
  3. Tạo file package.json

    Tạo một file có tên là package.json với nội dung sau:

    {
      "name": "docker-example",
      "version": "1.0.0",
      "description": "A simple web application",
      "main": "app.js",
      "scripts": {
        "start": "node app.js"
      },
      "dependencies": {
        "express": "^4.17.1"
      }
    }
  4. Tạo file app.js

    Tạo một file có tên là app.js với nội dung sau:

    const express = require("express");
    const app = express();
    const port = 8080;
    
    app.get("/", (req, res) => {
      res.send("Hello, Docker Networking!");
    });
    
    app.listen(port, () => {
      console.log(`App running at http://localhost:${port}`);
    });
  5. Xây Dựng Docker Image Cho Ứng Dụng Web

    Sử dụng lệnh docker build để xây dựng Docker image từ Dockerfile:

    docker build -t docker-example .
  6. Tạo và Kết Nối Container Ứng Dụng Web

    Sử dụng lệnh docker run để tạo và kết nối container ứng dụng web với mạng my-bridge-net:

    docker run -d --network=my-bridge-net --name=web-container docker-example
  7. Tạo Container Redis

    Sử dụng lệnh docker run để tạo container Redis và kết nối nó với mạng my-bridge-net:

    docker run -d --network=my-bridge-net --name=redis-container redis
  8. Kiểm Tra Kết Nối Giữa Các Container

    Sử dụng lệnh docker exec để truy cập vào container ứng dụng web và kiểm tra kết nối với container Redis:

    docker exec -it web-container sh

    Bên trong container, sử dụng lệnh ping để kiểm tra kết nối với container Redis:

    ping redis-container

    Nếu kết nối thành công, bạn sẽ thấy các gói tin ping được gửi và nhận.

Các Thực Hành Tốt Nhất Khi Sử Dụng Docker Networking

Sử Dụng Các Image Chính Thức

Sử dụng các Docker image chính thức từ Docker Hub để đảm bảo tính bảo mật và hiệu suất.

FROM python:3.9-slim

Giảm Số Lớp (Layers)

Mỗi chỉ thị RUN, COPY, ADD tạo ra một lớp mới trong Docker image. Hãy kết hợp các lệnh lại để giảm số lớp.

RUN apt-get update && apt-get install -y \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*

Sử Dụng .dockerignore

Sử dụng file .dockerignore để loại bỏ các file không cần thiết khỏi build context, giúp giảm kích thước Docker image.

node_modules
.git
Dockerfile
.dockerignore

Không Lưu Trữ Secrets Trong Dockerfile

Không lưu trữ các thông tin nhạy cảm như mật khẩu hoặc khóa API trong Dockerfile. Sử dụng Docker secrets hoặc biến môi trường để quản lý các thông tin này.

Chạy Container Với Quyền Hạn Thấp

Tránh chạy container với quyền root. Sử dụng chỉ thị USER để thiết lập người dùng không có quyền root.

RUN useradd -m myuser
USER myuser

Kết Luận

Networking trong Docker là một khía cạnh quan trọng giúp đảm bảo rằng các container có thể giao tiếp với nhau và với thế giới bên ngoài. Bằng cách sử dụng các công cụ và phương pháp như bridge network, host network, overlay network, và các tùy chọn mạng khác, các nhà phát triển có thể dễ dàng quản lý và tối ưu hóa các container Docker của mình. Việc hiểu rõ cách thiết lập và sử dụng Docker networking sẽ giúp bạn tận dụng tối đa các lợi ích mà Docker mang lại. Bằng cách tuân theo các thực hành tốt nhất, bạn có thể đảm bảo rằng ứng dụng của mình sẽ hoạt động nhất quán và an toàn trên nhiều môi trường khác nhau.

Avatar
Được viết bởi

TechMely Team

Gợi ý câu hỏi phỏng vấn

entry

Các thành phần trong Docker bao gồm những thành phần nào?

entry

Giải thích về container trong Docker?

entry

Docker image là gì?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào