当前位置: 首页 > news >正文

从基础到进阶:Docker 实践与应用的全方位解析

1. Docker 基础操作示例

示例:启动 Nginx 容器
# 拉取 Nginx 镜像
docker pull nginx# 启动一个 Nginx 容器并映射主机的 8080 端口到容器的 80 端口
docker run -d -p 8080:80 --name my-nginx nginx
解析:
  • docker pull nginx:从 Docker Hub 拉取官方的 Nginx 镜像。
  • docker run -d -p 8080:80 --name my-nginx nginx:启动容器,-d 参数使容器在后台运行,-p 将主机的端口 8080 映射到容器的 80 端口,--name 为容器命名。
  • 通过访问 http://localhost:8080 可以看到 Nginx 的默认页面。

2. 持久化与数据卷

示例:使用数据卷持久化数据
# 创建一个带有数据卷的 MySQL 容器,持久化数据库数据
docker run -d -p 3306:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 \
-v /mydata/mysql:/var/lib/mysql mysql
解析:
  • -v /mydata/mysql:/var/lib/mysql:将主机的 /mydata/mysql 目录挂载到容器内部的 /var/lib/mysql 目录,用于持久化数据库数据。即使容器删除,数据仍然保存在主机上。
  • 这个示例展示了 Docker 容器数据持久化的功能,使得数据库数据不会因为容器停止或删除而丢失。

3. Docker Compose 示例

示例:使用 Docker Compose 部署多容器应用

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

version: '3'
services:web:image: nginxports:- "8080:80"db:image: mysqlenvironment:MYSQL_ROOT_PASSWORD: 123456volumes:- db_data:/var/lib/mysqlvolumes:db_data:
解析:
  • docker-compose.yml 文件定义了一个简单的两服务应用,一个 Nginx(web)和一个 MySQL 数据库(db)。
  • volumes 部分使用命名卷(db_data)来持久化 MySQL 的数据。
  • 通过 docker-compose up -d 启动项目,实现快速启动和管理多个容器。

4. Docker 实际应用场景

场景 1:开发环境隔离

开发人员可以为不同项目创建独立的 Docker 容器,避免由于项目依赖不同版本的库而导致的冲突问题。比如,你可以为一个 Python 项目和一个 Node.js 项目分别创建不同的容器:

# Python 环境
docker run -d --name python-dev -v $(pwd):/usr/src/app -w /usr/src/app python:3.9 bash# Node.js 环境
docker run -d --name node-dev -v $(pwd):/usr/src/app -w /usr/src/app node:14 bash
解析:
  • 使用 Docker 可以为每个项目配置不同的开发环境,确保相互隔离,极大提高开发效率和环境一致性。
场景 2:自动化测试

在 CI/CD 环境中,Docker 可以用于搭建一系列测试服务,例如使用 Docker 启动数据库、Redis 等服务,测试后可以快速销毁容器。

# 使用 Docker 启动测试环境
docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --name test-redis redis# 运行测试后停止容器
docker stop test-mysql test-redis
docker rm test-mysql test-redis
解析:
  • 通过 Docker 提供的快速启动和停止功能,开发者可以在自动化测试中实现临时的测试环境搭建,节省资源并加快测试效率。

5. Docker 镜像优化技巧

示例:构建精简的镜像

在开发中我们可以构建较小的 Docker 镜像以提高镜像拉取和部署的速度。以下是一个基于 Alpine 构建精简的 Node.js 镜像的示例:

# 使用 Alpine 作为基础镜像
FROM node:14-alpine# 设置工作目录
WORKDIR /usr/src/app# 复制 package.json 并安装依赖
COPY package*.json ./
RUN npm install --only=production# 复制项目文件
COPY . .# 启动应用
CMD ["node", "app.js"]
解析:
  • node:14-alpine 是一个基于 Alpine Linux 的精简版 Node.js 镜像,体积比标准 Node.js 镜像小很多。
  • 使用 npm install --only=production 只安装生产环境依赖,进一步减少镜像体积。

6. 安全性考虑

在实际生产环境中,Docker 安全性尤为重要。例如,可以为容器设置只读文件系统:

docker run -d --read-only --name secure-nginx -p 8080:80 nginx
解析:
  • --read-only 参数使容器的文件系统变为只读,防止容器内部应用或恶意代码修改文件系统,增加容器的安全性。

7. Docker 网络配置

示例:创建用户自定义网络
# 创建自定义网络
docker network create my-network# 运行两个容器并加入自定义网络
docker run -d --name container1 --network my-network nginx
docker run -d --name container2 --network my-network busybox sleep 1000
解析:
  • Docker 默认提供了 bridge 网络,但在实际应用中,自定义网络更适合多容器间的通信。自定义网络可以让容器通过名称相互访问,而不需要配置 IP 地址。
  • 例如,container1 可以通过 ping container2container2 通信。
场景:微服务架构中的容器网络

在微服务架构中,每个服务可以运行在单独的容器中,通过 Docker 的网络功能相互通信。使用自定义网络能够确保服务间的隔离与稳定的内部通信。

8. Docker 容器编排与 Swarm 模式

示例:使用 Docker Swarm 创建集群
# 初始化 Docker Swarm 集群
docker swarm init# 创建服务并在集群中运行
docker service create --name my-service -p 80:80 nginx# 查看集群状态
docker service ls
解析:
  • Docker Swarm 是 Docker 自带的原生容器编排工具,用户可以通过 Swarm 将多个节点集成到一个集群中,并在其上部署服务。
  • 通过 Swarm 模式,服务可以在不同节点间平衡运行,提供容错和负载均衡能力,非常适合分布式应用的部署和管理。
场景:大规模分布式应用

在大规模应用中,Docker Swarm 或 Kubernetes 可以用来自动管理成千上万的容器实例,实现集群管理、负载均衡、自动恢复等功能,提升应用的可用性和扩展性。

9. 使用 Dockerfile 进行持续集成和交付 (CI/CD)

示例:Jenkins 中的 Docker 集成

在 CI/CD 环境中,Docker 可以与 Jenkins 集成,通过 Docker 镜像打包和自动化测试实现持续交付。以下是 Jenkins Pipeline 的示例:

pipeline {agent anystages {stage('Build') {steps {script {dockerImage = docker.build("my-app:${env.BUILD_ID}")}}}stage('Test') {steps {script {dockerImage.inside {sh 'npm test'}}}}stage('Deploy') {steps {script {dockerImage.push()}}}}
}
解析:
  • 使用 Jenkins Pipeline,开发人员可以自动化地构建 Docker 镜像、运行测试并将镜像推送到 Docker Registry,实现了完整的 CI/CD 流程。
  • docker.build 会根据项目的 Dockerfile 构建镜像,而 dockerImage.inside 方法则可以在构建的容器内运行测试,确保测试环境与生产环境一致。
场景:持续交付与自动化运维

在 DevOps 流程中,Docker 与 Jenkins、GitLab CI 等工具的结合,可以极大提高开发和交付的效率,减少手动配置和潜在错误,实现快速迭代。

10. Docker 多阶段构建

示例:多阶段构建优化镜像
# 使用 node 镜像编译代码
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build# 使用精简版的 nginx 镜像部署
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
解析:
  • 多阶段构建允许你在一个 Dockerfile 中使用多个镜像。第一阶段编译应用代码,第二阶段使用精简版的镜像进行部署。这种方式可以避免将不必要的依赖和构建工具包含在最终的镜像中,显著减少镜像大小。
场景:生产环境镜像优化

在生产环境中,镜像体积直接影响拉取和部署的速度。通过多阶段构建,开发者可以大幅减少镜像体积,确保只包含最少的运行时依赖,从而提高部署效率。

11. 使用 Docker 制作私有镜像仓库

示例:搭建 Docker Registry
# 启动一个 Docker Registry 容器
docker run -d -p 5000:5000 --name my-registry registry:2# 打标签并推送镜像到私有仓库
docker tag nginx localhost:5000/my-nginx
docker push localhost:5000/my-nginx
解析:
  • Docker Registry 可以用于存储和管理私有镜像,在需要时可以从私有仓库中快速拉取镜像。
  • 搭建私有镜像仓库有助于保护企业内部的镜像资源,确保数据安全,同时也提高了镜像分发的速度。

总结

Docker 提供了从开发环境搭建、测试、持续集成到生产部署的一整套解决方案。通过 Docker,开发者可以更轻松地实现应用的隔离、部署和管理。

相关文章:

  • 从零开始搭建UVM平台(二)-加入factory机制
  • Junit 5 - 理解Mockito,提高UT 覆盖率
  • element plus 重写drawer\dialog样式不生效
  • 【Python快速学习笔记01】下载解释器/环境变量配置/PyCharm下载/第一个代码
  • 笔记整理—linux进程部分(1)进程终止函数注册、进程环境、进程虚拟地址
  • 如何在iPad上用Chrome实现无痕浏览
  • 亚信安慧AntDB基于操作符的隐式转换
  • 【k8s】:DevOps 模式详解
  • ASCII Unicode UTF-8 字符集 字符编码
  • 使用腾讯地图,在地图上圈选标记半径范围
  • 预防工作场所的违规政策
  • Vue 技术入门 day1 模版语法、数据绑定、事件处理、计算属性与监视、class和style绑定、条件渲染v-if/v-show、列表渲染v-for
  • 回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出
  • 召回06 双塔模型two-tower(DSSM)
  • 【中间件——基于消息中间件的分布式系统的架构】
  • conda常用的命令
  • Java小白进阶笔记(3)-初级面向对象
  • jdbc就是这么简单
  • Leetcode 27 Remove Element
  • python学习笔记 - ThreadLocal
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • TypeScript实现数据结构(一)栈,队列,链表
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从setTimeout-setInterval看JS线程
  • 分享一份非常强势的Android面试题
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 记录一下第一次使用npm
  • 技术:超级实用的电脑小技巧
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 区块链共识机制优缺点对比都是什么
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 我有几个粽子,和一个故事
  • MPAndroidChart 教程:Y轴 YAxis
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云ACE认证学习知识点梳理
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 通过调用文摘列表API获取文摘
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​香农与信息论三大定律
  • ‌移动管家手机智能控制汽车系统
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (06)Hive——正则表达式
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m