!!!Docker 实践与应用实例

Docker 实践与应用实例涵盖了从基础操作到高级用法的广泛范围,适用于不同的应用场景和技术栈。下面,我将通过一些具体实例来介绍 Docker 如何被应用于实际开发中,帮助开发者和运维人员更好地理解和利用这一强大的工具。

1. 构建简单的 Web 应用

场景描述

假设你需要快速搭建一个基于 Node.js 的 Web 应用,这个应用需要响应 HTTP 请求并返回一个简单的欢迎消息。通过 Docker,你可以轻松地将这个应用及其依赖环境封装成一个可移植的容器,从而在任何支持 Docker 的平台上运行。

实践步骤
  1. 创建项目目录

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

    npm init -y
    npm install express
  3. 编写应用代码: 创建 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}`);
    });
  4. 编写 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"]
  5. 构建 Docker 镜像

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

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

    访问 http://localhost:3000,你应该能看到 "Hello, Docker!" 的消息。

2. 使用 Docker Compose 编排多容器应用

场景描述

在实际项目中,应用通常依赖多个服务,如数据库、缓存等。Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。通过一个 YAML 文件来配置应用的服务,可以使用一个命令创建并启动所有服务。

实践步骤
  1. 创建 Docker Compose 文件: 在项目根目录下创建 docker-compose.yml 文件,内容如下:

    version: '3'
    services:
      web:
        build: .
        ports:
          - "3000:3000"
        depends_on:
          - db
      db:
        image: postgres
        environment:
          POSTGRES_USER: example
          POSTGRES_PASSWORD: example
  2. 启动服务

    docker-compose up -d

    这条命令会在后台启动两个服务:一个 Node.js 应用服务和一个 PostgreSQL 数据库服务。

3. 持续集成/持续部署 (CI/CD)

场景描述

在 CI/CD 流程中,可以利用 Docker 容器来构建、测试和部署应用。这样可以确保在不同阶段使用相同的应用环境,减少因为环境差异导致的问题。

实践步骤
  1. 编写 CI/CD 脚本: 在 CI/CD 平台上(如 Jenkins, GitLab CI, CircleCI 等),编写脚本来自动化构建、测试和部署过程。例如,在 .gitlab-ci.yml 中定义流水线:

    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t my-app:$CI_COMMIT_REF_NAME .
        - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
        - docker push my-app:$CI_COMMIT_REF_NAME
    
    test:
      stage: test
      script:
        - docker run -d --name my-app-test my-app:$CI_COMMIT_REF_NAME
        - sleep 10 # 等待应用启动
        - curl http://localhost:3000
        - docker rm -f my-app-test
    
    deploy:
      stage: deploy
      script:
        - kubectl set image deployment/my-app-deployment my-app=my-app:$CI_COMMIT_REF_NAME
  2. 触发构建: 当代码推送到仓库时,CI/CD 平台会自动触发构建、测试和部署流程。

4. 微服务架构

场景描述

在微服务架构中,Docker 可以为每个微服务提供独立的运行环境,确保各个服务之间的隔离性和独立性。同时,Docker 的网络功能也使得微服务之间的通讯更加灵活。

实践步骤
  1. 定义每个微服务的 Dockerfile: 为每个微服务编写单独的 Dockerfile,确保每个服务都有自己的依赖环境。

  2. 使用 Docker Compose 或 Kubernetes 进行编排: 使用 Docker Compose 或 Kubernetes 来管理和编排多个微服务容器。例如,使用 docker-compose.yml 文件来定义多个服务:

    version: '3'
    services:
      service1:
        build: ./service1
        ports:
          - "3001:3000"
      service2:
        build: ./service2
        ports:
          - "3002:3000"
  3. 启动和管理服务: 使用 docker-compose up -d 命令启动所有服务,并使用 docker-compose down 命令停止和清理服务。

5. 数据库和缓存服务

场景描述

对于数据库和缓存服务(如 MySQL, MongoDB, Redis 等),可以使用官方提供的 Docker 镜像来快速部署,而无需手动安装和配置这些服务。

实践步骤
  1. 拉取官方镜像

    docker pull mysql:5.7
    docker pull redis:latest
  2. 运行容器

    docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:5.7
    docker run -d --name my-redis redis:latest
  3. 连接和管理服务: 使用标准的客户端工具(如 MySQL 客户端、Redis CLI)连接到这些服务,进行数据操作和管理。

6. 教育和培训

场景描述

Docker 也被广泛用于教育和培训领域,帮助学生和开发者在一个安全且隔离的环境中学习新技术。

实践步骤
  1. 创建教学镜像: 为特定课程或技术创建教学镜像,包含必要的工具和示例代码。例如,创建一个包含 Python 和 Jupyter Notebook 的教学镜像:

    FROM jupyter/minimal-notebook
    
    USER root
    
    RUN apt-get update && \
        apt-get install -y \
        python3-pandas \
        python3-scikit-learn \
        && apt-get clean
    
    USER jovyan
  2. 分享和使用教学镜像: 将教学镜像推送到 Docker Hub 或其他镜像仓库,供学生和开发者下载和使用:

    docker build -t my-teaching-image .
    docker push my-teaching-image
  3. 启动教学环境: 学生和开发者可以使用以下命令启动教学环境:

    docker run -p 8888:8888 my-teaching-image

结论

通过以上实例,我们可以看到 Docker 在不同场景下的应用非常广泛,从简单的 Web 应用到复杂的微服务架构,从 CI/CD 流程到教育和培训,Docker 都能提供强大的支持和便利。掌握 Docker 的基本概念和操作,可以帮助开发者和运维人员提高工作效率,推动技术进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从变量的角度理解 Hooks , 变得更简单了

从变量角度理解Hooks 在React的世界里,Hooks的引入为函数式组件带来了前所未有的灵活性和能力。它们让我们得以完全摆脱class式的写法,在函数式组件中完成生命周期管理、状态管理、逻辑复用等几乎全部组件开发工作。这次,我们就从变量的角度…

【面试经典150】day 9

目录 1.Z 字形变换 2.找出字符串中第一个匹配项的下标 3.文本左右对齐 1.Z 字形变换 class Solution {public String convert(String s, int numRows) {//明明是N字形变换if(numRows<2) return s;//rows是可扩展的字符串数组List<StringBuilder>rowsnew ArrayLi…

sudo apt install jupyter-notebook安装notebook失败E: Aborting install.

问题&#xff1a; sudo apt install jupyter-notebook安装notebook失败E: Aborting install. ~/jie/mywork/PointNetCFD$ sudo apt install jupyter-notebook --fix-missing Reading package lists... Done Building dependency tree Reading state information... Do…

软件工程实践项目:人事管理系统

一、项目的需求说明 通过移动设备登录app提供简单、方便的操作。根据公司原来的考勤管理制度&#xff0c;为公司不同管理层次提供相应的权限功能。通过app上面的各种标准操作&#xff0c;考勤管理无纸化的实现&#xff0c;使公司的考勤管理更加科学规范&#xff0c;从而节省考…

AI与低代码的碰撞:企业数字化转型的新引擎

引言 在当今的商业环境中&#xff0c;企业数字化转型已从选择题变成了必答题。面对日益复杂的市场竞争和不断变化的客户需求&#xff0c;传统的开发模式常常显得力不从心——开发周期冗长、技术门槛高、成本居高不下&#xff0c;企业很难快速响应市场变化。而在这种背景下&…

WPF中实现PasswordBox的双向绑定

我们知道一个属性想要实现双向绑定&#xff0c;最基本的便是这个属性需要时依赖属性&#xff0c;但是微软工程师在设计的时候Password并不是依赖属性&#xff0c;那我们想要实现双向绑定该怎么去做呢&#xff1f; 最常用的便是改造PasswordBox,为它增加一个扩展属性&#xff0c…

聚链成网,趣链科技参与 “跨链创新联合体”建设

近日&#xff0c;2024全球数商大会在上海举办。大会由上海数据集团和上海市数商协会联合主办&#xff0c;上海市数据局和浦东新区人民政府支持&#xff0c;以“数联全球&#xff0c;商通未来——‘链’接数字经济新未来”为主题&#xff0c;聚焦区块链技术和应用场景展开。 会上…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等&#xff0c;测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了&#xff0c;于是想用商汤的mmclassification快速搞一波&#xff0c;发现已…

文心一言 VS 讯飞星火 VS chatgpt (380)-- 算法导论24.4 12题

十二、给出一个有效算法来解决 A x ⩽ b Ax⩽b Ax⩽b 的差分约束系统&#xff0c;这里 b b b 的所有元素为实数&#xff0c;而变量 x i x_i xi​ 中某个给定的子集是整数。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 差分约束系统问题通常用于解决带有约…

CSS网格布局

前言 希望元素按照网格的方式进行布局&#xff0c;最简单的方式就是利用网格布局&#xff0c;如图所示&#xff1a; 网格布局 设置网格布局的核心属性&#xff1a; ① display: grid 设置容器为网格布局容器&#xff08;如果希望设置行内的网格容器&#xff0c;可以设置disp…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法1 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下&#xff0c;即可正常访问数据库。 解决办法2 bool open_work_db() {QString info "support drivers:";for (int i0; i<QSqlDatabase::drivers().size(); i){inf…

Rust 力扣 - 1. 两数相加

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个全局的备忘录&#xff0c;然后我们遍历数组&#xff0c;如果当前元素在备忘录里面找到了&#xff0c;就返回备忘录里面记录的下标和当前下标记录&#xff0c;没找到就把当前元素匹配的元素和当前元素…

十六:Python学习笔记-- 爬虫(2)requests 模块详解

目录 安装 requests 模块 基本请求方法 GET 请求 POST 请求 PUT 请求 DELETE 请求 添加请求头&#xff1a; 处理查询参数&#xff1a; 文件上传&#xff1a; 常见响应状态码 访问超时 cookie的查询和设置 查询 Cookies 设置 Cookies 设置爬虫代理 小试牛刀 安装 …

1Panel应用商店开源软件累计下载突破200万次!

2024年10月23日&#xff0c;1Panel应用商店内开源软件累计下载突破200万次。 1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。 为…

C语言 | Leetcode C语言题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; int findMinMoves(int* machines, int machinesSize){int sum0;for(int i0;i<machinesSize;i){summachines[i];}if(sum%machinesSize!0){return -1;}int psum/machinesSize;int ans0;int cur0;for(int i0;i<machinesSize;i){cur(mac…

JavaSE笔记3】面向对象高级

目录 拓1&#xff1a;私有方法的优点 拓2&#xff1a;静态方法的优点 拓3&#xff1a;类的五大成分 拓4&#xff1a;硬编码和软编码 一、static 1. 概念 2. 成员变量在内存中执行原理 3. 类变量(静态变量)的使用场景 4. 两种成员变量 5. 两种成员方法 6. 类方法的使用场景 7.…

动态规划 —— 路径问题-礼物的最大价值

1. 剑指offer-JZ47-路径问题-礼物的最大价值 题目链接&#xff1a; 礼物的最大价值_牛客题霸_牛客网https://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134?tpId265&tqId39288&ru/exam/oj 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 d…

Unity自定义数组在Inspector窗口的显示方式

了解 单行高度:EditorGUIUtility.singleLineHeight获取 PropertyField 控件所需的高度:EditorGUI.GetPropertyHeight属性是否在Inspector窗口展开&#xff1a;SerializedProperty.isExpanded可重新排序列表类&#xff1a;ReorderableList绘制纯色矩形&#xff1a;EditorGUI.Dr…

聊聊Web3D 发展趋势

随着 Web 技术的不断演进&#xff0c;Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来&#xff0c;由于 WebGL、WebGPU 等技术的发展&#xff0c;3D 内容已经能够直接在浏览器中渲染&#xff0c;为用户提供更加沉浸、互动的体验。以…

【AIGC】ChatGPT应用之道:如何打破『专家幻象』,提升AI协作质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;ChatGPT的实际能力用户对ChatGPT的常见误解超越误解&#xff0c;合理设定期望总结 &#x1f4af;超越“专家”幻想设定合理的期望总结 &#x1f4af;提升人工智能协作质量…