目录
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 + 映射端口访问容器。
4463

被折叠的 条评论
为什么被折叠?



