Published on

8 bước để xây Dockerfile trên môi trường production

Authors

8 bước để xây Dockerfile trên môi trường production

  1. Sử dụng các docker images đã được kiểm chứng trên docker hub(official images), không nên cố gắng dựng nên các images từ đầu, nếu không cần thiết. Vì như vậy, sẽ tăng tính rủi ro bảo mật, đồng thời tăng kích thước của docker image, ...

    • Không nên:
        FROM ubuntu
    
        RUN apt-get update && apt-get install -y \
            node \
            && rm -rf /var/lib/apt/lists/*
    
    • Nên:
        FROM node
    
    
  2. Chỉđịnh version cụ thể cho các docker images để tránh các thay đổi không mong muốn ở latest version.

    • Không nên:
        FROM node
    
    • Nên:
        FROM node:17.0.1
    
  3. Sử dụng docker images có kích thước nhỏ nhất có thể. Có nhiều images cho nhiều hệ điều hành khác nhau, chứa những thư viện có thể không cần thiết cho ứng dụng của bạn, điều này làm tăng thời gian download/upload images, đồng thời làm tăng rủi ro bảo mật. Thông thường nên dùng images build cho hệ điều hành alpine để giảm kích thước.

    • Không nên:
        FROM node:17.0.1
    
    • Nên:
        FROM node:17.0.1-alpine
    
  4. Tận dụng tối đa caching trong quá trình build images. Cố gắng đưa các các layers có nhiều thay đổi về cuối file Dockerfile, theo trình tự từ trên xuống dưới.

    • Không nên:
        FROM node:17.0.1-alpine
        
        WORKDIR /app
    
        COPY package.json package-log.json .
    
        COPY myapp /app
    
        RUN npm install --production
    
        CMD ["node", "src/server.ts"]
    
    • Nên:
        FROM node:17.0.1-alpine
        
        WORKDIR /app
    
        COPY package.json package-log.json .
    
        RUN npm install --production
    
        COPY myapp /app
    
        CMD ["node", "src/server.ts"]
    
  5. Sử dụng .dockerignore file, để tránh copy những files không cần thiết vào trong image. Dưới dây là một ví dụ:

    .dockerignore

        .git
        .cache
    
        *.md
    
        private.key
        settings.json
    
  6. Chia quá trình build image thành hai phần: build stage và run stage. Điều này có dụng làm giảm kích thước images ở môi trường product. Trong quá trình build docker image, có thể chỉ định build ở stage cụ thể, ví dụ ở môi trường development thì chỉ cần build ở stage-build còn ở môi trường production thì ở stage-production.

        # Build stage
        FROM node:17.0.1-alpine AS build
        
        WORKDIR /app
    
        COPY package.json package-log.json .
    
        npm install --production
    
        COPY myapp /app
    
        CMD ["node", "src/server.ts"]
    
        # Production
        FROM node:17.0.1-alpine
    
        WORKDIR /app
    
        COPY --from=build /app .
    
        CMD ["node", "src/server.ts"]
    
        EXPOSE 4000
    
  7. Không chạy ứng dụng bằng quyền root, nếu không chỉ rõ user thì mặc định là root. Điều này làm tăng rũi ro bảo mật, hacker có thể dựa tận dụng lỗ hỗng trong ứng dụng để tấn công docker host.

        ...
    
        # create group and user
        RUN groupadd -r app && useradd -g app app
    
        # set ownership and permissions
        RUN chown -R app:app /app
    
        # switch to user app
        USER app
    
        CMD ["node", "server.ts"]
    

    Tuy nhiên một số images đã có sẵn các user dùng cho việc chạy ứng dụng, ví dụ đối với image node đã có sẵn user node:

        FROM node:10-alpine
    
        ...
    
        # set ownership and permissions
        RUN chown -R node:node /app
    
        # switch to node user
        USER node
    
        CMD ["node", "server.ts"]
    
  8. Sử dụng docker scan để tìm kiếm các lỗ hỗng bảo mật, hoặc sử dụng công cụ scan trên docker hub.

        $ docker scan hello-nodejs