ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Docker_01_Docker基础

Docker_01_Docker基础 Docker 基础从概念到实战完全指南一、什么是 Docker1.1 定义Docker 是一个开源的容器化平台它可以将应用程序及其所有依赖代码、运行时、系统库、配置文件打包到一个轻量级、可移植的容器中然后在任何支持 Docker 的环境中运行。1.2 Docker vs 虚拟机对比维度Docker 容器虚拟机启动速度秒级启动分钟级启动资源占用MB 级别GB 级别性能接近原生有虚拟化损耗隔离性进程级隔离硬件级隔离镜像大小通常几十 MB通常几 GB运行密度单机可运行数百个容器单机通常几十个操作系统共享宿主机内核每个 VM 需要完整 OS1.3 为什么用 Docker环境一致性开发、测试、生产环境完全一致告别在我电脑上能跑快速部署秒级启动弹性伸缩资源利用率高相比虚拟机更轻量版本管理镜像可以版本化方便回滚微服务架构每个服务独立容器便于维护和扩展二、核心概念2.1 三大核心概念┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 镜像 │ -- │ 容器 │ -- │ 仓库 │ │ (Image) │ │ (Container) │ │ (Registry) │ │ 只读模板 │ │ 运行实例 │ │ 存储分发 │ └─────────────┘ └─────────────┘ └─────────────┘镜像Image只读的应用打包模板包含运行应用所需的所有文件采用分层存储每层是上一层的变更容器Container镜像的运行实例有自己的生命周期创建、运行、停止、删除容器之间相互隔离仓库Registry存储和分发镜像的服务Docker Hub 是官方公共仓库企业可搭建私有仓库如 Harbor2.2 架构Docker 采用 C/S 架构Docker Daemon后台守护进程负责管理镜像、容器、网络等Docker Client命令行工具通过 REST API 与 Daemon 通信Registry镜像仓库存储和分发镜像三、安装与配置3.1 LinuxUbuntu安装# 卸载旧版本sudoapt-getremovedockerdocker-engine docker.io containerd runc# 安装依赖sudoapt-getupdatesudoapt-getinstall\ca-certificates\curl\gnupg\lsb-release# 添加 Docker 官方 GPG 密钥sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|\sudogpg--dearmor-o/etc/apt/keyrings/docker.gpg# 设置仓库echo\deb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \$(lsb_release-cs)stable|\sudotee/etc/apt/sources.list.d/docker.list/dev/null# 安装 Docker Enginesudoapt-getupdatesudoapt-getinstalldocker-ce docker-ce-cli containerd.io docker-compose-plugin3.2 验证安装# 查看版本docker--version# 输出: Docker version 24.0.x, build xxx# 运行测试容器dockerrun hello-world# 查看 Docker 服务状态sudosystemctl statusdocker3.3 配置免 sudo 运行# 将用户加入 docker 组sudousermod-aGdocker$USER# 重新登录或执行newgrpdocker# 验证dockerps3.4 配置镜像加速国内用户# 创建或编辑 daemon.jsonsudomkdir-p/etc/dockersudotee/etc/docker/daemon.json-EOF { registry-mirrors: [ https://mirror.ccs.tencentyun.com, https://docker.mirrors.ustc.edu.cn ] } EOF# 重启 Dockersudosystemctl daemon-reloadsudosystemctl restartdocker四、镜像操作命令4.1 搜索与下载# 搜索镜像dockersearch nginxdockersearch mysql--filteris-officialtrue# 下载镜像dockerpull nginx:latestdockerpull mysql:8.0dockerpull ubuntu:22.04# 查看本地镜像dockerimagesdockerimages--filterdanglingtrue# 只看悬空镜像# 查看镜像详细信息dockerinspect nginx:latest# 查看镜像构建历史dockerhistorynginx:latest4.2 管理镜像# 给镜像打标签dockertag nginx:latest myregistry/nginx:v1.0# 删除镜像dockerrmi nginx:latestdockerrmiIMAGE_ID# 批量删除悬空镜像dockerimage prune-f# 清理所有未使用的镜像dockerimage prune-a-f# 导出镜像为文件dockersave-onginx.tar nginx:latest# 从文件导入镜像dockerload-inginx.tar4.3 推送镜像到仓库# 登录 Docker Hubdockerlogin# 推送镜像需要先 tagdockertag myimage:latest username/myimage:v1.0dockerpush username/myimage:v1.0# 退出登录dockerlogout五、容器操作命令5.1 创建与运行# 基础运行dockerrun nginx# 后台运行守护模式dockerrun-dnginx# 指定容器名称dockerrun-d--namemy-nginx nginx# 端口映射dockerrun-d-p8080:80 nginx# 宿主机 8080 - 容器 80# 映射多个端口dockerrun-d-p8080:80-p8443:443 nginx# 设置环境变量dockerrun-d-eMYSQL_ROOT_PASSWORD123456mysql:8.0# 挂载数据卷dockerrun-d-v/host/path:/container/path nginx# 交互式运行进入容器内部dockerrun-itubuntu:22.04 /bin/bash# 设置资源限制dockerrun-d--memory512m--cpus1nginx# 设置重启策略dockerrun-d--restartalways nginxdockerrun-d--restarton-failure:3 nginx5.2 查看容器# 查看运行中的容器dockerps# 查看所有容器包括已停止的dockerps-a# 查看容器日志dockerlogs my-nginxdockerlogs-fmy-nginx# 实时跟踪dockerlogs--tail100my-nginx# 最后 100 行# 查看容器详细信息dockerinspect my-nginx# 查看容器资源占用dockerstats# 查看容器内运行的进程dockertopmy-nginx5.3 容器生命周期管理# 停止容器dockerstop my-nginxdockerstop$(dockerps-q)# 停止所有运行中的容器# 启动已停止的容器dockerstart my-nginx# 重启容器dockerrestart my-nginx# 暂停容器暂停所有进程dockerpause my-nginx# 恢复暂停的容器dockerunpause my-nginx# 删除容器dockerrmmy-nginxdockerrm-fmy-nginx# 强制删除运行中的容器# 批量删除已停止的容器dockercontainer prune-f5.4 进入容器与执行命令# 进入容器交互式dockerexec-itmy-nginx /bin/bash# 在容器中执行单个命令dockerexecmy-nginxcat/etc/nginx/nginx.confdockerexecmy-nginxls-la/usr/share/nginx/html# 复制文件到容器dockercopy local_file.txt my-nginx:/app/# 从容器复制文件到本地dockercpmy-nginx:/app/data.txt ./local_file.txt# 查看容器资源占用dockerstats my-nginx六、实战示例6.1 部署一个 Nginx 网站# 创建网站目录mkdir-p~/mywebsiteechoh1Hello Docker!/h1~/mywebsite/index.html# 运行 Nginx 容器dockerrun-d\--namemy-website\-p8080:80\-v~/mywebsite:/usr/share/nginx/html\nginx:latest# 访问 http://localhost:8080 查看效果6.2 部署 MySQL 数据库dockerrun-d\--namemy-mysql\-p3306:3306\-eMYSQL_ROOT_PASSWORDroot123\-eMYSQL_DATABASEtestdb\-eMYSQL_USERmyuser\-eMYSQL_PASSWORDmypassword\-vmysql-data:/var/lib/mysql\mysql:8.0# 连接测试dockerexec-itmy-mysql mysql-uroot-proot123七、常见问题Q容器退出后数据会丢失吗A容器内的数据在容器删除后会丢失。需要使用 Volume 或 Bind Mount 持久化数据。Q如何查看容器占用多少资源A使用docker stats可以实时查看容器的 CPU、内存、网络等使用情况。Q容器和宿主机的网络如何通信A默认使用 bridge 网络容器有自己的 IP。通过-p端口映射可以在宿主机访问容器服务。八、面试高频题Q1Docker 和虚拟机有什么区别ADocker 容器共享宿主机内核虚拟机需要完整的操作系统。容器启动快秒级、资源占用少MB 级、性能接近原生但隔离性不如虚拟机。Q2什么是 Docker 镜像的分层存储ADocker 镜像由多个只读层组成每层是上一层的变更。多个镜像可以共享相同的基础层节省存储空间。容器运行时会在镜像层之上添加一个可写层。Q3Docker 容器之间如何通信A可以通过 Docker 网络bridge、host、overlay 等实现容器间通信。同一 bridge 网络中的容器可以通过容器名互相访问。也可以使用数据卷共享数据。下一篇Dockerfile 与存储网络
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进