【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?** **二、核心概…...
【C语言分支与循环结构详解】
目录 ---------------------------------------begin--------------------------------------- 一、分支结构 1. if语句 2. switch语句 二、循环结构 1. for循环 2. while循环 3. do-while循环 三、嵌套结构 结语 -----------------------------------------end----…...
java求职学习day18
常用的设计原则和设计模式 1 常用的设计原则(记住) 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 (1)开闭原则(Open Close Principle…...
初阶2 类与对象
本章重点 上篇1.面向过程和面向对象初步认识2.类的引入---结构体3.类的定义3.1 语法3.2 组成3.3 定义类的两种方法: 4.类的访问限定符及封装4.1 访问限定符4.2封装---面向对象的三大特性之一 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小 8.this指…...
蓝桥杯模拟算法:多项式输出
P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题,我们需要分情况讨论,我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…...
Python的那些事第三篇:Python编程的“调味料”与“交流术”运算符与输入输出
运算符与输入输出:Python编程的“调味料”与“交流术” 在编程的世界里,Python不仅仅是一门语言,它更像是一位充满智慧的厨师,而运算符和输入输出则是它手中的“调味料”和“交流术”。没有这些工具,代码就会像没有加…...
如何利用AI工具来进行数据分析
利用AI工具进行数据分析可以显著提高效率和准确性,以下是详细步骤和方法: 1. 明确分析目标 在开始数据分析之前,首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果,以及选择合适的AI工具和方法。 2. …...
深度剖析C++17中的std::optional:处理可能缺失值的利器
文章目录 一、基本概念与设计理念二、构建与初始化(一)默认构造(二)值初始化(三)使用std::make_optional(四)使用std::nullopt 三、访问值(一)value()&#x…...
MySQL用户授权、收回权限与查看权限
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
每日一题 429. N 叉树的层序遍历
429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...
【Maui】注销用户,采用“手势”点击label弹窗选择
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 方法一:前端绑定3.2 方法二:后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创…...
如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格,并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码(部分) 本文测试代码已上传,路径如下ÿ…...
Object类(2)
大家好,今天我们继续来看看Object类中一些成员方法,这些方法在实际中有很大的用处,话不多说,来看。 注:所有类都默认继承Object类的,所以可调用Object类中的方法,如equals,也可以发生…...
BGP分解实验·11——路由聚合与条件性通告(3)
续接上(2)的实验。其拓扑如下: 路由聚合的负向也就是拆分,在有双出口的情况下,在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由,在产生该聚合路由的范围内的条目注入到本地BGP表后再向…...
无用的知识又增加了:is_assignable means?
std::pair的默认operator被delete掉了,取而代之的是两个enable_if版本。 为什么这么设计,我的理解是在std::map里,已经保存的元素的key值是不能被修改的,比如 注意,下面的代码会修改key值,编译时出现错误…...
MOS的体二极管能通多大电流
第一个问题:MOS导通之后电流方向可以使任意的,既可以从D到S,也可以从S到D。 第二个问题:MOS里面的体二极管电流可以达到几百安培,这也就解释了MOS选型的时候很少考虑体二极管的最大电流,而是考虑DS之间电流…...
C语言【基础篇】之流程控制——掌握三大结构的奥秘
流程控制 🚀前言🦜顺序结构💯 定义💯执行规则 🌟选择结构💯if语句💯switch语句💯case穿透规则 🤔循环结构💯for循环💯while循环💯do -…...
Node.js下载安装及环境配置教程 (详细版)
Node.js:是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型,使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序࿰…...
【PySide6拓展】QCalendarWidget 日历控件
文章目录 PySide6拓展:QCalendarWidget 日历控件前言什么是QCalendarWidget?特点: 如何使用QCalendarWidget?1. 基本用法2. 获取当前选中的日期 QCalendarWidget 常用函数分类介绍1. 日期选择与管理函数2. 日期格式与显示函数3. 日…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
【文星索引】搜索引擎项目测试报告
目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...
【PostgreSQL内核学习 —— (WindowAgg(一))】
WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊…...
Maya快捷键
旋转 ALT鼠标左键 平移 ALT鼠标中键 缩放 ALT鼠标右键 / 滑动鼠标滚轮 切换视图 空格键 [Q] 选择状态 [W] 移动状态 [E] 旋转状态 [R] 绽放状态 1正常显示 2正常也圆滑同时显示 3圆滑显示 4线框显示 5材质显示 6贴图显示 7灯光显示 CTRLZ 撤销命令…...
Go反射指南
概念: 官方对此有个非常简明的介绍,两句话耐人寻味: 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条,再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条,很有喜感的自嘲…...
深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile
深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性,广泛用于实现回调、动态函数调用以及灵活的程序设计。然而,复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发,逐步解析复杂…...
【观察】甲骨文:以AI为中心,开启企业级平台架构“新革命”
知名科技杂志《连线》创始主编凯文凯利曾预测:“在未来的 100 年里,人工智能将超越任何一种人工力量,将人类引领到一个前所未有的时代。” 可以看到,随着近两年AIGC与大模型的快速爆发,AI在千万行业中的重要性愈发突出…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
C语言从入门到进阶
视频:https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…...
Python案例--养兔子
兔子繁殖问题是一个经典的数学问题,最早由意大利数学家斐波那契在13世纪提出。这个问题不仅在数学领域具有重要意义,还广泛应用于计算机科学、生物学和经济学等领域。本文将通过一个具体的Python程序,深入探讨兔子繁殖问题的建模和实现&#…...
Mybatis——sql映射文件中的增删查改
映射文件内的增删查改 准备工作 准备一张数据表,用于进行数据库的相关操作。新建maven工程, 导入mysql-connector-java和mybatis依赖。新建一个实体类,类的字段要和数据表的数据对应编写接口编写mybatis主配置文件 public class User {priva…...
