文章目录
-
-
- [Docker 的核心概念](#Docker 的核心概念)
- [Docker 常用命令](#Docker 常用命令)
- [示例:构建一个简单的 C++ 应用容器](#示例:构建一个简单的 C++ 应用容器)
-
- [1. 创建 C++ 应用](#1. 创建 C++ 应用)
- [2. 创建 Dockerfile](#2. 创建 Dockerfile)
- [3. 构建镜像](#3. 构建镜像)
- [4. 运行容器](#4. 运行容器)
- [Docker 优势](#Docker 优势)
- [学习 Docker 的下一步](#学习 Docker 的下一步)
-
-
-
- [**一、Docker 是什么?**](#一、Docker 是什么?)
-
- [**为什么 C++ 开发者需要 Docker?**](#为什么 C++ 开发者需要 Docker?)
- **二、核心概念**
-
- [1. **镜像(Image)**](#1. 镜像(Image))
- [2. **容器(Container)**](#2. 容器(Container))
- [3. **仓库(Registry)**](#3. 仓库(Registry))
- [**三、安装 Docker**](#三、安装 Docker)
-
- [1. **Linux (Ubuntu)**](#1. Linux (Ubuntu))
- [2. **Windows/macOS**](#2. Windows/macOS)
- **四、基础操作**
-
- [1. **拉取镜像**](#1. 拉取镜像)
- [2. **运行容器**](#2. 运行容器)
- [3. **在容器内安装 C++ 环境**](#3. 在容器内安装 C++ 环境)
- [**五、Dockerfile 实战(C++ 专用)**](#五、Dockerfile 实战(C++ 专用))
-
- [1. **示例目录结构**](#1. 示例目录结构)
- [2. **Dockerfile 内容**](#2. Dockerfile 内容)
- [3. **构建镜像**](#3. 构建镜像)
- [4. **运行容器**](#4. 运行容器)
- [**六、Docker Compose(多容器编排)**](#六、Docker Compose(多容器编排))
-
- [1. **安装 Docker Compose**](#1. 安装 Docker Compose)
- [2. **docker-compose.yml**](#2. docker-compose.yml)
- [3. **启动服务**](#3. 启动服务)
- [**七、C++ 开发中的实用场景**](#七、C++ 开发中的实用场景)
-
- [1. **开发环境标准化**](#1. 开发环境标准化)
- [2. **持续集成(CI)**](#2. 持续集成(CI))
- [3. **部署二进制文件**](#3. 部署二进制文件)
- **八、常见问题**
-
- Q1:容器退出后数据会丢失吗?
- Q2:如何调试运行中的容器?
- [Q3:如何暴露 C++ 服务的端口?](#Q3:如何暴露 C++ 服务的端口?)
- **九、学习资源**
-
- dokcer简介
-
-
- [**Docker 简介**](#Docker 简介)
-
- [**1. 什么是 Docker?**](#1. 什么是 Docker?)
- [**2. 为什么要用 Docker?(优势)**](#2. 为什么要用 Docker?(优势))
- [**3. Docker vs 传统虚拟机**](#3. Docker vs 传统虚拟机)
- [**4. Docker 关键概念**](#4. Docker 关键概念)
- [**5. Docker 基本使用**](#5. Docker 基本使用)
- [**6. 进阶使用**](#6. 进阶使用)
- [**7. 总结**](#7. 总结)
-
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
文件,内容如下:
cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello, Docker!" << endl;
return 0;
}
2. 创建 Dockerfile
接下来,你需要创建一个 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. 构建镜像
然后在同一目录下打开终端,运行以下命令来构建镜像:
bash
docker build -t cpp-hello-world .
4. 运行容器
镜像构建完成后,你可以通过以下命令来运行容器:
bash
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)
bash
# 卸载旧版本
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. 拉取镜像
bash
docker pull ubuntu:20.04 # 拉取 Ubuntu 20.04 镜像
docker pull gcc:latest # 拉取 GCC 最新镜像
2. 运行容器
bash
# 运行一个 Ubuntu 容器并进入终端
docker run -it --name my_cpp_container ubuntu:20.04 /bin/bash
# 参数解释:
# -it : 交互模式 + 分配终端
# --name : 容器名称
# ubuntu:20.04 : 镜像名
# /bin/bash : 启动后执行的命令
3. 在容器内安装 C++ 环境
bash
# 进入容器后执行
apt update
apt install -y g++ # 安装 C++ 编译器
g++ --version # 验证安装
五、Dockerfile 实战(C++ 专用)
创建一个 Dockerfile
,自动化构建 C++ 开发环境:
1. 示例目录结构
my_cpp_project/
├── Dockerfile
└── src/
└── main.cpp
2. Dockerfile 内容
dockerfile
# 使用官方 GCC 镜像作为基础
FROM gcc:latest
# 设置工作目录
WORKDIR /app
# 将本地代码复制到容器中
COPY src/main.cpp .
# 编译代码
RUN g++ -o myapp main.cpp
# 容器启动时运行程序
CMD ["./myapp"]
3. 构建镜像
bash
docker build -t my_cpp_app . # -t 指定镜像名称,. 表示当前目录
4. 运行容器
bash
docker run --rm my_cpp_app # --rm 运行后自动删除容器
六、Docker Compose(多容器编排)
适用于需要同时运行多个服务(如 C++ 程序 + Redis):
1. 安装 Docker Compose
bash
sudo apt-get install docker-compose
2. docker-compose.yml
yaml
version: '3'
services:
cpp_app:
build: .
command: ./myapp
redis:
image: "redis:alpine"
3. 启动服务
bash
docker-compose up
七、C++ 开发中的实用场景
1. 开发环境标准化
dockerfile
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
镜像(极小化部署):
dockerfile
FROM gcc:latest AS build
COPY . .
RUN g++ -o /app main.cpp
FROM alpine:latest
COPY --from=build /app /app
CMD ["/app"]
八、常见问题
Q1:容器退出后数据会丢失吗?
- 答 :是的!需使用
-v
挂载卷:
bash
docker run -v $(pwd)/data:/data my_cpp_app
Q2:如何调试运行中的容器?
bash
docker exec -it <container_id> /bin/bash # 进入正在运行的容器
Q3:如何暴露 C++ 服务的端口?
bash
docker run -p 8080:80 my_cpp_app # 主机端口:容器端口
九、学习资源
- 官方文档:https://docs.docker.com/
- Docker Hub:https://hub.docker.com/
- 《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 为例):
bash
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
docker --version # 查看版本
(Windows 和 Mac 需安装 Docker Desktop)
② 运行一个容器
bash
docker run hello-world
输出 Hello from Docker!
说明 Docker 运行成功。
③ 搜索和下载镜像
bash
docker search nginx # 在 Docker Hub 搜索 nginx 镜像
docker pull nginx # 下载 nginx 镜像
④ 运行容器
bash
docker run -d -p 8080:80 --name mynginx nginx
-d
:后台运行-p 8080:80
:映射主机端口 8080 到容器内部的 80 端口--name mynginx
:指定容器名称
访问 http://localhost:8080
,看到 Nginx 页面说明运行成功。
⑤ 查看正在运行的容器
bash
docker ps
⑥ 停止和删除容器
bash
docker stop mynginx # 停止容器
docker rm mynginx # 删除容器
⑦ 构建自定义镜像
创建 Dockerfile
:
dockerfile
FROM ubuntu:latest
RUN apt update && apt install -y nginx
CMD ["nginx", "-g", "daemon off;"]
构建镜像:
bash
docker build -t mynginx .
运行:
bash
docker run -d -p 8080:80 mynginx
6. 进阶使用
- Docker Compose:用于定义和管理多个容器
- Docker Volume:持久化数据存储
- Docker Network:管理容器间网络通信
- Kubernetes(K8s):容器编排工具,适用于大规模部署
7. 总结
Docker 让应用部署更加高效,适用于微服务架构、DevOps、云计算等场景。如果你正在学习或开发分布式系统,Docker 是一个非常值得掌握的工具! 🚀