【Docker】Docker入门了解
文章目录
- Docker 的核心概念
- Docker 常用命令
- 示例:构建一个简单的 C++ 应用容器
- 1. 创建 C++ 应用
- 2. 创建 Dockerfile
- 3. 构建镜像
- 4. 运行容器
- Docker 优势
- 学习 Docker 的下一步
- **一、Docker 是什么?**
- **为什么 C++ 开发者需要 Docker?**
- **二、核心概念**
- 1. **镜像(Image)**
- 2. **容器(Container)**
- 3. **仓库(Registry)**
- **三、安装 Docker**
- 1. **Linux (Ubuntu)**
- 2. **Windows/macOS**
- **四、基础操作**
- 1. **拉取镜像**
- 2. **运行容器**
- 3. **在容器内安装 C++ 环境**
- **五、Dockerfile 实战(C++ 专用)**
- 1. **示例目录结构**
- 2. **Dockerfile 内容**
- 3. **构建镜像**
- 4. **运行容器**
- **六、Docker Compose(多容器编排)**
- 1. **安装 Docker Compose**
- 2. **docker-compose.yml**
- 3. **启动服务**
- **七、C++ 开发中的实用场景**
- 1. **开发环境标准化**
- 2. **持续集成(CI)**
- 3. **部署二进制文件**
- **八、常见问题**
- Q1:容器退出后数据会丢失吗?
- Q2:如何调试运行中的容器?
- Q3:如何暴露 C++ 服务的端口?
- **九、学习资源**

Docker 是一个开源的应用容器引擎,允许你把应用和所有依赖打包到一个标准化的容器里,这样就可以在任何环境中运行。它主要解决了“在我的机器上能运行”的问题,确保你的应用在不同的环境中有一致的表现。
简单来说,Docker 就是通过容器化技术,让开发、测试、部署的过程更加高效、轻松。容器是一种轻量级、可移植的虚拟化方式,可以让你在同一台机器上运行多个应用,而不会互相干扰。
Docker 的核心概念
-
镜像(Image):
- Docker 镜像是一个包含应用程序及其依赖的轻量级、可执行的包。它是 Docker 容器的构建蓝图。
- 镜像是只读的,每次运行镜像都会创建一个新的容器。
-
容器(Container):
- 容器是镜像的一个实例,是应用的运行时环境。容器是隔离的,可以在其中运行任何程序或服务。
- 容器是临时的,停止或删除容器后,容器内部的修改会丢失(除非使用数据卷来保存数据)。
-
Dockerfile:
- Dockerfile 是用来构建 Docker 镜像的文本文件,其中定义了如何从一个基本镜像开始、添加程序、依赖和配置等步骤。
- 例如,你可以在 Dockerfile 中指定操作系统、安装的库、编译你的 C++ 程序、暴露的端口等。
-
Docker Hub:
- Docker Hub 是一个公共的 Docker 镜像仓库,类似于 GitHub,但它是专门用于存储和共享 Docker 镜像的地方。
- 你可以从 Docker Hub 拉取(下载)常见的镜像,或者将你自己的镜像推送到 Docker Hub 上。
-
容器网络(Network):
- Docker 提供了多个网络模式,让你可以在不同的容器之间建立网络连接(如桥接网络、主机网络等)。
-
数据卷(Volume):
- 数据卷允许容器持久化数据,即使容器被删除,数据依然存在。
- 它主要用于存储数据库文件、日志文件等需要持久化的数据。
Docker 常用命令
- docker --version: 查看 Docker 的版本。
- docker pull <image_name>: 从 Docker Hub 拉取镜像。
- docker build -t <image_name>
: 从 Dockerfile 构建镜像。 - docker run <image_name>: 运行一个容器,启动一个镜像实例。
- docker ps: 查看正在运行的容器。
- docker stop <container_id>: 停止运行中的容器。
- docker rm <container_id>: 删除一个已停止的容器。
- docker rmi <image_name>: 删除镜像。
- docker logs <container_id>: 查看容器的输出日志。
示例:构建一个简单的 C++ 应用容器
假设你有一个简单的 C++ 应用,并想要将它放进 Docker 容器里运行。
1. 创建 C++ 应用
例如,你有一个 hello.cpp
文件,内容如下:
#include <iostream>
using namespace std;int main() {cout << "Hello, Docker!" << endl;return 0;
}
2. 创建 Dockerfile
接下来,你需要创建一个 Dockerfile
来构建镜像。Dockerfile
可能会是这样:
# 使用一个官方的基础镜像,选择一个带有编译器的镜像
FROM ubuntu:20.04# 安装 C++ 编译器
RUN apt-get update && apt-get install -y g++# 复制本地代码到容器中
COPY hello.cpp /hello.cpp# 编译 C++ 程序
RUN g++ /hello.cpp -o /hello# 设置容器启动时执行的命令
CMD ["/hello"]
3. 构建镜像
然后在同一目录下打开终端,运行以下命令来构建镜像:
docker build -t cpp-hello-world .
4. 运行容器
镜像构建完成后,你可以通过以下命令来运行容器:
docker run cpp-hello-world
你应该会看到输出 Hello, Docker!
。
Docker 优势
- 一致性: 容器确保应用在不同的环境中都能以相同的方式运行。
- 轻量: 相比虚拟机,容器启动速度快,占用资源少。
- 隔离性: 容器之间是隔离的,可以确保不同应用互不干扰。
- 便捷性: Docker 提供了简单的命令行工具,易于使用和管理。
学习 Docker 的下一步
- 你可以开始构建更复杂的应用容器,或者在多个容器之间进行交互(例如,数据库和应用服务器的组合)。
- 了解如何使用 Docker Compose 来管理多个容器的应用。
- 了解如何将 Docker 容器部署到云平台(如 AWS、Azure 或 Google Cloud)上。
希望这些基础能帮你入门 Docker!如果有具体的问题或者需要进一步讲解某部分,随时告诉我!
好的!我会从零开始详细讲解 Docker,并特别结合 C++ 开发场景。内容较长,建议分段阅读。
一、Docker 是什么?
Docker 是一个容器化平台,允许你将应用程序及其依赖打包成一个轻量级、可移植的容器。容器与虚拟机类似,但更轻量(共享操作系统内核),启动更快,资源消耗更少。
为什么 C++ 开发者需要 Docker?
- 环境一致性:避免 “在我机器上能跑” 的问题。
- 依赖隔离:不同项目可使用不同版本的库(如 gcc、Boost)。
- 快速部署:编译后的程序可直接打包进容器,无需在服务器配置环境。
二、核心概念
1. 镜像(Image)
- 定义:只读模板,包含运行程序所需的一切(代码、运行时、库、环境变量)。
- 类比:C++ 中的 “类”,镜像是静态的,通过
Dockerfile
定义。 - 示例镜像:
ubuntu:20.04
,gcc:latest
2. 容器(Container)
- 定义:镜像的运行实例(类似对象实例化)。
- 特点:容器之间隔离,可启动/停止/删除。
- 操作:通过
docker run
启动容器。
3. 仓库(Registry)
- 定义:存储和分发镜像的地方(如 Docker Hub)。
- 常用命令:
docker pull
,docker push
三、安装 Docker
1. Linux (Ubuntu)
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc# 安装依赖
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 apt-key add -# 添加仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装
sudo docker run hello-world
2. Windows/macOS
- 下载 Docker Desktop:https://www.docker.com/products/docker-desktop
四、基础操作
1. 拉取镜像
docker pull ubuntu:20.04 # 拉取 Ubuntu 20.04 镜像
docker pull gcc:latest # 拉取 GCC 最新镜像
2. 运行容器
# 运行一个 Ubuntu 容器并进入终端
docker run -it --name my_cpp_container ubuntu:20.04 /bin/bash# 参数解释:
# -it : 交互模式 + 分配终端
# --name : 容器名称
# ubuntu:20.04 : 镜像名
# /bin/bash : 启动后执行的命令
3. 在容器内安装 C++ 环境
# 进入容器后执行
apt update
apt install -y g++ # 安装 C++ 编译器
g++ --version # 验证安装
五、Dockerfile 实战(C++ 专用)
创建一个 Dockerfile
,自动化构建 C++ 开发环境:
1. 示例目录结构
my_cpp_project/
├── Dockerfile
└── src/└── main.cpp
2. Dockerfile 内容
# 使用官方 GCC 镜像作为基础
FROM gcc:latest# 设置工作目录
WORKDIR /app# 将本地代码复制到容器中
COPY src/main.cpp .# 编译代码
RUN g++ -o myapp main.cpp# 容器启动时运行程序
CMD ["./myapp"]
3. 构建镜像
docker build -t my_cpp_app . # -t 指定镜像名称,. 表示当前目录
4. 运行容器
docker run --rm my_cpp_app # --rm 运行后自动删除容器
六、Docker Compose(多容器编排)
适用于需要同时运行多个服务(如 C++ 程序 + Redis):
1. 安装 Docker Compose
sudo apt-get install docker-compose
2. docker-compose.yml
version: '3'
services:cpp_app:build: .command: ./myappredis:image: "redis:alpine"
3. 启动服务
docker-compose up
七、C++ 开发中的实用场景
1. 开发环境标准化
FROM ubuntu:20.04
RUN apt update && apt install -y g++ cmake make libboost-all-dev
2. 持续集成(CI)
在 GitLab CI 或 GitHub Actions 中直接使用 Docker 镜像编译代码。
3. 部署二进制文件
将编译后的可执行文件打包进 alpine
镜像(极小化部署):
FROM gcc:latest AS build
COPY . .
RUN g++ -o /app main.cppFROM alpine:latest
COPY --from=build /app /app
CMD ["/app"]
八、常见问题
Q1:容器退出后数据会丢失吗?
- 答:是的!需使用
-v
挂载卷:
docker run -v $(pwd)/data:/data my_cpp_app
Q2:如何调试运行中的容器?
docker exec -it <container_id> /bin/bash # 进入正在运行的容器
Q3:如何暴露 C++ 服务的端口?
docker run -p 8080:80 my_cpp_app # 主机端口:容器端口
九、学习资源
- 官方文档:https://docs.docker.com/
- Docker Hub:https://hub.docker.com/
- 《Docker 入门与实践》
通过 Docker,你可以将 C++ 项目的开发、测试、部署流程完全容器化。建议先尝试简单的示例,再逐步应用到实际项目中。
相关文章:

【Docker】Docker入门了解
文章目录 Docker 的核心概念Docker 常用命令示例:构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么?****为什么 C 开发者需要 Docker?** **二、核心概…...
AIGC(生成式AI)试用 19 -- AI Agent
AI Agent:自主完成特定目标任务。 AI Agent:以大语言模型为大脑驱动的系统,具备自主理解、感知、规划、记忆和使用工具的能力,能够自动化执行完成复杂任务的系统。AI Agent不同于传统的人工智能,它具备通过独立思考、调…...
LeetCode:70. 爬楼梯
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的…...

《Trustzone/TEE/安全从入门到精通-标准版》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...

2025神奇的数字—新年快乐
2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。2025…...

第一个3D程序!
运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...

Hive:内部表和外部表,内外转换
内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...
2024收尾工作
目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…...

能说说MyBatis的工作原理吗?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 能说说MyBatis的工作原理吗? MyBatis 是一款流行的持久层框架,它通过简化数据库操作,帮助开发者更高效地与数据库进行交互。MyBatis…...
简单的SQL语句的快速复习
语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...

Spring MVC 综合案例
目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…...
Spring Boot多环境配置实践指南
在开发Spring Boot应用时,我们常常需要根据不同的运行环境(如开发环境、测试环境和生产环境)来配置不同的参数。Spring Boot提供了非常灵活的多环境配置机制,通过使用profile-specific properties文件,我们可以轻松地管…...
微信小程序中实现进入页面时数字跳动效果(自定义animate-numbers组件)
微信小程序中实现进入页面时数字跳动效果 1. 组件定义,新建animate-numbers组件1.1 index.js1.2 wxml1.3 wxss 2. 使用组件 1. 组件定义,新建animate-numbers组件 1.1 index.js // components/animate-numbers/index.js Component({properties: {number: {type: Number,value…...
【huawei】云计算的备份和容灾
目录 1 备份和容灾 2 灾备的作用? ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点(RPO,Recoyery Point Objective) ② 应用恢复时间(RTO,Recoyery Time Objective) 4…...
Vue.js组件开发-实现下载时暂停恢复下载
在 Vue 中实现下载时暂停和恢复功能,通常可以借助 XMLHttpRequest 对象来控制下载过程。XMLHttpRequest 允许在下载过程中暂停和继续请求。 实现步骤 创建 Vue 组件:创建一个 Vue 组件,包含下载、暂停和恢复按钮。初始化 XMLHttpRequest 对…...
TCP是怎么判断丢包的?
丢包在复杂的网络环境中,是一种常见的现象。 TCP(传输控制协议)作为一种可靠传输协议,内置了多种机制来检测和处理丢包现象,从而保证数据的完整性和传输的可靠性。本文将介绍TCP判断丢包的原理和机制。 一、TCP可靠传…...

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序
目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子: POST请求的例子: 3. 案例:…...

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型
2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

复古壁纸中棕色系和米色系哪个更受欢迎?
根据最新的搜索结果,我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析: 棕色系 受欢迎程度:棕色系在复古壁纸中非常受欢迎,因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…...
编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)
编译安装 前置需求: 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧,pip编译安装的时候,可以加上--jobs64来多核编译。 注意先升级pip版本:pip install pip -U pip3 install faiss-cpu --config-s…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...