Khóa học docker

Docker file là gì?

0 phút đọc

Dockerfile là gì?

Dockerfile là một file văn bản chứa các chỉ thị (instructions) để Docker sử dụng nhằm tự động xây dựng một Docker image. Dockerfile giúp định nghĩa các bước cần thiết để tạo ra một image, từ việc cài đặt các gói phần mềm, sao chép file, thiết lập biến môi trường, đến việc chỉ định các lệnh sẽ được thực thi khi container khởi động. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về Dockerfile, cấu trúc của nó, các chỉ thị phổ biến, và cung cấp các ví dụ cụ thể để minh họa.

Tổng Quan Về Dockerfile

Dockerfile là một file văn bản không có phần mở rộng, thường được đặt tên là Dockerfile. File này chứa một tập hợp các chỉ thị mà Docker sẽ thực thi tuần tự để tạo ra một Docker image. Mỗi chỉ thị trong Dockerfile tạo ra một lớp (layer) mới trong Docker image, và các lớp này được xếp chồng lên nhau để tạo thành image cuối cùng.

Cấu Trúc Của Dockerfile

Cấu trúc của một Dockerfile bao gồm các dòng chỉ thị, mỗi dòng bắt đầu bằng một từ khóa (instruction) và theo sau là các đối số (arguments). Các chỉ thị thường được viết bằng chữ in hoa để dễ phân biệt.

Ví dụ về cấu trúc Dockerfile:

# Comment
INSTRUCTION arguments

Các Chỉ Thị Phổ Biến Trong Dockerfile

Dưới đây là một số chỉ thị phổ biến trong Dockerfile và cách sử dụng chúng:

FROM

Chỉ thị FROM xác định image cơ bản để xây dựng image mới. Đây là chỉ thị bắt buộc và phải là dòng đầu tiên trong Dockerfile.

FROM ubuntu:20.04

LABEL

Chỉ thị LABEL được sử dụng để thêm metadata vào image, chẳng hạn như thông tin về phiên bản, tác giả, hoặc mô tả.

LABEL maintainer="yourname@example.com"
LABEL version="1.0"
LABEL description="This is a sample image"

RUN

Chỉ thị RUN thực thi một lệnh trong quá trình xây dựng image. Mỗi lệnh RUN tạo ra một lớp mới trong Docker image.

RUN apt-get update && apt-get install -y curl

COPY

Chỉ thị COPY sao chép file hoặc thư mục từ máy chủ Docker vào image.

COPY . /app

ADD

Chỉ thị ADD tương tự như COPY, nhưng có thể xử lý các file nén và URL.

ADD https://example.com/file.tar.gz /app/

CMD

Chỉ thị CMD chỉ định lệnh sẽ được thực thi khi container khởi động. Chỉ có một chỉ thị CMD cuối cùng sẽ được thực thi nếu có nhiều chỉ thị CMD trong Dockerfile.

CMD ["python", "app.py"]

ENTRYPOINT

Chỉ thị ENTRYPOINT tương tự như CMD, nhưng không thể bị ghi đè bởi các đối số dòng lệnh khi container khởi động.

ENTRYPOINT ["python", "app.py"]

ENV

Chỉ thị ENV thiết lập các biến môi trường.

ENV APP_HOME /app

EXPOSE

Chỉ thị EXPOSE khai báo các cổng mà container sẽ lắng nghe.

EXPOSE 8080

VOLUME

Chỉ thị VOLUME tạo một điểm gắn kết để lưu trữ dữ liệu bền vững.

VOLUME ["/data"]

WORKDIR

Chỉ thị WORKDIR thiết lập thư mục làm việc cho các chỉ thị tiếp theo.

WORKDIR /app

USER

Chỉ thị USER thiết lập người dùng để thực thi các chỉ thị tiếp theo.

USER appuser

Ví Dụ: Tạo và Chạy Ứng Dụng Web Đơn Giản Với Dockerfile

Trong ví dụ này, chúng ta sẽ tạo và chạy một ứng dụng web đơn giản sử dụng Dockerfile.

  1. Tạo Dockerfile

    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"]
  2. 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"
      }
    }
  3. 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!");
    });
    
    app.listen(port, () => {
      console.log(`App running at http://localhost:${port}`);
    });
  4. Xây Dựng Docker Image

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

    docker build -t docker-example .
  5. Chạy Docker Container

    Sử dụng lệnh docker run để tạo và chạy một container từ Docker image vừa xây dựng:

    docker run -d -p 8080:8080 --name my-docker-app docker-example
  6. Truy Cập Ứng Dụng

    Mở trình duyệt web và truy cập http://localhost:8080. Bạn sẽ thấy thông báo "Hello, Docker!".

Các Thực Hành Tốt Nhất Khi Viết Dockerfile

Để đảm bảo Dockerfile của bạn hiệu quả và bảo mật, hãy tuân theo các thực hành tốt nhất sau:

Sử Dụng Multi-stage Builds

Multi-stage builds cho phép bạn tạo ra các Docker image gọn nhẹ và bảo mật hơn bằng cách tách biệt quá trình xây dựng và kết quả cuối cùng.

# Stage 1: Build
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

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.

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

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

Dockerfile là một công cụ mạnh mẽ giúp tự động hóa quá trình xây dựng Docker image. Bằng cách sử dụng Dockerfile, các nhà phát triển có thể đảm bảo rằng ứng dụng của họ sẽ hoạt động nhất quán trên nhiều môi trường khác nhau. Việc hiểu rõ cấu trúc và các chỉ thị của Dockerfile, cùng với việc tuân theo các thực hành tốt nhất, sẽ giúp bạn tạo ra các Docker image hiệu quả và bảo mật.

Việc sử dụng Dockerfile không chỉ giúp tiết kiệm thời gian và công sức mà còn đảm bảo tính nhất quán và bảo mật cho các ứng dụng container hóa. Bằng cách tận dụng các tính năng của Dockerfile, các nhà phát triển và doanh nghiệp có thể nâng cao hiệu quả và chất lượng của quy trình phát triển phần mềm.

Avatar
Được viết bởi

TechMely Team

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

Gợi ý bài viết

Bình luận

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

Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely