当前位置: 首页 > news >正文

Docker核心概念与实战指南

Docker基础概念

Docker概述: Docker是一种成熟高效的软件部署技术,利用容器化技术为应用程序封装独立的运行环境。每个运行环境即为一个容器,承载容器运行的计算机称为宿主机

Dcoker 组成

在这里插入图片描述

容器与虚拟机的区别:
Docker容器与虚拟机对比
特性Docker容器虚拟机
内核共享宿主机内核独立完整的内核
资源占用轻量级,占用空间小需要更多资源,占用空间大
启动速度秒级启动分钟级启动
隔离性进程级隔离完整的系统级隔离
性能接近原生性能存在虚拟化开销
镜像与容器的类比
概念定义类比
镜像容器的只读模板,包含运行环境和配置类似软件安装包或糕点模具
容器镜像的运行实例,包含应用和运行时状态类似安装好的软件或模具制作的糕点
共享性镜像可跨环境分发和复用模具可重复使用或分享给他人
持久性镜像不可变,需重新构建以更新容器运行时状态可变,但重启后恢复镜像状态

Docker仓库 (Registry):

  • 定义: 用于存放和分享Docker镜像的场所。

  • Docker Hub: Docker的官方公共仓库,存储了大量用户分享的Docker镜像。

Docker安装

运行环境: Docker通常基于Linux容器化技术。在Windows和Mac电脑上,Docker通过虚拟化一个Linux子系统来运行。

推荐环境: Linux系统宿主机是最佳的Docker实战环境。

Linux系统安装:

  1. 访问getdocker.com获取安装脚本。

  2. 执行安装脚本(例如,通过curl -fsSL https://get.docker.com -o get-docker.sh下载脚本,然后执行sudo sh get-docker.sh)。

  3. 安装完成后,若非root用户,需在所有docker命令前添加sudo以获取管理员权限。

Windows系统安装:

  1. 启用Windows功能: 勾选“Virtual Machine Platform”(虚拟机平台)和“适用于Linux的Windows子系统”(WSL)。

  2. 重启电脑: 根据提示完成重启。

  3. 安装WSL:

// 以管理员身份打开命令提示符(CMD)。
wsl --set-default-version 2 // 将WSL默认版本设为2。wsl --update // 安装WSL(国内网络建议添加`--web-download`参数减少下载失败)。
  1. 下载并安装Docker Desktop: 从官方网站下载对应CPU架构的安装包(Windows通常为AMD64),按提示完成安装。

  2. 启动Docker Desktop: 需保持Docker Desktop软件运行。

  3. 验证安装: 在Windows终端输入docker --version,若能打印版本号则表示安装成功。

Mac系统安装:

  1. 根据Mac电脑的芯片类型(Intel或Apple Silicon)下载对应的Docker Desktop安装包。

  2. 按提示完成安装。

命令行使用: 尽管Docker Desktop提供可视化界面,但命令行在各操作系统上通用性更强,因此教程主要通过命令行讲解。

Docker镜像管理命令

下载镜像

// 从Docker仓库下载镜像到本地。
docker pull

镜像构成: 一个完整的镜像名称包含四部分:[registry_address/][namespace/]image_name[:tag]

  1. registry_address: Docker仓库的注册表地址。docker.io表示Docker Hub官方仓库,可省略。

  2. namespace: 命名空间,通常是作者或组织名称。library是Docker官方仓库的命名空间,可省略。

  3. image_name: 镜像的名称。

  4. tag: 镜像的标签名,通常表示版本号。latest表示最新版本,可省略。

示例:

 docker pull nginx: 从Docker Hub官方仓库下载最新版Nginx镜像。docker pull n8n/n8n: 从N8n的私有仓库下载N8n镜像。

Registry (注册表) 与 Repository (镜像库):

  1. Registry: 整个Docker Hub网站可视为一个Registry。

  2. Repository: 一个Repository(如Nginx)存储了同一个镜像的不同版本。

网络问题解决方案 (镜像站配置):

  1. Linux: 修改/etc/docker/daemon.json文件,添加"registry-mirrors": ["https://<your-mirror-address>"],然后重启Docker服务(sudo systemctl restart docker)。

  2. Windows/Mac: 在Docker Desktop的设置中,进入“Docker Engine”配置项,在registry-mirrors中添加镜像站地址,点击“Apply & Restart”。

常用命令

列出本地镜像

显示所有已下载到本地的Docker镜像信息,包括镜像名称、标签、镜像ID、创建时间和大小。

docker images
删除镜像
  • 功能: 删除本地的Docker镜像。

  • 参数: 可指定镜像名称或ID。

docker rmi

镜像CPU架构 (--platform)

  1. 背景: Docker镜像作为软件,在不同的CPU架构下(如AMD64、ARM64)有不同的版本。

  2. 默认行为: docker pull命令默认会自动选择最适合当前宿主机CPU架构的镜像。

  3. 特殊情况:

    • 对于某些低功耗迷你主机(如香橙派),其CPU架构通常为ARM64,需确认所需镜像是否提供ARM64版本。

    • Mac电脑(ARM64架构)的Docker Desktop会使用QEMU模拟X86-64指令集,以兼容部分AMD64镜像,但可能存在兼容性或性能开销。

Docker容器管理命令

创建并运行容器 (最重要命令)
  • 功能: 使用指定的镜像创建并运行一个容器。

  • 自动拉取: 如果本地不存在指定镜像,docker run会先自动拉取镜像,再创建并运行容器。

docker run
启动镜像
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
// 例子: 启动mysql镜像
docker run -p 3306:3306 -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

参数:

  • -p 本机端口和容器启动端口映射
  • -d 后台运行
  • –name 容器名称
  • -e 镜像启动参数
    注意:详见基础参数👇
    在这里插入图片描述
    在这里插入图片描述
关闭镜像
docker stop bab80f58269d
查看正在运行的容器。
docker ps
输出信息包括:`Container ID`(容器唯一ID)、`Image`(基于哪个镜像创建)、`Names`(容器名称)
查看所有容器(包括正在运行和已停止的)。
docker ps -a
基础参数

-d(DetachedMode)

功能:让容器在后台执行,不阻塞当前终端窗口。

效果:控制台只打印容器ID,容器日志不会直接输出到终端。

-p(PortMapping/端口映射)

背景:Docker容器运行在独立的虚拟网络环境中,默认无法直接从宿主机访问容器内部网络。

功能:将宿主机的端口映射到容器内部的端口。

语法

-p<宿主机端口>:<容器内部端口>(先外后内)

示例-p 80:80将宿主机的80端口转发到容器内的80端口。

-v(VolumeMounting/挂载卷)

功能:将宿主机的文件目录与容器内的文件目录进行绑定。

目的:实现数据的持久化保存。当容器被删除时,容器内的数据也会被删除,但挂载卷可确保数据保存在宿主机上。

类型:绑定挂载(BindMount):直接将宿主机目录路径写入命令。

语法

-v<宿主机目录路径>:<容器内部目录路径>

注意:宿主机目录内容会覆盖容器内对应目录的原始内容。

卷管理命令:

命名卷挂载(NamedVolume):让Docker自动创建一个存储空间,并为其命名。

创建命名卷

docker volume  create<卷名称>

使用命名卷

-v<卷名称>:<容器内部目录路径>

特点:命名卷在第一次使用时,Docker会将容器的文件夹内容同步到命名卷进行初始化(绑定挂载无此功能)。

docker volume ls:列出所有创建过的卷。

docker volume inspect<卷名称>:查看卷的详细信息,包括在宿主机的真实目录。

docker volume rm<卷名称>:删除一个卷。

docker volume prune:删除所有未被任何容器使用的卷。

-e(EnvironmentVariables/环境变量):

功能:向容器内部传递环境变量。

语法

-e <KEY>=<VALUE>

用途:常用于配置数据库账号密码等。

查找:可在DockerHub镜像文档或开源项目的GitHub仓库中查找可用的环境变量。

--name(自定义容器名称):

功能:为容器指定一个自定义的、在宿主机上唯一的名称。

好处:方便记忆和管理。

-it(Interactive&TTY/交互式终端):

功能:让控制台进入容器内部,获得一个交互式的命令行环境。

用途:临时调试容器,执行Linux命令。

语法

docker  run-it<镜像名称>/bin/bash`(`/bin/sh`)

--rm(运行结束后自动删除):

功能:当容器停止时,自动将其从宿主机上删除。

常用组合:与-it联用,用于临时调试场景。

--restart(重启策略):

功能:配置容器停止时的重启行为。

常用策略:

always:只要容器停止(包括内部错误崩溃、宿主机断电等),就会立即重启。

unless-stopped:除非手动停止容器,否则都会尝试重启。对于生产环境非常有用,可自动重启因意外停止的容器,而手动停止的容器不会再重启。

容器启停与管理

docker stop<容器ID或名称>:停止一个正在运行的容器。

docker start<容器ID或名称>:重新启动一个已停止的容器。

参数保留:使用stopstart启停容器时,之前docker run时设置的端口映射、挂载卷、环境变量等参数都会被Docker记录并保留,无需重新设置。

docker inspect<容器ID或名称>:查看容器的详细配置信息。输出内容复杂,可借助AI辅助分析。

docker create<镜像名称>:只创建容器,但不立即启动。若要启动,需后续执行docker start命令。

*###容器内部操作与调试

docker logs<容器ID或名称>:查看容器的运行日志。

-f:滚动查看日志,实时刷新。

Docker技术原理简述:

Cgroups(ControlGroups):用于限制和隔离进程的资源使用(CPU、内存、网络带宽等),确保容器资源消耗不影响宿主机或其他容器。

Namespaces:用于隔离进程的资源视图,使得容器只能看到自己内部的进程ID、网络资源和文件目录,而看不到宿主机的。

本质:Docker容器本质上是一个特殊的进程,但进入容器内部后,其表现如同一个独立的操作系统。

docker exec-在容器内部执行命令:

功能:在一个正在运行的Docker容器内部执行Linux命令。

语法

bash docker exec<容器ID或名称><命令>

示例bash docker execmy_nginxps-ef //查看容器内进程。

进入交互式环境docker exec-it<容器ID或名称>/bin/sh(或/bin/bash)可进入容器内部获得交互式命令行环境,进行文件系统查看、进程管理或深入调试。

注意:容器内部通常是极简操作系统,可能缺失vi等常用工具,需要自行安装(如Debian系容器使用aptupdateaptinstallvim)。

Dockerfile - 构建镜像的蓝图

Dockerfile是一个文本文件,详细列出了如何制作Docker镜像的步骤和指令,可类比为制作模具的图纸。

基本结构与指令:

  • FROM <基础镜像>: 所有Dockerfile的第一行,选择一个基础镜像,表示新镜像在此基础上构建。

  • WORKDIR <目录路径>: 设置镜像内的工作目录,后续命令在此目录下执行。

  • COPY <源路径> <目标路径>: 将宿主机的文件或目录拷贝到镜像内的指定路径。

  • RUN <命令>: 在镜像构建过程中执行的命令(例如安装依赖)。

  • EXPOSE <端口号>: 声明镜像提供服务的端口(仅为声明,非强制,实际端口映射仍由-p参数决定)。

  • CMD <命令>: 容器运行时默认执行的启动命令。一个Dockerfile只能有一个CMD指令。

  • ENTRYPOINT <命令>: 与CMD类似,但优先级更高,不易被docker run命令覆盖。

docker build - 构建镜像:

  • 功能: 根据Dockerfile构建Docker镜像。

  • 语法: docker build -t <镜像名称>[:<版本号>] <Dockerfile所在目录>

  • 示例: docker build -t docker-test . (在当前目录构建名为docker-test的镜像)。

镜像推送至Docker Hub:

  1. 登录Docker Hub: docker login

  2. 重新标记镜像: docker tag <本地镜像名称> <你的用户名>/<镜像名称>[:<版本号>]。推送时镜像名称必须包含用户名作为命名空间。

  3. 推送镜像: docker push <你的用户名>/<镜像名称>[:<版本号>]

  4. 验证: 在Docker Hub网站上可搜索到已推送的镜像,其他用户即可通过docker pull下载使用。

Docker网络模式

Bridge (桥接模式)

默认模式: 所有容器默认连接到此网络。

内部IP: 每个容器被分配一个内部IP地址(通常是172.17.x.x开头)。

通信: 同一Bridge网络内的容器可以通过内部IP地址互相访问。容器网络与宿主机网络默认隔离,需通过端口映射(-p)才能从宿主机访问。

自定义子网:

  • 创建: docker network create <子网名称>

  • 加入: docker run --network <子网名称> ...

  • 优势:

    • 同一子网内的容器可以使用容器名称互相访问(Docker内部DNS机制)。

    • 不同子网之间默认隔离。

Host (主机模式)

功能: Docker容器直接共享宿主机的网络命名空间。

IP地址: 容器直接使用宿主机的IP地址。

**端口:** 无需端口映射(`-p`),容器内的服务直接运行在宿主机的端口上,通过宿主机的IP和端口即可访问。

用途: 解决一些复杂的网络问题。

语法:

docker run --network host ...
None (无网络模式)

功能: 容器不连接任何网络,完全隔离。

语法: docker run --network none ...

网络管理命令:

  • docker network ls: 列出所有Docker网络(包括默认的bridge、host、none以及自定义子网)。

  • docker network rm <网络名称>: 删除自定义子网(默认网络不可删除)。

Docker Compose - 多容器编排

背景: 当一个完整的应用由多个模块(如前端、后端、数据库)组成时,若将所有模块打包成一个巨大容器,会导致故障蔓延、伸缩性差。若每个模块独立容器化,则管理多个容器(创建、网络配置)会增加复杂性。

解决方案: Docker Compose是一种轻量级的容器编排技术,用于管理多个容器的创建和协同工作。

核心: 使用YAML文件(通常命名为docker-compose.yml)定义多服务应用。

YAML文件结构: 可视为多个docker run命令按照特定格式组织在一个文件中。

  • services: 顶级元素,每个服务对应一个容器。

  • 服务名称(如mongodb): 对应docker run中的--name,作为容器名的一部分。

  • image: 对应docker run中的镜像名。

  • environment: 对应docker run-e参数。

  • volumes: 对应docker run-v参数。

  • ports: 对应docker run-p参数。

网络: Docker Compose会自动为每个Compose文件创建一个默认子网,文件中定义的所有容器都会自动加入此子网,并可通过服务名称互相访问。

  • depends_on: 定义容器的启动顺序,确保依赖服务先启动。

AI辅助: 可借助AI工具生成等价的Docker Compose文件。
Docker Compose命令:

  • docker compose up: 启动YAML文件中定义的所有服务(容器)。

  • docker compose down: 停止并删除由Compose文件定义的所有服务和网络。

  • docker compose stop: 仅停止服务,不删除容器。

  • docker compose start: 启动已停止的服务。

  • docker compose -f <文件名.yml> up: 指定非标准文件名的Compose文件进行操作。

适用场景: Docker Compose适合个人使用和单机运行的轻量级容器编排需求。

与Kubernetes对比: Kubernetes是企业级服务器集群和大规模容器编排的解决方案,功能更为复杂。

总结

以上内容涵盖了Docker的核心概念、在不同操作系统上的安装方法、常用的镜像与容器管理命令、Dockerfile的编写与镜像构建流程、Docker的多种网络模式,以及轻量级多容器编排工具Docker Compose的使用。这些是理解和应用Docker的关键知识点。

http://www.dtcms.com/a/593354.html

相关文章:

  • 视频网站开发问题整人网站建设
  • 【Java】面向对象编程
  • 作业11.9
  • 西安网站开发公司网站服务器租用价格
  • 北京市城乡结合部建设领导小组办公室网站聊城做网站的公司效果
  • 百家号网站开发属于什么领域广东省住房和城乡建设局官网
  • MATLAB的加权K-means(Warp-KMeans)聚类算法
  • Python 图像处理库 scikit-image:从原理到实战
  • 帆软8.0报表,导出pdf无法显示图片。
  • Vue Router (命名视图)
  • CTFshow-web208
  • 美化网站代码合伙合同网站建设协议
  • 网站域名购买方法域名地址查询网
  • 【剑斩OFFER】算法的暴力美学——搜索插入位置
  • 滨州市住房和城乡建设局网站自己做网站地址
  • ctfshow-web213
  • 【Rust】C和Rust交叉编译
  • 企业网站建设长沙找工作临时工
  • 六安网站建设报价方案陕西住房和建设厅网站
  • Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
  • 第3章,[标签 Win32] :创建窗口01,CreateWindow 函数初识
  • FreeRTOS操作系统
  • 成都 在线 网站建设wordpress怎么改标题和meta
  • 正确理解类中的公共方法、内部方法和私有方法
  • 太平洋在线企业建站系统iphone wordpress
  • 零基础入门C语言之C语言实现数据结构之单链表
  • 4. SpringBoot 自定义Banner使用与原理解析
  • Docker环境搭建:Windows/macOS/Linux全平台教程
  • mac安装GIT
  • 开锁公司做网站网站对企业的好处