Docker、Dockerfile 和 Docker Compose:容器化的三剑客

2023-12-28 12:20:07

1 引言

????????在现代软件开发中,容器化技术已成为不可或缺的部分。

????????它不仅提高了部署的效率和可靠性,还大大简化了应用的构建和维护过程。

????????在这篇文章中,我们将会学习了解到?Docker、Dockerfile 和 Docker Compose 这三个核心工具的基本使用方法。

2?Docker:容器化的核心力量

????????Docker 是一个开放源代码的容器化平台,允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。

????????容器运行时与宿主机环境隔离,确保了一致性和安全性。

????????使用 Docker,开发者可以快速部署和扩展应用,同时保持环境的一致性。

????????Docker 的核心优势在于它的可移植性和轻量级特性。

????????无论是在开发、测试还是生产环境,Docker 都能保证应用运行的一致性。

????????例如,使用 docker run 命令,你可以在任何安装了 Docker 的机器上运行一个容器。

?下面是一个示例👇

docker run -d --name myWebApp --restart=always \
  -p 8080:80 -e "ENV=production" \
  --memory=500m --cpu-shares=1024 \
  -v /my/local/path:/var/www/html \
  --network=my-network \
  myWebImage

参数解释

  • -d运行容器在后台模式(detached mode),容器会在后台运行并打印容器ID。

  • --name myWebApp为容器指定一个名称 myWebApp,方便后续管理和引用。

  • --restart=always设置容器的重启策略为 always,这意味着当容器退出时,Docker 会自动重启它,除非它是显式停止的。

  • -p 8080:80端口映射,这里将容器内部的 80 端口映射到宿主机的 8080 端口,这意味着外部请求到宿主机的 8080 端口会被转发到容器的 80 端口。

  • -e "ENV=production"?设置环境变量,这里设置了一个名为 ENV 的环境变量,其值为 production,应用程序可以根据该变量调整运行模式。

  • --memory=500m限制容器使用的最大内存为 500MB。

  • --cpu-shares=1024?设置容器 CPU 权重,在 CPU 资源竞争时,Docker 会根据权重分配 CPU 时间片。默认值是 1024。

  • -v /my/local/path:/var/www/html?卷挂载,将宿主机的 /my/local/path 目录挂载到容器的 /var/www/html,这通常用于持久化数据存储或配置文件的读取。

  • --network=my-network?将容器连接到一个已经存在的网络 my-network,这对于容器间的通信很有用。

  • myWebImage?最后这部分是你想要运行的 Docker 镜像名称,这里示例为 myWebImage

3?Dockerfile:定制化容器的蓝图

????????Dockerfile 是构建 Docker 镜像的蓝图,它是一个文本文件,包含了一系列指令,用于定义如何构建一个 Docker 镜像,这些指令包括添加文件、运行命令、设置环境变量等。

????????编写 Dockerfile 的关键在于理解如何有效地使用各种指令来构建轻量级且高效的镜像。

????????例如,使用 COPY 指令来添加文件到镜像中,或者使用 RUN 指令来安装必要的软件包。

? Dockerfile示例👇

# 使用多阶段构建,首先以 node:14 作为基础镜像构建阶段
FROM node:14 AS build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 用 nginx 镜像作为运行阶段的基础镜像
FROM nginx:alpine
# 将构建阶段生成的文件复制到 nginx 容器内
COPY --from=build-stage /app/build /usr/share/nginx/html
# 暴露 80 端口,nginx 默认监听此端口
EXPOSE 80
# 定义容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]

参数解释

  • FROM node:14 AS build-stage?这是一个多阶段构建的第一阶段,它使用 Node.js 14 版本的官方镜像作为基础镜像,并命名此阶段为 build-stage

  • WORKDIR /app?设置工作目录为 /app,所有后续的 RUN, CMD, ENTRYPOINT, COPY, ADD 指令都将在这个目录下执行。

  • COPY package*.json ./?将包含项目依赖信息的 package.jsonpackage-lock.json 文件复制到容器的工作目录中。

  • RUN npm install?安装定义在 package.json 中的依赖。

  • COPY . .?将当前目录下的所有文件(除了 .dockerignore 中指定的文件和目录)复制到容器的工作目录中。

  • RUN npm run build?执行构建命令,生成用于生产的代码。

  • FROM nginx:alpine?多阶段构建的第二阶段,以轻量级的 nginx 镜像为基础。

  • COPY --from=build-stage /app/build /usr/share/nginx/html?从构建阶段 build-stage 中复制构建好的文件到 nginx 镜像的相应目录下。

  • EXPOSE 80?指定容器在运行时监听的端口号,这里是 nginx 的默认端口。

  • CMD ["nginx", "-g", "daemon off;"]?容器启动时执行的命令,启动 nginx 并以前台模式运行。

4?Docker Compose:协调多容器应用的指挥官

????????Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,它允许你使用 YAML 文件来配置应用的服务,这意味着你可以在一个文件中定义多个容器及其关联。

????????Docker Compose 使得运行多容器应用变得简单。

????????例如,如果你的应用需要一个 web 服务和一个数据库,你可以在 Docker Compose 文件中定义这两个服务,并且只需一个命令 docker-compose up 就能一次性启动它们。

docker-compose.yml 示例👇

version: '3.8'

services:
  web:
    image: my-web-app:latest
    build:
      context: .
      dockerfile: Dockerfile.web
    ports:
      - "5000:5000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: postgres:13
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  db-data:
    driver: local

参数解释

  • version指定使用的 docker-compose 文件版本,这里使用的是 3.8,这通常与 Docker Engine 的版本相关联。

  • services?定义应用中的各个服务。

    • web:

      • image?指定服务使用的镜像,这里假设有一个标记为 latestmy-web-app 镜像。
      • build?定义如何构建镜像,可以指定上下文(通常是 Dockerfile 所在的目录)和 Dockerfile 的名称。
      • ports?端口映射。将容器的 5000 端口映射到宿主机的 5000 端口。
      • environment?设置环境变量。
      • depends_on?表示 web 服务依赖于 db 服务。
      • networks?指定该服务连接的网络。
    • db:

      • image?使用的数据库镜像,这里使用的是 postgres:13
      • volumes?卷挂载,用于持久化数据库数据。
      • environment?设置数据库的环境变量,如数据库名、用户和密码。
      • networks?指定该服务连接的网络。
  • networks?定义网络,app-network 使用了默认的 bridge 驱动,它允许容器间通信。

  • volumes?定义卷,db-data 使用了本地驱动,用于持久化数据库数据。

文章来源:https://blog.csdn.net/Flemming323/article/details/135209689
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。