Docker是一个用来快速构建、运行和管理应用的工具。
Docker的出现主要就是为了解决"在我的机器上是正常的,为什么到你的机器上就不正常了"的问题,Docker已经成为高可用服务集群、持续交付、持续集成以及云原生的关键技术!
Docker四部分:

远程镜像仓库、本地镜像、本地仓库、Docker软件
- 远程镜像仓库是云端的镜像仓库,默认是Docker Hub,供用户上传、下载需要的镜像。
- 本地镜像是下载好的镜像,镜像是只读的,不能对其修改,镜像是容器的模版,镜像可以理解为电脑安装操作系统的光盘,Linux镜像可以在Linux、Windows中的Docker中使用,Windows镜像只能在Windows的Docker中使用。Docker镜像名称是由两部分组成的,镜像名:tag版本,tag版本可以忽略,默认会选择latest,也就是最新的镜像版本,
- 本地容器,容器是真正运行的实例, 容器是 根据 / 基于镜像创建的(根据镜像来创建容器),修改容器文件不会影响镜像,容器被创建后,即可跟Linux系统一样独立使用,容器可以隔离网络、文件、进程等环境。
- Docker软件是连接以上三个部分的基座,也是运行容器的引擎,Docker是可以跨平台安装的!

Docker容器跟虚拟机技术是不同的,Docker容器是基于系统内核的相关容器技术,不需要独立分配物理资源,不需要启动完整的操作系统,所以Docker容器启动速度更快、更轻量,但是多个容器是共用宿主机的内存、CPU等物理资源的,多容器可能会出现互相抢占物理资源的情况。
创建Docker容器的两种方式:
- 通过命令直接创建
- 通过dockerfile创建
两者都是基于Docker镜像创建的,但两者的区别是通过命令直接创建需要完整的镜像,dockerfile则可以使用不完整的镜像,dockerfile虽然更灵活一些,但是容器创建的时间更长、稳定性也不佳,特别是需要下载文件但网络不好的情况,我们更偏向使用命令直接创建容器。
Docker技术能够避免对服务器环境的依赖,减少复杂的部署流程,有了Docker以后,可以实现一键部署,项目的部署如丝般顺滑,大大减少了运维工作量。
即使你对Linux不熟悉,你也能轻松部署各种常见软件、Java项目。
学习目标:
- 能利用Docker部署常见软件
- 能利用Docker打包并部署Java应用
- 理解Docker数据卷的基本作用
- 能看懂DockerCompose文件
1. 快速入门
要想让Dockert帮我们安装和部署软件,首先要保证你的机器上有Docker,我们可以在CentOS的虚拟机中安装Docker。
Docker安装的官方文档:
1.1 卸载旧版
首先如果系统中已经存在旧的Docker,则先卸载:
bash
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

1.2 配置Docker的yum库
首先要安装一个yum工具
bash
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
bash
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.3 安装Docker
- 最后,执行命令,安装Docker
bash
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证Docker是否安装成功,输入:docker -v,查看Docker的安装版本
docker image命令:用于列出本地系统中存在的Docker镜像!
- 在Docker中,镜像是用于运行Docker容器的构建块,镜像是Docker容器的基础,即容器运行时所需要使用的文件系统。
Docker也是一个服务,需要启动起来!
1.4 启动和校验
bash
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
输入systemctl enable docker命令,让Docker开启自启:
输入systemctl start docker,启动Docker:
1.5 配置镜像加速
这里以阿里云镜像加速为例
5.1 首先访问阿里云网站,注册一个阿里云账号:
5.2 开通镜像服务
- 在首页的产品中,找到阿里云的容器镜像服务:

5.3 点击管理控制台
5.4 找到镜像工具下的镜像加速器
具体命令如下:
bash
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
2. 部署MySQL
- Docker部署 VS 传统的Linux部署
回忆,利用传统方式部署MySQL,大概的步骤有:
- 搜索并下载MySQL安装包
- 上传至Linux环境
- 编译和配置环境
- 安装
步骤一:先检测系统是否自带安装mysql:yum list installed | grep mysql
步骤二:删除系统自带的MySQL及其依赖(防止后面安装发生冲突)
- yum -y remove mysql-libs.x86_64
而我们利用Docker来安装一个MySQL软件,仅仅需要一步即可:
首先需要先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面的命令即可安装Docker:
- \ 表示换行的意思!
bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql

MySQL安装完毕,通过任意客户端工具即可连接到MySQL!
大家可以发现,当我们执行命令后,Docker做的第一件事情,是去自行搜索并下载了MySQL,然后会自动运行MySQL,我们完全不用插手,非常方便~!
而且,这种安装方式你完全不用考虑运行的操作系统环境,它不仅在CentOS系统是这样,在Ubuntu系统、MacOS系统,甚至是安装了WSL的Windows下,都可以使用这条命令来安装MySQL。
要知道,不同操作系统下的安装包、运行环境都是不相同的,如果是手动安装,必须手动解决安装包不同、环境不同、配置不同的问题。
镜像和容器
- 当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image),镜像不仅包含应用本身,还包含应用运行时所需要的环境、配置、系统函数库,Docker会在运行镜像时创建一个隔离(的)环境,称为容器(Container)。
- Docker的镜像能够做到跨平台,忽略不同的操作系统之间的差异!
而使用Docker,这些完全不要考虑,就是因为Docker会自行搜索并下载MySQL,注意:这里下载的不是安装包,而是镜像!镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库,因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了,这套独立运行的隔离环境我们称为容器。
说明:
- 镜像:英文是image
- 容器:英文是container
因此,Docker安装软件的过程,就是自动搜索下载镜像,然后创建并运行容器的过程!·
镜像仓库
Docker会根据命令中的镜像名称自动搜索并下载镜像image,那么问题来了,它是去哪里搜索和下载镜像的呢?这些镜像又是谁制作的呢?
- Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利。
- Docker官方提供了一些基础镜像,然后各大软件公司又在基础镜像的基础上,制作了自家软件的镜像,全部都存放在这个网站,这个网站就成了Docker镜像交流的社区:
https://hub.docker.com/https://hub.docker.com/基本上我们常用的各种软件都能在这个网站上找到,我们甚至可以自己制作镜像上传上去。
像这种提供存储、管理Docker镜像的服务器,被称为DockerRegistry,可以翻译为镜像仓库。
- **镜像仓库:**存储和管理镜像的平台,Docker官方维护了一个公共的镜像仓库:Docker Hub。
DockerHub网站是官方仓库,阿里云、华为云会提供一些第三方仓库,我们也可以自己搭建私有的镜像仓库。
官方仓库在国外,下载速度较慢,一般我们都会使用第三方仓库提供的镜像加速功能,提高下载速度,而企业内部的机密项目,往往会采用私有镜像仓库。
总之,镜像的来源有两种:
- 基于官方基础镜像自己制作
- 直接去DockerRegistry下载
总结:
- Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。
- Docker服务部署应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并运行容器,应用就部署完成了。


Docker是做什么的?
- Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。
什么是镜像?
- 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像。
什么是容器?
- 为每个镜像的应用进程创建的隔离运行环境就是容器。
什么是镜像仓库?
存储和管理镜像的服务就是镜像仓库。
- DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像。
3. 命令解读
利用Docker快速的安装了MySQL,非常的方便,不过我们执行的命令到底是什么意思呢?
- 所有的Docker命令都是以Docker为前缀!
解读:
docker run -d:创建并运行一个容器(容器是一个隔离环境),-d则是让容器以后台进程运行
--name mysql:-name给容器命名,给容器起个名字叫mysql,方便我们去区分不同的容器,名字必须唯一,当然也可以叫别的
-p 3306:3306:设置端口映射
- 容器是隔离环境,外界不可访问(容器它也有自己的IP地址),但是可以将宿主机(容器所在的机器称为宿主机)端口映射到容器内的端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
- 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内的端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
- 格式:-p 宿主机端口:容器内端口,示例中就是将宿主机的3306端口映射到容器内的3306端口

- MySQL客户端直连容器的端口会被拒绝访问!
docker inspect 容器名称:该命令将返回JSON格式的容器的详细信息,例如容器的ID、名称、状态、IP地址等。
-e TZ=Asia/Shanghai
-e MYSQL_ROOT_PASSWORD=123
- 格式:-e KEY=VALUE,是设置环境变量,配置容器内进程运行时的一些参数,KEY和VALUE都由容器内进程决定
- 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
mysql:设置镜像名称 或 指定运行的镜像名称,Docker会根据这个名字搜索并下载镜像
- 镜像的名称不是随意的,而是要到DockerRegistry中寻找,镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在DockerHub网站或者软件的官方网站中都能找到。
- 镜像名称结构的格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是镜像的版本号
- 在未指定TAG版本号的情况下,默认是latest,代表最新版本的镜像,也就是mysql:latest
docker ps是一个Docker命令,用于列出正在运行的Docker容器的信息:
- CONTAINER ID(容器ID):每个容器都有唯一的ID。
- IMAGE(镜像):容器所使用的镜像
- COMMAND(命令):容器启动时执行的命令
- CREATED(创建时间):容器的创建时间
- STATUS(状态):容器的运行状态
- PORTS(端口映射):容器内部服务与宿主机之间的端口映射关系

如果需要显示所有容器(包括已经停止的容器),可以使用docker ps -a命令!
- Nginx容器的默认端口是80端口!