Docker
Docker简介
部署方式的演进
软件开发早期,应用部署依赖全人工操作:开发者打包代码、拷贝至服务器,再手动安装依赖、配置环境并启动服务。核心问题是环境不一致,同一代码在不同服务器表现不同,系统管理员需反复调试版本与配置。
互联网规模扩大后,虚拟机技术登场。它通过 Hypervisor 在物理机上创建多个隔离实例,每个实例都有独立操作系统、内存和磁盘,既提升了资源利用率,也强化了系统隔离安全性。但虚拟机的短板也很明显:启动慢、资源占用大,且每个实例都要承载完整 OS 的冗余开销,部署和迁移效率受限。
为精准解决虚拟机的资源浪费与启动低效问题,容器技术应运而生。与虚拟机模拟完整操作系统的思路不同,容器采用 "共享内核" 的轻量级架构,直接复用宿主机的操作系统内核,无需额外搭载独立 OS。它仅对应用代码、运行时依赖进行封装,形成一个隔离的、可移植的运行单元。这种设计让容器具备了诸多核心优势:启动速度几乎瞬时完成,远快于虚拟机分钟级的启动耗时;体积仅几十 MB 到几百 MB,资源占用大幅降低,一台物理机可部署成百上千个容器,资源利用率进一步提升。同时,容器的封装特性确保了 "一次构建、到处运行",无论在开发环境、测试环境还是生产环境,应用运行状态完全一致。此外,容器的隔离性虽基于内核级实现,却能满足绝大多数应用的资源隔离需求,且支持快速扩容、缩容和迁移,完美适配互联网时代微服务架构和持续集成 / 持续部署的需求。
Docker的三个核心组件
- Docker Client:用户交互入口
是用户操作Docker的直接接口,命令行输入的 docker run、docker pull 等命令均由其接收
不直接执行操作,仅将命令解析后传递给Docker Daemon,同时反馈执行结果
支持本地或远程连接Daemon,灵活适配不同使用场景 - Docker Daemon:后台核心执行器
运行在主机后台的长期服务,是Docker体系的"干活的核心"
接收Client的指令,负责容器的创建、启动、停止、删除等实际管理操作
同时处理镜像的构建、本地存储,以及与Docker Registry的交互(拉取/推送镜像) - Docker Registry:镜像存储与分发中心
本质是存储容器镜像的远程仓库,类似"容器应用的应用商店"
公开仓库以Docker Hub为代表,包含大量官方和第三方镜像;也支持私有部署(如企业内部仓库)
供Docker Daemon拉取镜像(本地无镜像时)或推送本地构建的镜像,实现镜像的共享与分发
Docker 组件交互流程图

运行Docker容器
首先需要进入 opt 目录下 cd /opt,在 Linux 系统中,/opt 是存放用户或管理员自行安装的、不属于系统基础组件的第三方软件
mkdir docker 我们在该目录下创建一个 docker 文件夹,用于存放 docker 相关的文件内容
cd docker/ 进入此文件夹下上传 docker 安装包

unzip docker.zip 解压安装包会生成一个同名的文件夹

进入此文件夹 cd docker/

想要执行安装,需要赋予 install-docker.sh 可执行权限 chmod +x install-docker.sh
再执行安装 ./install-docker.sh

安装成功后执行 docker info 用于查看 Docker 系统详细信息

第一种安装方式是在线安装
从 Docker 镜像仓库(默认是 Docker Hub)通过 docker search mysql 命令搜索镜像,输出 docker 镜像坐标 mysql:tag(镜像名称:版本标签
docker pull mysql:tag 命令拉取镜像
docker run mysql:tag 创建并启动容器
这是 Docker 部署应用的基础流程,但在实际场景中,这种直接基于官方公共仓库的操作方式使用频率并不高,由于 Docker Hub 服务器位于境外,镜像拉取时容易因网络延迟或带宽限制出现超时,即便配置了阿里云等国内镜像,受限于网络波动等因素,仍可能出现拉取失败或超时的问题。
第二种安装方式是离线安装
离线安装指的是不依赖实时网络连接,通过本地已保存的镜像文件,在目标机器上部署 Docker 镜像并启动容器。
docker load -i mysql.tar 将本地的 mysql.tar 离线镜像包加载到当前 Docker 环境中
docker load 是 Docker 用于导入本地镜像包的命令,-i mysql.tar 指定要加载的文件是 mysql.tar,执行后,mysql.tar 中包含的 MySQL 镜像会被解析并添加到本地镜像库,相当于安装离线镜像
docker images 命令用于查看本地 Docker 环境中已有的所有镜像,验证上一步的 mysql.tar 是否成功加载

bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:latest
基于本地的 mysql:latest 镜像,创建并启动一个名为 mysql 的 MySQL 容器
- -d:容器在后台运行,不占用当前终端;
- --name mysql:给容器命名为 mysql,方便后续管理,如停止、启动;
- -p 3306:3306:将宿主机的 3306 端口映射到容器内的 3306 端口,外部可通过宿主机 3306 访问 MySQL;
- -e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 的 root 用户密码为 123456,MySQL 官方镜像要求必须设置;
- mysql:latest:指定基于本地的 mysql:latest 镜像启动容器,确保本地已存在该镜像,否则 Docker 会尝试在线拉取。
容器独立隔离应用运行环境,虽不是完整操作系统,但拥有独立的网络空间和端口资源,里面跑的程序会占用自己的内部端口,外部用户或其他设备无法直接访问容器内部的端口,所有请求只能先抵达承载容器的宿主机,而端口映射的作用就是在宿主机和容器间搭建请求转发通道,(-p 宿主机端口:容器端口)前面的宿主机端口是对外暴露的入口,后面的容器端口是内部程序实际占用的端口,外部只需通过 "宿主机IP:宿主机端口" 发起请求,宿主机会自动将请求转发到对应容器的端口上,而且哪怕多个容器内部用相同端口,只要宿主机暴露的端口不同就不会冲突,既实现了外部对容器内服务的访问,又兼顾了灵活性。

远程测试连接

若在测试连接时遇到如下报错
2005-Unknown MySQL server host '192.168.15.128'(11001)
且使用命令行工具执行 ping 192.168.15.128 与目标主机通信成功的话,那么很有可能是 Navicate 版本过低的原因,官网 https://navicat.com.cn/products#navicat 下载最新版本的 Navicat Premium Llite,点击免费下载

总结docker常用命令
搜索docker镜像:docker search ****
下载docker镜像:docker pull mysql:tag
从指定镜像创建并启动一个新的容器:docker run [选项] 镜像名 [容器内执行的命令]
查看正在运行的容器:docker ps,查看所有容器:docker ps -a
查看所有的镜像:docker images
查看日志:docker logs -f 容器ID
进入到容器里:docker exec -it 容器ID/bin/bash
启动/停止/重启容器:docker start/stop/restart 容器ID
删除容器:docker rm 容器ID
删除镜像:docker rmi 镜像ID
查看每个容器的资源占用:docker stats