Docker 实践与应用举例

news/2024/10/12 15:13:04/

Docker 实践与应用举例

Docker 已经成为现代软件开发和部署中的重要工具,通过容器化技术,开发者可以轻松管理应用的依赖环境、简化部署流程,并实现跨平台兼容性。本篇博客将详细介绍 Docker 的基本概念、实践操作以及应用场景,帮助开发者掌握 Docker 的使用并在实际项目中应用。


在这里插入图片描述

一、Docker 基本概念

1.1 Docker 是什么?

Docker 是一种开源的容器化平台,允许开发者将应用程序及其依赖环境封装在轻量的容器中。这些容器能够跨越不同的操作系统和平台运行,极大简化了环境配置和兼容性问题。它基于 Linux 内核的 cgroup 和 namespace 技术实现了进程隔离。

1.2 容器与虚拟机的区别

容器与虚拟机(VM)都是为了解决应用隔离问题,但两者的实现方式不同:

  • 容器:共享主机操作系统内核,轻量,启动速度快,占用资源少。
  • 虚拟机:每个虚拟机都运行一个完整的操作系统,启动较慢,占用更多资源。
特性容器虚拟机
启动速度
占用资源
系统隔离
使用场景应用部署、开发完整操作系统隔离、强安全需求

在这里插入图片描述

二、Docker 基本操作

2.1 安装 Docker

在 Windows、Mac 和 Linux 系统上,安装 Docker 的步骤有所不同。这里以 Ubuntu 系统为例介绍 Docker 的安装流程:

# 更新软件包
sudo apt-get update# 安装依赖
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common# 添加 Docker 官方的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io# 启动 Docker 并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker# 验证安装是否成功
docker --version
2.2 Docker 基本命令
  1. 拉取镜像:从 Docker Hub 获取官方镜像

    docker pull ubuntu:latest
    
  2. 启动容器:启动一个 Ubuntu 容器并进入交互模式

    docker run -it ubuntu:latest /bin/bash
    
  3. 查看运行中的容器:列出当前正在运行的容器

    docker ps
    
  4. 停止容器:停止指定的容器

    docker stop <container_id>
    
  5. 删除容器:删除已停止的容器

    docker rm <container_id>
    
  6. 删除镜像:删除本地的镜像

    docker rmi ubuntu:latest
    

在这里插入图片描述

三、Docker 实践案例

3.1 使用 Docker 构建简单的 Web 应用

接下来,我们将通过 Docker 来构建一个简单的 Node.js Web 应用,并打包为 Docker 镜像以便运行在不同环境中。

3.1.1 创建 Node.js 项目

首先,我们编写一个简单的 Node.js 应用,响应 HTTP 请求。

  1. 创建项目目录:

    mkdir docker-node-app
    cd docker-node-app
    
  2. 初始化项目并安装依赖:

    npm init -y
    npm install express
    
  3. 编写 app.js

    // app.js
    const express = require('express');
    const app = express();
    const PORT = 3000;app.get('/', (req, res) => {res.send('Hello, Docker!');
    });app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
    });
    
3.1.2 编写 Dockerfile

在项目目录中创建 Dockerfile,用于定义如何构建这个应用的镜像。

# 使用官方的 Node.js 基础镜像
FROM node:14# 设置工作目录
WORKDIR /usr/src/app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装项目依赖
RUN npm install# 复制应用代码
COPY . .# 公开容器的端口
EXPOSE 3000# 启动应用
CMD ["node", "app.js"]
3.1.3 构建 Docker 镜像

使用 Dockerfile 构建镜像:

docker build -t docker-node-app .
3.1.4 运行容器

构建完成后,使用以下命令启动容器并访问 Web 应用:

docker run -p 3000:3000 docker-node-app

访问浏览器中的 http://localhost:3000,可以看到 Hello, Docker! 的输出。


3.2 使用 Docker Compose 编排多个容器

在实际项目中,应用程序通常依赖多个服务(如数据库、缓存服务等)。这时可以使用 Docker Compose 来同时启动和管理多个容器

3.2.1 创建 Docker Compose 文件

假设我们有一个 Node.js 应用,并且它依赖于 PostgreSQL 数据库。我们可以使用 Docker Compose 来编排这两个服务。

首先,创建一个 docker-compose.yml 文件:

version: '3'
services:web:build: .ports:- "3000:3000"depends_on:- dbdb:image: postgres:13environment:POSTGRES_USER: userPOSTGRES_PASSWORD: passwordPOSTGRES_DB: mydatabasevolumes:- db-data:/var/lib/postgresql/datavolumes:db-data:
  • web 服务:构建我们之前创建的 Node.js 应用。
  • db 服务:使用官方的 PostgreSQL 镜像,并设置环境变量初始化数据库。
3.2.2 启动应用

使用以下命令启动多容器应用:

docker-compose up

这将同时启动 Node.js 应用和 PostgreSQL 数据库,并且两者可以通过网络互相通信。

3.2.3 访问服务

打开浏览器,访问 http://localhost:3000,依旧可以看到 Hello, Docker! 的输出。与此同时,Node.js 应用可以连接到 db 服务访问 PostgreSQL 数据库。


在这里插入图片描述

四、Docker 实际应用场景

  1. 开发环境一致性:开发人员可以通过 Docker 容器来确保每个人的开发环境一致,避免了“在我的机器上没问题”的问题。

  2. 自动化测试:CI/CD 流水线中,使用 Docker 可以在每次代码提交后自动构建并运行测试环境,确保代码的稳定性。

  3. 应用隔离:在同一台主机上运行多个应用时,每个应用可以独立运行在不同的容器中,避免相互干扰。

  4. 微服务架构:Docker 天然适合微服务架构的应用,每个微服务都可以打包成独立的容器,并通过 Docker Compose 或者 Kubernetes 编排。


在这里插入图片描述

五、进阶技巧与最佳实践

在实际的开发与部署过程中,Docker 提供了许多进阶技巧和最佳实践,帮助开发者更高效地管理容器及其镜像。

dockerignore__240">5.1 使用 .dockerignore 文件

.gitignore 文件类似,Docker 提供了 .dockerignore 文件,用来指定在构建镜像时,哪些文件或目录应该被忽略。这样可以避免将无关文件(如本地日志、node_modules 或者 Git 相关文件)复制到镜像中,减少镜像的大小和构建时间。

示例 .dockerignore 文件:

node_modules
npm-debug.log
.git
5.2 多阶段构建(Multi-stage Builds)

多阶段构建允许在一个 Dockerfile 中使用多个 FROM 语句,以优化镜像大小和构建过程。例如,你可以在一个镜像中进行应用的构建,然后只将最终构建的产物复制到另一个轻量级镜像中。

下面是一个使用多阶段构建的示例,在构建 Node.js 应用时,只将最终编译后的文件复制到新的镜像中:

# 第一阶段:构建阶段
FROM node:14 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 第二阶段:生产环境
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/app.js"]

这种方式能有效减小镜像的体积,避免不必要的依赖和中间文件被打包到最终镜像中。

5.3 镜像缓存与分层优化

Docker 镜像是基于层(layer)构建的,每一条 Dockerfile 指令都会生成一个新的镜像层。因此,合理地组织 Dockerfile,可以大大提高构建效率,利用 Docker 缓存,避免每次构建时重复执行相同的步骤。

例如,在 Dockerfile 中将不常变化的指令(如安装依赖)放在前面,变化较多的指令(如复制代码)放在后面,这样可以更好地利用缓存。

# 先安装依赖
COPY package*.json ./
RUN npm install# 后复制代码
COPY . .
5.4 数据卷和持久化存储

容器中的数据是临时的,如果容器被删除,所有的容器内数据都会丢失。因此,使用 数据卷(Volume) 可以持久化数据,并允许容器间共享数据。

使用 Docker 命令挂载卷:

docker run -d -v /host/data:/container/data myapp

这将宿主机的 /host/data 目录挂载到容器内的 /container/data 目录,确保数据在容器停止后依然存在。

dockercomposeyml__296">5.5 使用 docker-compose.yml 文件进行环境变量管理

在实际应用中,不同环境(开发、测试、生产)通常会使用不同的配置。使用 Docker Compose,可以在 docker-compose.yml 中配置环境变量,或者通过 .env 文件来管理。

version: '3'
services:web:image: myappenvironment:- NODE_ENV=production- DB_HOST=dbdb:image: postgresenvironment:- POSTGRES_USER=user- POSTGRES_PASSWORD=secret

或者使用 .env 文件来设置:

NODE_ENV=production
DB_HOST=db

然后在 docker-compose.yml 中通过 ${VAR_NAME} 的方式引用环境变量:

environment:- NODE_ENV=${NODE_ENV}- DB_HOST=${DB_HOST}
5.6 安全性与权限管理

在生产环境中,运行 Docker 容器时要特别注意安全问题。以下是几个常见的安全实践:

  • 使用非 root 用户:不要以 root 权限运行容器,应该在 Dockerfile 中创建非 root 用户并切换到该用户运行应用。

    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    USER appuser
    
  • 最小化镜像:尽量使用轻量化的基础镜像,如 alpine,减少攻击面。

  • 限制资源:通过 --memory--cpus 参数限制容器的内存和 CPU 使用,避免资源滥用。

    docker run -m 512m --cpus 1 myapp
    

在这里插入图片描述

六、总结

通过 Docker,开发者可以快速构建、测试和部署应用,解决环境不一致性的问题,并大大提高团队协作效率。本文详细介绍了 Docker 的基础操作、应用案例、进阶技巧和最佳实践。从构建简单的 Web 应用,到使用 Docker Compose 编排多容器应用,再到优化 Dockerfile 和提升容器安全性,每个环节都展示了 Docker 在现代开发中的强大作用。

在未来,Docker 及其相关的容器化技术(如 Kubernetes)将继续在云原生架构中扮演重要角色。通过掌握 Docker,你将能更好地应对复杂的应用部署和管理需求,提升开发和运维的整体效率。
在这里插入图片描述


http://www.ppmy.cn/news/1537912.html

相关文章

vue项目启动的报错问题

背景 三年前的一个vue3项目&#xff0c;当时用的14版本开发的&#xff0c;最近想把它接入到我的主应用中&#xff0c;在启动中&#xff0c;由于自己用的node版本是16&#xff0c;导致安装依赖的时候&#xff0c;发生了报错 具体报错内容 npm WARN deprecated node-sass4.14.…

知识图谱入门——11:构建动态图谱渲染应用:Vue3与Neo4j的集成与实践

在知识图谱与大数据技术领域&#xff0c;构建动态图谱是一项非常重要的任务。这篇博客将带你深入了解如何利用Vue.js、D3.js以及Neo4j&#xff0c;开发一个能够实时渲染图谱节点和关系的应用。我们将从零开始&#xff0c;介绍如何搭建开发环境、安装依赖、与Neo4j数据库交互、到…

CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付

在本篇文章中&#xff0c;我们将继续探讨如何使用 Cocos Creator 开发 Telegram 游戏&#xff0c;重点介绍如何集成 TON 支付功能。通过这一教程&#xff0c;开发者将学会如何在游戏中接入 TON Connect&#xff0c;实现钱包连接、支付以及支付后的校验流程&#xff0c;最终为 W…

《Windows PE》4.3 延迟加载导入表

延迟加载导入表&#xff08;Delayed Import Table&#xff09;是PE文件中的一个数据结构&#xff0c;用于实现延迟加载&#xff08;Lazy Loading&#xff09;外部函数的机制。 延迟加载是指在程序运行时&#xff0c;只有当需要使用某个外部函数时才进行加载和绑定&#xff0c;…

第二份代码:PointNet++

参考的依然是Pytorch的实现&#xff0c;PointNet里面的主要实现部分都在utils.py里&#xff0c;里面从微小模块逐渐的&#xff0c;搭建出网络中的几个主要模块结构&#xff0c;包括sampling&group等&#xff0c;所以我们主要分析的就是这个utils.py里面的内容 这份Pytorch实…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…

DB-GPT 安装

从源代码开始安装&#xff0c;因为docker镜像库不能用了。。。 参考官网&#xff1a; https://docs.dbgpt.site/docs/latest/quickstart 安装文档 - source https://docs.dbgpt.site/docs/latest/installation/sourcecode 下载源代码 Download DB-GPT git clone https://gith…

边缘人工智能(Edge Intelligence)

边缘人工智能&#xff08;Edge AI&#xff09;是指在边缘设备上直接运行人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;算法的技术。机器学习是一个广泛的领域&#xff0c;近年来取得了巨大的进步。它所基于的原则是&#xff0c;计算机可以通过从数据…