【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: ./myapp
  redis:
    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.cpp

FROM 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++ 项目的开发、测试、部署流程完全容器化。建议先尝试简单的示例,再逐步应用到实际项目中。

dokcer简介

Docker 简介

1. 什么是 Docker?

Docker 是一个开源的容器化平台,能够将应用程序及其依赖环境打包到轻量级的、可移植的容器中,使应用可以跨不同的环境(开发、测试、生产)一致运行。

Docker 通过 容器(Container) 来隔离应用程序,避免环境不一致的问题,并提高资源利用率。


2. 为什么要用 Docker?(优势)

轻量级:共享宿主机内核,比虚拟机(VM)占用更少资源。
跨平台:一次构建,随处运行(Build Once, Run Anywhere)。
快速部署:容器启动速度比虚拟机快得多。
依赖隔离:不同应用运行在不同的容器中,互不干扰。
易扩展:方便横向扩展,适合微服务架构。
DevOps 友好:适配 CI/CD,简化开发与运维流程。


3. Docker vs 传统虚拟机
对比项Docker(容器)虚拟机(VM)
启动速度秒级分钟级
资源占用共享宿主机内核,轻量需要完整 OS,耗资源
运行环境依赖容器引擎依赖 Hypervisor
兼容性高(不同环境一致)低(不同虚拟机环境可能不兼容)
适合场景微服务、云计算、CI/CD传统应用、隔离性要求高的场景

4. Docker 关键概念
  • 镜像(Image):应用程序及其依赖的只读模板(类似 ISO)。
  • 容器(Container):镜像的运行实例,每个容器都是相互隔离的。
  • Dockerfile:定义镜像的构建文件,包含所有安装和配置步骤。
  • Docker Hub:公共的 Docker 镜像仓库,可以下载或上传镜像。
  • 容器编排(Docker Compose, Kubernetes):用于管理多个容器的部署和运行。

5. Docker 基本使用

① 安装 Docker(以 Ubuntu 为例):

sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
docker --version  # 查看版本

(Windows 和 Mac 需安装 Docker Desktop)


② 运行一个容器

docker run hello-world

输出 Hello from Docker! 说明 Docker 运行成功。


③ 搜索和下载镜像

docker search nginx  # 在 Docker Hub 搜索 nginx 镜像
docker pull nginx    # 下载 nginx 镜像

④ 运行容器

docker run -d -p 8080:80 --name mynginx nginx
  • -d:后台运行
  • -p 8080:80:映射主机端口 8080 到容器内部的 80 端口
  • --name mynginx:指定容器名称

访问 http://localhost:8080,看到 Nginx 页面说明运行成功。


⑤ 查看正在运行的容器

docker ps

⑥ 停止和删除容器

docker stop mynginx  # 停止容器
docker rm mynginx    # 删除容器

⑦ 构建自定义镜像
创建 Dockerfile

FROM ubuntu:latest
RUN apt update && apt install -y nginx
CMD ["nginx", "-g", "daemon off;"]

构建镜像:

docker build -t mynginx .

运行:

docker run -d -p 8080:80 mynginx

6. 进阶使用
  • Docker Compose:用于定义和管理多个容器
  • Docker Volume:持久化数据存储
  • Docker Network:管理容器间网络通信
  • Kubernetes(K8s):容器编排工具,适用于大规模部署

7. 总结

Docker 让应用部署更加高效,适用于微服务架构、DevOps、云计算等场景。如果你正在学习或开发分布式系统,Docker 是一个非常值得掌握的工具! 🚀

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

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

相关文章

使用langchain ollama gradio搭建一个本地基于deepseek r1的RAG问答系统

目录 简介 环境配置 具体实现 安装依赖 定义模型和prompt 加载检索文档 切割 向量存储 创建检索器 实例化 前端搭建 实现效果 小tips 简介 首先介绍一下使用的几个工具&#xff0c;模型和rag的步骤&#xff0c;注&#xff1a;这里只是简单描述一下&#xff0c;不展…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中&#xff0c;外观模式是如何工作的&#xff1f;外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 许多人可能会跟老六哥一样&#xff0c;有过这样的体验&#xff1a;当我们遇到一个能力出众或对事物有独到见解的…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

Baklib如何提升企业知识管理效率与市场竞争力的五大对比分析

内容概要 在信息化时代&#xff0c;企业在知识管理方面面临着巨大的挑战与机遇。为了有效应对这些挑战&#xff0c;“Baklib”作为一个知识中台&#xff0c;通过其高度集成的数字化平台&#xff0c;为企业提供全方位的知识管理解决方案。特别是在以下五个领域&#xff0c;它展…

c++:vector

1.使用 1.1构造函数 常见的三种构造方式&#xff1a;空构造&#xff0c;拷贝构造&#xff0c;指定元素构造 1.2iterator begin和end也分为正向和反向。 注意&#xff1a;反向迭代器可以反向遍历是因为在定义rbegin和rend函数的时候把尾地址给到了rbegin&#xff0c;而不是说改…

C++17 搜索器教程:解锁高效搜索新姿势

C17搜索器教程&#xff1a;解锁高效搜索新姿势 C17搜索器简介 在C的发展历程中&#xff0c;C17是一个重要的里程碑&#xff0c;它引入了诸多实用的新特性&#xff0c;搜索器功能便是其中之一。此功能着重对std::search算法进行了强化&#xff0c;使其支持多种搜索策略&#x…

Transformer+vit原理分析

目录 一、Transformer的核心思想 1. 自注意力机制&#xff08;Self-Attention&#xff09; 2. 多头注意力&#xff08;Multi-Head Attention&#xff09; 二、Transformer的架构 1. 整体结构 2. 编码器层&#xff08;Encoder Layer&#xff09; 3. 解码器层&#xff08;Decoder…

C语言自定义数据类型详解(二)——结构体类型(下)

书接上回&#xff0c;前面我们已经给大家介绍了如何去声明和创建一个结构体&#xff0c;如何初始化结构体变量等这些关于结构体的基础知识。下面我们将继续给大家介绍和结构体有关的知识&#xff1a; 今天的主题是&#xff1a;结构体大小的计算并简单了解一下位段的相关知识。…

【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点

当前的ComfyUI的收录的自定义节点很多&#xff0c;但是有些节点属于新出来&#xff0c;或者他的应用没有那么广泛&#xff0c;Manager管理节点 有可能没有收录到&#xff0c;这时候 如果我们需要安装需要怎么办呢&#xff1f;这就涉及到我们自己安装这些节点了。例如下面的内容…

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用

论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接&#xff1a;https://arxiv.org/pdf/2403.06258 代码链接&#xff1a;https://github.com/NUST-Mac…

[OO ALV] OO ALV 基础显示

程序代码 REPORT z437_test_2025.DATA gt_spfli TYPE STANDARD TABLE OF spfli. " 内表DATA go_alv TYPE REF TO cl_gui_alv_grid. " 创建和管理ALV表格DATA gs_layout TYPE lvc_s_layo. " 存储ALV表格的布局信息*---------------------…

jQuery小游戏(二)

jQuery小游戏&#xff08;二&#xff09; 今天是新年的第二天&#xff0c;本人在这里祝大家&#xff0c;新年快乐&#xff0c;万事胜意&#x1f495; 紧接jQuery小游戏&#xff08;一&#xff09;的内容&#xff0c;我们开始继续往下咯&#x1f61c; 游戏中使用到的方法 key…

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令&#xff1a; 文件&#xff1a; touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向&#xff08;Redirection&#xff09; 2. 管道&#xff08;Pipes&a…

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1&#xff1a;计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2&#xff1a;带余除法练习3&#xff1a;整数个位练习4&#xff1a;整数十位练习5&#xff1a;时间转换练习6&#xff…

51单片机开发:定时器中断

目标&#xff1a;利用定时器中断&#xff0c;每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示&#xff0c;要使用定时器中断T0&#xff0c;须开启TE0、ET0。&#xff1a; 系统中断号如下图所示&#xff1a;定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

【设计测试用例自动化测试性能测试 实战篇】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 设计测试用例…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…