【Docker】Docker入门了解


在这里插入图片描述

Docker 是一个开源的应用容器引擎,允许你把应用和所有依赖打包到一个标准化的容器里,这样就可以在任何环境中运行。它主要解决了“在我的机器上能运行”的问题,确保你的应用在不同的环境中有一致的表现。

简单来说,Docker 就是通过容器化技术,让开发、测试、部署的过程更加高效、轻松。容器是一种轻量级、可移植的虚拟化方式,可以让你在同一台机器上运行多个应用,而不会互相干扰。

Docker 的核心概念

  1. 镜像(Image):

    • Docker 镜像是一个包含应用程序及其依赖的轻量级、可执行的包。它是 Docker 容器的构建蓝图。
    • 镜像是只读的,每次运行镜像都会创建一个新的容器。
  2. 容器(Container):

    • 容器是镜像的一个实例,是应用的运行时环境。容器是隔离的,可以在其中运行任何程序或服务。
    • 容器是临时的,停止或删除容器后,容器内部的修改会丢失(除非使用数据卷来保存数据)。
  3. Dockerfile:

    • Dockerfile 是用来构建 Docker 镜像的文本文件,其中定义了如何从一个基本镜像开始、添加程序、依赖和配置等步骤。
    • 例如,你可以在 Dockerfile 中指定操作系统、安装的库、编译你的 C++ 程序、暴露的端口等。
  4. Docker Hub:

    • Docker Hub 是一个公共的 Docker 镜像仓库,类似于 GitHub,但它是专门用于存储和共享 Docker 镜像的地方。
    • 你可以从 Docker Hub 拉取(下载)常见的镜像,或者将你自己的镜像推送到 Docker Hub 上。
  5. 容器网络(Network):

    • Docker 提供了多个网络模式,让你可以在不同的容器之间建立网络连接(如桥接网络、主机网络等)。
  6. 数据卷(Volume):

    • 数据卷允许容器持久化数据,即使容器被删除,数据依然存在。
    • 它主要用于存储数据库文件、日志文件等需要持久化的数据。

Docker 常用命令

  1. docker --version: 查看 Docker 的版本。
  2. docker pull <image_name>: 从 Docker Hub 拉取镜像。
  3. docker build -t <image_name> : 从 Dockerfile 构建镜像。
  4. docker run <image_name>: 运行一个容器,启动一个镜像实例。
  5. docker ps: 查看正在运行的容器。
  6. docker stop <container_id>: 停止运行中的容器。
  7. docker rm <container_id>: 删除一个已停止的容器。
  8. docker rmi <image_name>: 删除镜像。
  9. 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 优势

  1. 一致性: 容器确保应用在不同的环境中都能以相同的方式运行。
  2. 轻量: 相比虚拟机,容器启动速度快,占用资源少。
  3. 隔离性: 容器之间是隔离的,可以确保不同应用互不干扰。
  4. 便捷性: Docker 提供了简单的命令行工具,易于使用和管理。

学习 Docker 的下一步

  • 你可以开始构建更复杂的应用容器,或者在多个容器之间进行交互(例如,数据库和应用服务器的组合)。
  • 了解如何使用 Docker Compose 来管理多个容器的应用。
  • 了解如何将 Docker 容器部署到云平台(如 AWS、Azure 或 Google Cloud)上。

希望这些基础能帮你入门 Docker!如果有具体的问题或者需要进一步讲解某部分,随时告诉我!

好的!我会从零开始详细讲解 Docker,并特别结合 C++ 开发场景。内容较长,建议分段阅读。


一、Docker 是什么?

Docker 是一个容器化平台,允许你将应用程序及其依赖打包成一个轻量级、可移植的容器。容器与虚拟机类似,但更轻量(共享操作系统内核),启动更快,资源消耗更少。

为什么 C++ 开发者需要 Docker?
  1. 环境一致性:避免 “在我机器上能跑” 的问题。
  2. 依赖隔离:不同项目可使用不同版本的库(如 gcc、Boost)。
  3. 快速部署:编译后的程序可直接打包进容器,无需在服务器配置环境。

二、核心概念

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  # 主机端口:容器端口

九、学习资源

  1. 官方文档:https://docs.docker.com/
  2. Docker Hub:https://hub.docker.com/
  3. 《Docker 入门与实践》

通过 Docker,你可以将 C++ 项目的开发、测试、部署流程完全容器化。建议先尝试简单的示例,再逐步应用到实际项目中。

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

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

相关文章

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机&#xff0c;安装一个App并简单设置一下&#xff0c;就可以跨互联网的ADB连接到这个手机&#xff0c;从而远程操控这个手机做各种操作。你敢相信吗&#xff1f;而这正是本篇想要描述的…

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程&#xff0c;质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理&#xff0c;用于复习与分享。大佬的博客&#xff1a;恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中&#xff0c;通常根据事件处理的触…

Python爬虫学习第三弹 —— Xpath 页面解析 实现无广百·度

早上好啊&#xff0c;大佬们。上回使用 Beautiful Soup 进行页面解析的内容是不是已经理解得十分透彻了~ 这回我们再来尝试使用另外一种页面解析&#xff0c;来重构上一期里写的那些代码。 讲完Xpath之后&#xff0c;小白兔会带大家解决上期里百度搜索的代码编写&#xff0c;保…

docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull mysql:8.0.41 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜…

特权模式docker逃逸

目录 1.环境 2.上线哥斯拉 3.特权模式逃逸 1.判断是否为docker环境 2.判断是否为特权模式 3.挂载宿主机磁盘到docker 4.计划任务反弹shell 1.环境 ubuntu部署一个存在CVE-2017-12615的docker: (ip:192.168.117.147) kali(ip:192.168.117.128) 哥斯拉 2.上线哥斯拉…

Direct2D 极速教程(1) —— 画图形

极速导航 Direct2D 简介创建新项目&#xff1a;001-DrawGraphics弄一个白窗口在窗口上画图 Direct2D 简介 大家在学 WINAPI 的时候的时候有没有想过&#xff0c;怎么在一副窗口上画图呢&#xff1f;大家知道 Windows 系统是 GUI 图形用户界面 系统&#xff0c;以 Graphics 图形…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…

目标跟踪之sort算法(3)

这里写目录标题 1 流程1 预处理2 跟踪 2 代码 参考&#xff1a;sort代码 https://github.com/abewley/sort 1 流程 1 预处理 1.1 获取离线检测数据。1.2 实例化跟踪器。2 跟踪 2.1 轨迹处理。根据上一帧的轨迹预测当前帧的轨迹&#xff0c;剔除到当前轨迹中为空的轨迹得到当前…

物业巡更系统在现代社区管理中的优势与应用探讨

内容概要 在现代社区管理中&#xff0c;物业巡更系统正逐渐成为一种不可或缺的工具。结合先进的智能技术&#xff0c;这些系统能够有效地提升社区管理的各个方面&#xff0c;尤其是在巡检效率和信息透明度方面。通过实时记录巡检数据&#xff0c;物业管理人员能够确保工作人员…

深入探讨防抖函数中的 this 上下文

深入剖析防抖函数中的 this 上下文 最近我在研究防抖函数实现的时候&#xff0c;发现一个耗费脑子的问题&#xff0c;出现了令我困惑的问题。接下来&#xff0c;我将通过代码示例&#xff0c;深入探究这些现象背后的原理。 示例代码 function debounce(fn, delay) {let time…

进程通讯——类型和发展

进程常用交互方法如上

健康AI应用的逆袭:如何用“死亡时钟”撬动用户增长和媒体关注,实现应用榜快速排名第六

Death Clock&#xff1a;一款AI驱动的长寿应用 过去六个月里&#xff0c;我一直在为一款名为 Death Clock 的AI驱动长寿应用提供建议。健康类应用的增长向来十分困难&#xff0c;因为它们通常是单人使用的工具&#xff0c;且主要吸引年长的用户群体。然而&#xff0c;与创始人…

区块链在能源行业的应用场景

区块链技术在能源行业的应用正在逐步扩展&#xff0c;并且展现出巨大的潜力。它不仅能够促进能源交易的透明度和效率&#xff0c;还能为能源生产、分配、消费等多个环节提供创新解决方案。以下是对区块链在能源行业应用的一些深入探讨&#xff1a; 1. 能源交易 区块链可以实现…

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接&#xff1a;Latent Variable Models for Analyzing DNA Methylation 摘要&#xff1a; 脱氧核糖核酸&#xff08;DNA&#xff09;甲基化与细胞分化密切相关。例如&#xff0c;已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此&#xff0c;通过研究DNA…

基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)

一、引言 1.1研究目标与内容 本研究旨在构建一个基于 PostgreSQL 的自然语义解析电子病历编程体系,实现从电子病历文本中提取结构化信息,并将其存储于 PostgreSQL 数据库中,以支持高效的查询和分析。具体研究内容包括: 电子病历的预处理与自然语言处理:对电子病历文本进…

第1章 量子暗网中的血色黎明

月球暗面的危机与阴谋 量子隧穿效应催生的幽蓝电弧&#xff0c;于环形山表面肆意跳跃&#xff0c;仿若无数奋力挣扎的机械蠕虫&#xff0c;将月球暗面的死寂打破&#xff0c;徒增几分诡异。艾丽伫立在被遗弃的“广寒宫”量子基站顶端&#xff0c;机械义眼之中&#xff0c;倒映着…

【落羽的落羽 数据结构篇】顺序表

文章目录 一、线性表二、顺序表1. 概念与分类2. 准备工作3. 静态顺序表4. 动态顺序表4.1 定义顺序表结构4.2 顺序表的初始化4.3 检查空间是否足够4.3 尾部插入数据4.4 头部插入数据4.5 尾部删除数据4.6 头部删除数据4.7 在指定位置插入数据4.8 在指定位置删除数据4.9 顺序表的销…

大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》

摘要 在当前的数字时代&#xff0c;在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战&#xff0c;并影响着关键决策和公众舆论。为应对这些挑战&#xff0c;自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型&#xff08;LLMs&#xff0…