Docker 实践与应用举例

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 提供了许多进阶技巧和最佳实践,帮助开发者更高效地管理容器及其镜像。

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 目录,确保数据在容器停止后依然存在。

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.rhkb.cn/news/442675.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现&#xff0c;linux默认不带中文字体&#xff0c;因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径&#xff1a; C:\Windows\Fonts 的中文字体&#xff0c;如扩展名为 TTC 与TT…

shell脚本写代码

用简单的test语句来判断是否闰年 #! /bin/bash read -p "sd " yearif [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]thenecho "是润年"elseecho "不是闰年" fi判断一个数是否为偶数 #! /bin/bash read -p "…

LINUX——内核移植、内核编译教程

Linux内核编译是一个将内核源代码转换成可在特定硬件架构上运行的二进制文件的过程。以下是编译Linux内核的一般步骤&#xff1a; 1、准备工作&#xff1a; 确保安装了必要的编译工具&#xff0c;如gcc、make、ncurses库&#xff08;用于make menuconfig&#xff09;等。 2、…

数据结构-八大排序之堆排序

堆排序 1.1 基础知识 原理&#xff1a; 1. 利用完全二叉树构建大顶堆 2. 堆顶元素和堆底元素进行交换&#xff0c;除堆底元素之外其余元素继续构建大顶堆 3. 重复2&#xff0c;直到所有元素都不参与构建 整个数组排序完成 完全二叉树&#xff1a; 数据从上到下&#x…

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…

基于SpringBoot的设备管理系统源码带本地搭建教程

技术框架&#xff1a;SpringBoot mybatis thymeleaf Mysql5.7 Fastjson Druid Shiro 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统功能&#xff1a;登陆&#xff0c;注册&#xff0c;系统用户管理&#xff0c;角色&#xff0c;部门管理&#xff0c;…

软件测试之压力测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

《恋与深空》陷抄袭争议,但不影响它登顶App Store畅销总榜

伴随着《恋与深空》全新混池而来的&#xff0c;是文案疑似抄袭的负面新闻。 9月23日&#xff0c;《恋与深空》上线了第一个国风混池“欲揽旖旎色”&#xff0c;但比玩家的夸奖与反馈更先来的&#xff0c;是男主角之一秦彻的剧情文案抄袭的争议&#xff0c;#恋与深空 抄袭#火速…

渗透测试入门学习——使用python脚本自动跟踪csrf_token实现对网站登录界面的暴力破解

目录 写在前面 使用方法 相关代码 写在前面 最近在学习使用Burp Suite时发现其intruder模块无法实现多种模式的混合使用&#xff0c;就如想要暴力破解账号和口令两个区域并同时跟踪网页的csrf_token时BP似乎不能很方便的实现这一功能&#xff0c;于是自己在练习时就想到了用…

三 星 SCX-4521F 硒 鼓 清 零 及 一 般 故 障 维 修 浅 谈

基本参数 耗材容量:SCX-4521D3/XIL(3000页) 功 率:平均功率350W、休眠模式10W 一般故障讲解 一、三星SCX-4521F打印机更换硒鼓(或加粉)后仍显示墨粉用尽 (加粉清零、关闭碳粉通知) 按菜单------#1934(快速按完)------屏幕会有TECH字母显示------菜单------向…

0基础跟德姆(dom)一起学AI 机器学习04-逻辑回归

逻辑回归简介 应用场景 逻辑回归是解决二分类问题的利器 数学知识 sigmoid函数 概率 极大似然估计 核心思想&#xff1a; 设模型中含有待估参数w&#xff0c;可以取很多值。已经知道了样本观测值&#xff0c;从w的一切可能值中&#xff08;选出一个使该观察值出现的概率为…

Java8新特性, 函数式编程及Stream流用法大全

用了多少年的java8了&#xff0c;Lambda表达式和stream流也经常用&#xff0c;但是也仅限于某些用法比较熟练&#xff0c;看见了 Function、Consumer 等函数式接口还是一脸懵逼&#xff0c;现在来全面总结一下java8这些新特性&#xff0c;也为自己后续查找做个备忘。如果你只是…

启用vnc访问Dell 服务器IDRAC 7虚拟控制台

Dell IDRAC 7 版本太老&#xff0c;SSL证书过期&#xff0c;IDRAC的Java和本地远程虚拟机控制台访问不了&#xff0c;怎么办&#xff1f; 可以启用vnc访问IDRAC 虚拟控制台

解决雪花ID在前端精度丢失问题

解决雪花ID在前端精度丢失问题 在现代分布式系统中&#xff0c;雪花算法&#xff08;Snowflake&#xff09;被广泛用于生成唯一的ID。这些ID通常是Long类型的整数。然而&#xff0c;当这些ID从后端传递到前端时&#xff0c;JavaScript的精度限制可能会导致精度丢失&#xff0c…

Leetcode: 0021-0030题速览

Leetcode: 0021-0030题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

云手机哪款好用?2024年云手机推荐对比指南

随着云手机市场的快速扩展&#xff0c;消费者在选择云手机时面临着众多选择。为了帮助大家找到最适合自己的云手机&#xff0c;小编特意整理了一份当前市场上几款备受关注的云手机品牌对比&#xff0c;大家一起往下看吧。 1. Ogphone云手机 Ogphone云手机是近年来海外业务版块迅…

PCIe配置篇(2)——如何进行配置操作(二)

一、配置机制 我们之前提到过&#xff0c;配置空间存在于PCIe设备上&#xff0c;而处理器通常无法直接执行配置读写请求&#xff0c;因为它只能生成内存和I/O请求。这意味着RC&#xff08;Root Complex&#xff09;需要将某些访问请求转换为配置请求&#xff0c;以支持配置空间…

SpringBoot3响应式编程全套-Spring Webflux

目录 传送门前言一、组件对比二、WebFlux1、引入2、Reactor Core3、DispatcherHandler3.1、请求处理流程 4、注解开发4.1、目标方法传参4.2、返回值写法 5、文件上传6、错误处理7、RequestContext8、自定义Flux配置9、Filter 传送门 SpringMVC的源码解析&#xff08;精品&…

python操作.docx、.pptx文件

python操作.docx、.pptx文件 .docx文件和.pptx文件是Microsoft Office套件中两种常见的文件格式&#xff0c;分别对应Word文档和PowerPoint演示文稿。WPS Office完美支持Microsoft Office文件格式。 使用 Python 操作 .docx 和 .pptx 文件是一项非常实用的技能&#xff0c;尤…

ElasticSearch 备考 -- Snapshot Restore

一、题目 备份集群下的索引 task&#xff0c;存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份&#xff0c;主要是通过创建快照&#xff0c;涉及到以下2步骤 Setp1&#xff1a;注册一个备份 snapshot repository Setp2&#xff1a;创建 snapshot 可以通过两种方…