目录
[4 Docker 镜像安装与容器启动](#4 Docker 镜像安装与容器启动)
[4.1 在线搜索并拉取镜像](#4.1 在线搜索并拉取镜像)
[4.2 离线安装包加载镜像](#4.2 离线安装包加载镜像)
[4.3 注](#4.3 注)
4 Docker 镜像安装与容器启动
本地软件安装有两种常见方式:
方式 1:应用市场搜索 → 点击安装 → 打开软件
方式 2:官网下载离线安装包 → 安装 → 打开软件
Docker 镜像安装完全类比这一逻辑,也有两种方式。
下面以MySQL为例。
4.1 在线搜索并拉取镜像
方式 1:在线搜索并拉取镜像
- 搜索镜像:docker search 软件名称(如 docker search mysql)
- 作用:类比 "应用市场搜索软件",从 Docker 镜像仓库(可配置国内镜像源如阿里镜像源,解决国外源访问慢问题)查找目标镜像。
- 注意:Docker 默认镜像源在国外,国内可通过修改 /etc/docker/daemon.json 配置阿里等国内镜像源。
- 获取镜像坐标:镜像坐标格式为 [软件名称]:[版本tag](如 mysql:tag),类比 "软件的安装包名称 + 版本"。
- 下载镜像:docker pull 镜像坐标(如 docker pull mysql:tag)
- 作用:类比 "下载软件安装包",从镜像仓库拉取镜像到本地。
- 注意:国内网络环境下,即使配置了国内镜像源,也可能因网络波动超时,因此这种方式实用性有限。
- 启动容器(运行镜像):docker run 镜像坐标(如 docker run mysql:tag)
|------------|----------------------|-------------------------|
| 本地软件安装逻辑 | Docker 镜像 / 容器逻辑 | 对应命令 / 操作 |
| 应用市场搜索 | docker search 搜索镜像 | docker search 软件名称 |
| 软件安装包 + 版本 | 镜像坐标( 名称:tag ) | 如 mysql:tag |
| 下载安装包 | docker pull 拉取镜像 | docker pull 镜像坐标 |
| 官网离线安装包 | Docker 离线镜像包( .tar ) | 上传后用 docker load -i 加载 |
| 安装并打开软件 | docker run 启动容器 | docker run 镜像坐标 (含各类配置) |
4.2 离线安装包加载镜像
准备离线镜像包:从官网或其他渠道下载镜像的离线包(如 mysql.tar),类比 "官网下载软件离线安装包"。
注:最好为每一个镜像建一个文件夹夹,放在和/opt/docker同级的目录下。下面演示的目录因失误,没有用这个规则。
-
上传安装包到服务器
将离线镜像包上传至运行 Docker 的服务器。cd /opt/docker

-
加载离线镜像
docker load -i 离线包名称
作用:将离线包中的镜像导入到本地 Docker 环境。docker load -i mysql.tar
-i 是 --input 的缩写,作用是指定输入的离线镜像包文件。
具体来说,它用于告诉 Docker 引擎:从 mysql.tar 这个文件中读取离线镜像的内容,将其加载到本地的 Docker 镜像仓库中。通过这个参数,你可以明确指定要加载的离线包路径,确保 Docker 能准确找到并处理该文件。

查看docker里都有哪些docker镜像
docker images

3.启动容器(运行镜像)
通过 docker run 命令启动,以 MySQL 为例,完整命令(含常用配置):
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=testdb \
-e MYSQL_USER=testuser \
-e MYSQL_PASSWORD=testpass \
-v /home/mysql/data:/var/lib/mysql \
mysql:latest
-
各参数说明:
- -d:后台运行容器;
- --name 容器名:给容器命名为 mysql;
- -p 宿主机端口:容器端口:端口映射,将宿主机 3306 端口(冒号前面)映射到容器内部 3306 端口(冒号后面 );
-
-e 环境变量=值:设置环境变量(初始化配置):
-
- MYSQL_ROOT_PASSWORD:MySQL root 用户密码;
- MYSQL_DATABASE:初始化创建的测试数据库 testdb;
- MYSQL_USER:初始化创建的普通用户 testuser;
-
MYSQL_PASSWORD:普通用户 testuser 的密码 testpass;
-
-v 宿主机目录:容器内目录 :用于关联宿主机与容器的文件目录,实现数据持久化(如 -v /home/mysql/data:/var/lib/mysql 可将 MySQL 数据持久化到宿主机,避免容器删除后数据丢失)。
-
mysql:latest:指定启动的镜像坐标。镜像坐标为[镜像名]:[标签]。可以通过 docker images 命令查看本地已有的镜像及其坐标。执行 docker images 后,输出结果中(上图)会显示 REPOSITORY(镜像名)和 TAG(标签),两者组合就是镜像坐标,比如 mysql:latest 中,mysql 是 REPOSITORY,latest 是 TAG。
注 : -
容器内的端口(通常是固定的):3306 是 MySQL 服务在容器内部监听的端口,这是由 MySQL 镜像的配置决定的,一般不需要也不建议修改。
-
宿主机的端口(可以随意修改,只要不冲突):你可以修改为宿主机上任何未被占用的端口,比如 3307、3316 等。
docker run -d -p 3316:3306 --name mysql mysql:latest
这意味着:容器内部的 MySQL 服务依然在 3306 端口运行。但外部(你的电脑或其他机器)需要通过访问宿主机的 3316 端口来连接到这个 MySQL 服务。比如:用 Navicat 连接 Docker 中的 MySQL 时,端口号要填写宿主机的端口号(也就是 docker run 命令中 -p 参数冒号前面的那个端口)。
-
端口映射(-p 宿主机端口:容器端口)的核心原因:"容器无法被直接访问,必须通过端口映射暴露到宿主机" 是根本原因,解决端口冲突是重要的附加价值。
-
根本原因:容器的网络隔离特性,无法直接访问。
Docker 容器默认处于独立的网络环境中,有自己的内部 IP(如 172.17.0.2),但这个 IP 是容器网络内部的私有地址,宿主机以外的设备(比如你的电脑、Navicat 所在设备)无法直接访问。端口映射相当于在宿主机上 "开了一个通道":外部请求先访问宿主机的指定端口,再通过这个通道转发到容器内部的应用端口(如 MySQL 的 3306),本质是解决 "容器网络隔离导致的访问问题"。 -
重要附加价值:避免端口冲突,支持多实例运行。
这是端口映射的实用优势。如果宿主机本身已运行 MySQL(占用 3306 端口),或需要同时启动多个 MySQL 容器,通过修改宿主机端口(如 3316、3326),就能让多个容器的应用端口(均为 3306)通过不同的宿主机端口对外提供服务,互不冲突。
这里先暂时把-v去掉,即无数据卷挂载。docker run -d
--name mysql
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e MYSQL_DATABASE=testdb
-e MYSQL_USER=testuser
-e MYSQL_PASSWORD=testpass
mysql:latest

查看正在运行的docker容器
docker ps
输出包含以下核心字段:

|--------------|-------------------------------------------------------------|
| 字段 | 说明 |
| CONTAINER ID | 容器唯一 ID(如56413ca75a02,运行容器后最后输出的字符串的前几位),Docker 为每个容器生成唯一标识 |
| IMAGE | 容器基于的镜像坐标(如mysql:latest) |
| COMMAND | 容器启动时执行的指令(由镜像封装,如docker-entrypoint.sh) |
| CREATED | 容器创建时间 |
| STATUS | 容器的运行状态细节(仅运行中容器会显示,如 Up 5 sec 表示已运行 5 秒) |
| PORTS | 端口映射关系(如 0.0.0.0:3306->3306/tcp 表示宿主机与容器的端口映射) |
| NAMES | 容器名称(如mysql) |
注: 若执行 docker ps -a (查看 所有容器 ,包括已停止的), STATUS 列会显示更多状态,如 Exited (0) 5 minutes ago (容器 5 分钟前正常退出)、 Created (容器已创建但未启动)等。
4.3 注
- 容器与独立操作系统的类比
每个 Docker 容器可理解为一个独立的小型操作系统,具备自己的文件系统、端口空间等。
- 容器内的端口(如 MySQL 的 3306 端口)默认无法被外部直接访问,需通过 --p 端口映射,将容器端口 "暴露" 到宿主机端口,用户才能通过宿主机端口访问容器内服务。
这个类比是为了帮你快速理解容器的 "独立性",不是说容器真的是完整操作系统 ------ 核心是容器有 "类操作系统" 的隔离效果,但不是真正的 OS。
为什么这么类比? - 容器通过 Docker 封装了应用运行所需的所有依赖(代码、运行时、库、配置),还通过技术实现了进程隔离、端口隔离、文件系统隔离。
- 对用户来说,操作容器时(比如进入容器、在容器内执行命令),体验上和操作一个小型独立系统很像:有自己的目录结构、能独立占用端口、不受宿主机其他程序干扰,所以用 "独立的 CentOS" 来类比,方便理解 "隔离性"。
容器和真正操作系统的区别(简单说) - 真正的 OS(比如你的虚拟机系统):有完整内核、硬件驱动、所有系统服务,是 "重量级" 的。
- Docker 容器:共享宿主机的内核,没有独立内核和硬件驱动,只隔离应用和其依赖的运行环境,是 "轻量级" 的。
类比的核心是帮你理解 "容器是独立的运行环境",不是说它真的是操作系统 ------ 本质还是 "打包应用 + 依赖" 的隔离环境,只是用 "独立 OS" 的体感帮你快速 get 它的隔离特性。
- 镜像与容器的关系
- 镜像:是只读的模板(如 mysql:latest),包含运行应用的所有依赖(代码、环境、配置等)。
- 容器:是镜像运行后的动态实例,一个镜像可启动多个独立容器(类似一个安装包可安装多个软件实例)。
-
容器内交互
若需进入容器内部环境,可执行命令:docker exec -it 容器ID/容器名 /bin/bash
(如 docker exec -it mysql /bin/bash,或者是docker exec -it 56413ca75a02 /bin/bash),进入后可像操作独立系统一样执行命令(如查看 MySQL 运行状态、执行 SQL 等)。

- 多个 MySQL 容器运行端口问题
- 多个 MySQL 容器可以同时使用容器内部的 3306 端口,不会冲突;只需修改宿主机映射的端口(保证宿主机端端口唯一),容器内部无需改动。
- 这是因为Docker 的 网络隔离:
- 隔离会给每个容器分配独立的私有 IP,同时让容器内的端口只在自己的 IP 下生效;
- 因此,即使多个容器都用 3306 端口,由于对应的 IP 不同(IP1:3306、IP2:3306),内部不会冲突,实现 "端口复用";
- 但这个私有 IP 对外不可见,所以需要通过 -p 宿主机端口:容器端口 做映射,让外部设备能通过宿主机的公网 / 内网 IP + 映射端口访问容器。