尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Docker 学习笔记1 --Docker介绍安装使用

Docker 学习笔记1 --Docker介绍安装使用 第 1 章 Docker初体验(相关介绍)docker 一.核心概念: 镜像:软件安装包 容器:安装好的软件 镜像:软件的安装包 仓库:应用商店 数据卷:电脑d盘 守护进程: 接收客户端的指令 进行相关的操作 二.核心工具 1.docker 打包环境和代码为一个镜像 2.Dockerfile 自定义镜像 3.docker-compose.yml 多容器管理 4.架构 cs 5.命令 镜像 docker pull 拉取 docker rmi 删除 docker images [-qa] 所有镜像的id docker rmi $(docker images -qa) 容器 docker run 镜像名 如果本地有镜像执行运行 如果本地有没有镜像 仓库查找 找到拉取 docker ps 查看运行的容器 docker ps -aq 查看所有的容器id docker stop 容器名 docker start 容器名 进入正在运行的容器:docker exec -it 运行的容器名 sh 进入一刹那结束容器:docker run -it 镜像名 sh docker compose docker compose up -d 运行 docker compose down 删除运行的容器1.1为什么会出现Docker在没有Docker之前软件开发和上线会遇到一个经典难题环境不一致。开发在自己电脑上跑得好好的一放到测试 / 生产环境就报错。换一台服务器就要重新装系统、装依赖、配配置步骤繁琐又容易出错。项目版本一多环境差异、依赖冲突、兼容性问题会让开发和运维非常痛苦很多人想到能不能从根本上解决问题软件可以带环境安装也就是说安装的时候把原始环境一模一样地复制过来。Docker 正是为了解决这个痛点诞生的。它提供了一套标准化的环境打包与运行方案– 把代码、依赖、配置、系统环境全部打包在一起形成一个可移植的容器。这样一来开发只管写代码容器里是什么环境上线就是什么环境。运维不用再反复配置机器直接运行容器即可。彻底解决了 “在我电脑上能跑上线就不行” 的协作痛点。1.2 Docker简介官网地址https://www.docker.com/docker 是一个开源的应用容器引擎基于Go语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中然后发布到任何流行的 Linux 机器上也可以实现虚拟化。容器是完全使用沙箱机制相互之间不会有任何接口类似 iPhone 的 app,更重要的是容器性能开销极低。Docker的主要目标是“BuildShip and Run Any App,Anywhere”也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理使用户的APP可以是一个WEB应用或数据库应用等等及其运行环境能够做到“一次封装到处运行”。总之一句话只需要一次配置好环境换到别的机子上就可以一键部署好大大简化了操作 。1.3 Docker的优势可移植性Docker容器可以在任何支持Docker的环境中运行包括本地开发环境、测试环境和生产环境从而提高了应用程序的可移植性。可伸缩性Docker容器可以根据负载的变化进行快速扩展和收缩从而更好地满足应用程序的需求。隔离性Docker容器提供了隔离的运行环境从而使得不同容器中运行的应用程序互相隔离避免了应用程序之间的干扰。1.4 Docker和虚拟机的区别隔离性在于隔离性上面由于vm对操作系统也进行了虚拟化隔离的更加彻底。而Docker共享宿主机的操作系统隔离性较差。运行效率由于vm的隔离操作导致生成虚拟机的速率大大低于容器Docker生成的速度因为Docker直接利用宿主机的系统内核。它们的启动速度是在数量级上的差距。资源利用率在资源利用率上虚拟机由于隔离更彻底因此利用率也会相对较低。经典名句虚拟机已死容器才是未来1.5 Docker架构Docker 是一个客户端-服务器C/S架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API (它就是一套设计网络 API 的规则和约定告诉开发者如何规范、高效地构建和调用 Web 服务)。你可以在同一台宿主机上运行 Docker 守护进程和客户端也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。1.6 Docker核心概念1.6.1 镜像Image—类比「软件安装包」定义镜像就是一个只读的模板包含了运行某个应用程序所需的全部环境比如操作系统、软件依赖、配置文件等。实操关联:后续会介绍下载「mysql:8.0.45」镜像MySQL 8.0.45的“安装包”、「python:3.9-slim」镜像Python 3.12的“安装包”这些镜像都是从官方仓库Docker Hub下载的无需手动配置环境。关键特点只读不能直接修改可作为模板创建多个容器。1.6.2 容器Container—类比「已安装好的软件」定义容器是镜像的运行实例是一个可读写的独立环境相当于“把安装包安装好后能直接使用的软件”。实操关联我们执行「docker run」命令就是基于「mysql:8.0.45」镜像创建并启动一个MySQL容器相当于“安装并启动MySQL服务”启动后容器内的MySQL就能正常使用且和本地其他环境互不干扰。关键特点可启动、停止、删除多个容器相互独立容器删除后里面的数据默认会丢失可通过“数据卷”保留后续会讲。1.6.3 仓库Repository—类比「手机应用商店」定义仓库是用于存放和下载镜像的平台相当于“镜像的聚集地”最常用的是官方仓库Docker Hub。实操关联我们执行「docker pull 镜像名」命令就是从Docker Hub下载对应的镜像比如「docker pull mysql:8.0.45」就是下载MySQL 8.0.45的镜像。官方仓库地址https://hub.docker.com/ 无需注册也能下载公开镜像注册后可保存自定义镜像。1.6.4 数据卷Volume—— 类比「电脑的D盘专门存数据」定义数据卷是Docker中用于持久化数据的工具相当于“给容器挂一个独立的存储盘”容器删除后数据卷中的数据不会丢失。实操关联我们在Docker Compose配置中会用「volumes: mysql-data:/var/lib/mysql」配置数据卷用于保存MySQL的数据这样即使删除MySQL容器下次启动新容器之前的数据库、表、数据依然存在移植时数据也能保留。1.7 核心工具1.7.1 Dockerfile —自定义镜像的“构建脚本”定义Dockerfile 是一个纯文本文件无后缀名包含一系列简单的指令用于告诉 Docker “如何构建自定义镜像”。核心作用解决“环境配置繁琐、版本不一致”的问题。比如我们需要一个“包含 Python 3.12 pymysql 依赖 自定义脚本”的镜像无需手动安装 Python 和 依赖只要编写 Dockerfile执行一条命令Docker 就会自动构建出符合需求的镜像。实操关联后续我们会编写 Dockerfile构建一个包含 Python 环境和连接脚本的镜像用于和 MySQL 容器联动。1.7.2 Docker Compose —多容器的“一键管理工具”定义Docker Compose 是一个用于管理多容器的工具通过一个yaml格式的配置文件固定命名为 docker-compose.yml 定义多个关联容器的配置比如镜像、端口、依赖关系执行一条命令就能一键启动、停止所有容器。核心作用简化多容器部署。比如我们需要同时启动 MySQL 容器和 Python 容器且 Python 容器要依赖 MySQL 容器先启动 MySQL再启动 Python无需手动逐个启动用Docker Compose一键搞定。实操关联后续会编写 docker-compose.yml配置MySQL8.0.45和 Python 两个容器实现一键启动和联动。第 2 章 Win11下Docker 安装与卸载Docker 在 Win11 上运行需依赖 WSL2 Windows Subsystem for LinuxWindows Linux 子系统必须先完成准备工作否则Docker无法启动。2.1 安装前准备2.1.1 开启虚拟化可以通过任务管理器-性能查看虚拟化是否开启一般电脑都已经开启如果没有开启重启电脑开机时按主板快捷键联想F2、戴尔F12、华硕F8进入BIOS找到“ Virtualization Technology ”虚拟化技术设置为“Enabled”启用保存并重启电脑。2.1.2 启用 WSL 和 虚拟机平台功能必须运行 Windows10 的 2004及更高版本内部版本19041及以上或Windows11WinR 输入winver直接查看可视化方式在控制面板-程序-启用或关闭 Windows 功能中勾选适用于 Linux 的 Windows 子系统以及虚拟机平台( wsl2 需要)命令方式# 适用于Linux的Windows子系统 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart # 虚拟机平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart2.1.3 更新WSL内核如果通过命令更新会非常慢。为了加快速度直接从github里面下载最新版本。https://github.com/microsoft/WSL/releases下载完成后双击安装。注意如果是arm架构请选择对应的文件。2.2 安装与验证2.2.1下载Docker安装包访问Docker官方下载页下载“Docker Desktop for Windows”安装包。官方下载地址https://www.docker.com/products/docker-desktop/2.2.2 安装Docker双击下载的安装包点击“下一步”默认安装即可安装完成后Docker会自动启动如果安装的过程中有阻止对host的修改点击允许。2.2.3 验证安装打开Win11终端CMD或PowerShell执行以下两条命令若均能显示版本号说明安装成功docker --version docker compose version2.3 Docker 镜像源配置默认 Docker 镜像源为国外官方仓库Docker Hub国内下载镜像如mysql:8.0.45、python:3.12-slim速度较慢甚至超时失败配置国内镜像源阿里云可大幅提升下载速度。2.3.1 打开 Docker Desktop确保 Docker 已启动点击右上角“设置”齿轮图标。2.3.2 找到镜像源配置项在左侧菜单找到“Docker Engine”Docker引擎点击进入配置页面。2.3.3 添加国内镜像源在配置文件中找到“registry-mirrors”字段添加阿里云镜像源若没有该字段手动新增完整配置如下{ builder: { gc: { defaultKeepStorage: 20GB, enabled: true } }, experimental: false, features: { buildkit: true }, registry-mirrors: [ https://docker.xuanyuan.me, https://docker.1ms.run, https://docker.m.daocloud.io ] }2.3.4 应用配置并重启点击页面右下角“Apply Restart”应用并重启等待 Docker 重启完成镜像源配置生效。2.4 Docker 卸载若 Docker 安装失败、版本不兼容或无需使用 Docker可按以下步骤彻底卸载避免残留文件影响后续操作2.4.1 停止 Docker 服务找到任务栏右下角的 Docker 鲸鱼图标可能在隐藏图标里点 ^ 展开 右键点击 → 选择 Quit Docker Desktop / 退出 Docker Desktop 等待几秒Docker 就完全停止了2.4.2 卸载 Docker 应用打开 “控制面板” → “程序应” → “卸载”在搜索框输入“Docker Desktop”点击右侧“三个点” → “卸载”按提示完成卸载过程约1-2分钟。2.4.3 删除 WSL 2 相关的 Docker 发行版关键以管理员身份打开 PowerShell执行# 停止所有 WSL 实例 wsl --shutdown # 查看已安装的 WSL 发行版会看到 docker-desktop、docker-desktop-data wsl --list --verbose # 删除 Docker 相关的 WSL 发行版彻底清理镜像/容器数据 wsl --unregister docker-desktop wsl --unregister docker-desktop-data2.4.4 删除残留文件可选彻底清理删除用户目录下的Docker残留打开文件资源管理器进入 C:\Users\你的用户名.docker删除整个.docker文件夹删除C:\Users\你的用户名\AppData\Local\Dockerdocker-secrets-engineWSL 虚拟磁盘、日志删除C:\Program Files\Docker安装目录残留2.4.5 验证卸载终端执行 docker --version若提示“不是内部或外部命令”说明卸载成功。2.4.6卸载wsl右键 wsl.2.6.3.0.x64.msi 卸载 wsl取消勾选 虚拟机平台取消勾选 适用于 Linux 的 Windows 子系统第 3 章 基础案例Win11下Python连接MySQL原来我们自己在windows上安装的MySQL现在MySQL从Docker镜像下载。基础案例适合初学者理解“镜像→容器→连接”的核心流程手动操作、步骤简单无需复杂工具重点掌握“下载镜像→启动容器→本地连接”的逻辑。3.1 下载并启动 MySQL 8.0.45容器 Win11终端执行3.1.1 从 Docker Hub下载 MySQL 8.0.45 镜像已配置国内镜像源速度更快docker pull mysql:8.0.45 查看镜像 docker images3.1.2 启动 MySQL 容器密码123456可自定义docker run -d --name mysql-db -p 9999:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0.45 命令说明 docker run 创建并启动一个Docker -d 后台运行detach不占用当前终端 --name mysql-db 给容器命名为mysql-db自定义名称方便后续docker stop mysql-db等命令操作不加会生成随机名 -p 9999:3306 端口映射主机9999端口→容器内3306端口左边是电脑本机端口右边是容器内端口本机端口可改如-p9999:3306 -e MYSQL_ROOT_PASSWORD123456 设置 MySQLroot用户的密码为123456 MySQL镜像必须设置这个变量否则容器启动失败密码可自定义 mysql:8.0.45 要运行的镜像名MySQL官方镜像版本8.0.45 查看容器 docker ps3.2 本地安装Python及依赖3.2.1 确保本地已经有python环境以及安装了pymysql依赖3.2.2 编写Python连接脚本新建test_mysql.py文件复制以下代码将host改为localhost密码与启动容器时一致import pymysql连接MySQL参数与启动容器时一致conn pymysql.connect( hostlocalhost, # 本地地址端口已映射 port9999, # 映射后的端口 userroot, # MySQL默认用户名 password123456, # 启动容器时设置的密码 databasemysql, # MySQL默认数据库 charsetutf8mb4, # 避免中文乱码 cursorclasspymysql.cursors.DictCursor # 可选让查询结果更易读 ) cursor conn.cursor() # 测试连接查询MySQL版本 cursor.execute(SELECT VERSION()) print(fMySQL版本{cursor.fetchone()[VERSION()]}) # 关闭连接 cursor.close() conn.close() print(基础版Python连接MySQL8.0.45成功)3.2.3 运行脚本执行python test_mysql.py能看到MySQL版本和“连接成功”提示即完成基础版连接。第 4 章 进阶案例Win11下Python连接MySQL进阶版是实际开发中最常用的方式核心用到「Dockerfile」和「Docker Compose」两个工具实现“一键启动多容器、环境可复用”本节将两个工具融入实操边用边理解。4.1核心工具说明Dockerfile纯文本构建脚本用于构建自定义镜像比如包含 Python 环境依赖脚本的镜像避免手动配置环境Docker Compose多容器管理工具通过 yaml 配置文件一键启动、停止多个关联容器比如 MySQL 和 Python 容器简化部署。4.2实操步骤4.2.1 新建项目目录在Win11桌面新建一个文件夹命名为 docker-python-mysql名称可自定义后续命令对应即可。4.2.2编写 Dockerfile构建Python自定义镜像进入 docker-python-mysql 目录新建一个文本文件删除后缀名确保文件名为“Dockerfile”无.txt复制以下代码# 1. 指定基础镜像Python 3.12稳定版兼容性好FROM python:3.12# 2. 设置容器内的工作目录用于存放脚本和依赖 WORKDIR /app # 3. 复制本地项目目录下的所有文件test_mysql.py、Dockerfile等到容器的/app目录 COPY . /app # 4. 安装Python依赖pymysql使用清华源加速下载避免超时初学者无需修改 RUN pip install pymysql cryptography # 5. 容器启动时自动执行的命令运行Python连接脚本 CMD [python, test_mysql1.py] 关键理解通过以上指令Docker 会自动构建一个包含 Python 3.12、pymysql 依赖的镜像无需我们手动安装 Python 环境。4.2.3编写docker-compose.yml配置多容器在docker-python-mysql目录下新建一个文本文件命名为docker-compose.yml后缀为yml不能错复制以下代码 # 核心功能一键启动MySQL容器Python应用容器实现容器间通信、数据持久化 services: # 容器1MySQL服务容器命名为mysql-db容器间可通过该名称访问 mysql-db: # 基础镜像指定MySQL 8.0.45版本稳定性高适配Python连接 image: mysql:8.0.45 # 重启策略容器意外关闭/服务器重启时自动重启保证服务可用性 restart: always # 环境变量配置MySQL核心参数无需手动进入容器修改 environment: MYSQL_ROOT_PASSWORD: 123456 # root用户密码自定义Python连接需一致 MYSQL_DATABASE: test_db # 自动创建初始数据库无需手动建库 # 字符编码配置适配MySQL 8.0避免中文乱码/连接报错 MYSQL_INITDB_ARGS: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci # 端口映射本地9999端口 → 容器内3306端口避免与本地MySQL端口冲突 ports: - 9999:3306 # 数据卷挂载Windows本地D盘mysql-data目录 → 容器内MySQL数据目录持久化数据 volumes: - D:/mysql-data:/var/lib/mysql # 加入自定义网络与Python容器互通容器间通信的基础 networks: - app-network # 健康检查判断MySQL服务是否真正就绪而非仅容器启动解决连接拒绝问题 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost, -uroot, -p123456] # 检测MySQL是否可ping通 interval: 3s # 每3秒检查一次 timeout: 3s # 单次检查超时时间3秒 retries: 10 # 最多重试10次覆盖MySQL启动初始化时间 start_period: 5s # 容器启动后延迟5秒再开始检查避免过早检测 # 容器2Python应用容器命名为python-app业务代码运行载体 python-app: # 构建规则基于当前目录下的Dockerfile构建自定义Python镜像 build: . # 依赖条件等待mysql-db容器的健康检查通过后再启动本容器核心修复解决MySQL未就绪问题 depends_on: mysql-db: condition: service_healthy # 仅当MySQL服务就绪时才启动Python容器 # 环境变量传递MySQL连接信息Python代码可通过os.getenv获取无需硬编码 environment: MYSQL_HOST: mysql-db # 容器间通信地址直接填MySQL容器名无需IP MYSQL_PORT: 3306 # MySQL容器内端口非本地9999 MYSQL_USER: root # 与MySQL容器的用户名一致 MYSQL_PASSWORD: 123456 # 与MySQL容器的密码一致修改需同步 MYSQL_DB: test_db # 与MySQL容器自动创建的数据库名一致 # 加入自定义网络与MySQL容器在同一网络才能通信 networks: - app-network # 自定义网络桥接模式Docker默认保证两个容器相互可见、可访问 networks: app-network: driver: bridge 关键提醒MySQL密码为123456可自定义修改但需同步修改Python容器的MYSQL_PASSWORD否则连接失败。查看docker网络信息: docker network ls2.4 编写 Python 连接脚本test_mysql1.py在 docker-python-mysql 目录下新建一个 Python 文件命名为test_mysql1.py复制以下代码脚本会从环境变量获取 MySQL 连接信息无需硬编码import pymysql import os import sys import time # 新增MySQL连接重试函数解决服务未就绪问题 def get_mysql_conn(): max_retries 10 # 最多重试10次 retry_delay 2 # 每次重试间隔2秒 for i in range(max_retries): try: conn pymysql.connect( hostos.getenv(MYSQL_HOST, localhost), portint(os.getenv(MYSQL_PORT, 3306)), useros.getenv(MYSQL_USER, root), passwordos.getenv(MYSQL_PASSWORD, 123456), databaseos.getenv(MYSQL_DB, test_db), charsetutf8mb4, connect_timeout3 ) print(f✅ 第{i1}次尝试MySQL连接成功) return conn except pymysql.err.OperationalError as e: print(f❌ 第{i1}次尝试MySQL连接失败 - {e}) if i max_retries - 1: print(f⏳ 等待{retry_delay}秒后重试...) time.sleep(retry_delay) else: raise Exception(❌ 重试10次后仍无法连接MySQL请检查容器配置) from e # 主逻辑 if __name__ __main__: conn None cursor None try: # 获取带重试的数据库连接 conn get_mysql_conn() cursor conn.cursor() # 原测试逻辑不变 cursor.execute(SELECT DATABASE()) db_name cursor.fetchone()[0] print(f当前连接的数据库{db_name}) cursor.execute(CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50))) cursor.execute(INSERT INTO test_table (name) VALUES (Docker Compose测试)) conn.commit() cursor.execute(SELECT * FROM test_table) data cursor.fetchall() print(test_table中的测试数据, data) # 输出Python版本 python_version sys.version print(f\n当前运行的Python版本{python_version}) print( Docker Compose环境下Python连接MySQL8.0.45成功) except Exception as e: print(f\n❌ 程序执行失败{e}) if conn: conn.rollback() # 出错回滚事务 finally: # 确保资源关闭 if cursor: cursor.close() if conn: conn.close()4.2.5 实例验证打开Win11终端进入docker-python-mysql目录执行以下命令可直接复制按需求选择# 1. 停止基础案例中启动的mysql-db容器否则端口冲突docker ps #查看正在运行的容器docker stop mysql-db # 停止运行中的容器docker ps -a #查看正在运行的容器 包括已经停止的docker rm mysql-db #删除已停止的容器# 2. 一键启动所有容器后台运行首次执行会自动构建Python镜像、下载MySQL镜像 docker compose up -d # 2. 查看所有容器的运行状态 docker compose ps # 3. 查看Python容器的运行日志验证Python是否成功连接MySQL docker compose logs python-app如果启动失败可以尝试其他命令。# 1. 停止并删除所有容器数据保留下次启动可恢复 docker compose down # 2. 停止并删除所有容器数据卷数据清空慎用 docker compose down -v # 3. 重新构建Python镜像并启动所有容器修改Dockerfile后需执行 docker compose up -d --build # 4. 彻底清理旧资源关键避免缓存干扰 删除所有镜像 docker-compose down --rmi all docker system prune -af
返回列表