一、概念
1.1 安装Docker
- 卸载旧版本
执行语句:
bash
sudo yum remove docker
返回结果:

- 安装新版本工具
执行语句:
bash
sudo yum install -y yum-utils
返回结果:

- 配置yum源
执行语句:
bash
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
返回结果:

- 安装docker
执行语句:
bash
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
返回结果:


- 查看docker版本
执行语句:
bash
docker -v
返回结果:

- 查看docker是否安装成功
执行语句:
bash
docker images
执行结果:说明docker没有连接上,docker没有启动

- 启动docker
执行语句:
bash
systemctl start docker
执行完成后,通过使用docker images 命令来验证是否启动成功

配置镜像加速
- 注册阿里云账号: https://www.aliyun.com/,注册一个账号
- 开通镜像服务: 首页---产品---容器镜像服务ACR---管理控制台---




验证配置是否生效,如果能看到你配置的那个阿里云地址,说明配置成功了。
bash
sudo docker info | grep -A 1 "Registry Mirrors"
验证返回结果:

- 停止docker
执行语句:
bash
systemctl stop docker
- 重启docker
执行语句:
bash
systemctl restart docker
- 设置开机自启动
执行语句:
bash
systemctl enable docker
- 执行docker ps命令,如果不报错,说明安装启动成功
执行语句:
bash
docker ps
1.2 docker的使用
镜像和容器:
当我们利用docker安装应用时,Docker会自动搜索并下载应用镜像(image) ,镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器 。
镜像仓库: 存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub ;

1.2.1 部署MySQL
先停掉虚拟机中的MySQL,确保虚拟机已经安装Docekr,且网络开通的情况下,执行命令即可安装MySQL:
bash
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
返回结果:

以上问题是由于镜像加速器没有配置成功,使用一下命令重新配置镜像加速器
bash
# 1. 创建/写入配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
# 2. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 3. 验证配置是否生效(应该能看到镜像地址)
docker info | grep -A 5 "Registry Mirrors"
在navicat上连接MySQL

1.2.2 命令解读
bash
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql
- docker run:
创建并运行一个容器; - -d: 是让容器在
后台运行; - --name mysql: 给容器起个名字 ,
必须唯一; - -p 3306:3306: 设置端口映射,前面端口是
宿主机端口(只能用一次),后面端口是容器内端口; - -e KEY=VALUE: 是设置环境变量
KEY(官方查找),VALUE(自定义值),通过镜像制作者制定,使用官网中的定义的; - mysql: 指定运行的镜像的名字,默认为
最新版本的镜像;
镜像命名规范:
- 镜像名称一般分成两部分组成:
[repository]:[tag],repository 就是镜像名,tag是镜像的版本,正常应该mysql:5.7; - 在没有指定tag时,默认是
latest,代表最新版本的镜像;
二、Docker基础
2.1 常见命令
Docker最常见的命令就是操作镜像、容器的命令 ,官方文档:https://docs.docker.com/

案例:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
需求:
- 在DockerHub中搜索Nginx镜像,查看镜像的名称;
官方网址:https://hub.docker.com/ - 拉取Nginx镜像;
执行命令:
bash
docker pull nginx
返回结果(报错:无法连接到位于国外的 Docker Hub 官方仓库):

解决方法:
使用一键配置脚本,在终端中,直接执行下面这行命令。它会自动完成所有配置并重启Docker:
bash
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
验证配置是否成功,脚本执行完毕后,运行下面的命令,如果能看到你配置的镜像加速器地址,就代表成功了
bash
docker info | grep "Registry Mirrors" -A 5
再次尝试拉取镜像
bash
docker pull nginx

以上报错,根据一下方法解决
bash
# 配置单个稳定源(推荐使用 DaoCloud 或 USTC)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证配置
docker info | grep -A 3 "Registry Mirrors"
# 如果验证输出显示 https://docker.m.daocloud.io,说明配置成功
docker pull nginx
- 查看本地镜像列表;
bash
docker images

保存镜像包: docker save -o 镜像包名 镜像名:版本号
bash
docker save -o nginx.tar nginx:latest
查看本地镜像: ll

删除镜像: docker rmi 镜像名:版本号
bash
docker rmi nginx:latest

将本地镜像重新加载到docker: docker load
当不知道docker命令如何使用时,可以在命令后面加上--help,查看对象的讲解

bash
docker load -i nginx.tar

- 创建并运行Nginx容器;
执行命令:
bash
docker run -d --name nginx -p 8080:80 nginx
返回结果:

- 查看容器;
执行命令:
bash
docker ps
返回结果:

指定输出命令:
bash
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"
返回结果:

- 停止容器;
执行命令:
bash
docker stop nginx
返回结果:

- 再次启动容器
执行命令:
bash
docker start nginx
返回结果:

查看日志:
bash
docker start -f nginx
返回结果:

- 进入Nginx容器
执行命令:
bash
docker exec -it nginx bash
返回结果:

退出容器:exit

- 删除容器
先确保容器是关闭状态:docker stop 容器名称,再删除docker rm 容器名称 -f[可选,强制删除]
执行命令:
bash
docker rm mysql -f
- 命令别名
bash
vi ~/.bashrc
使别名文件生效
bash
source ~/.bashrc

2.2 数据卷
数据卷(volume) 是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁;


使用docker volume --help命令查看数据卷相关的命令

案例1---利用Nginx容器部署静态资源
需求:
- 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化;
- 将静态资源部署到nginx的html目录;
提示:
- 在执行docker run命令是,使用
-v 数据卷:容器内目录可以完成数据卷挂载; - 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷;
创建容器并创建数据卷
bash
docker run -d --name nginx -p 8080:80 -v html:/usr/share/nginx/html nginx

删除数据卷
bash
docker volume rm
查看数据卷
bash
docker volume ls

查看数据卷的详细信息
bash
docker volume inspect html
返回结果:


删除未使用的数据卷
bash
docker volume prune
案例2---mysql容器的数据挂载
需求:
- 查看mysql容器,判断是否有数据卷挂载;
- 基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档);
-
- 挂载/root/mysql/data到容器内的/var/lib/mysql目录;
-
- 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录;
-
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录;
提示:
- 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录;
- 在执行docker run命令时,使用
-v本地目录:容器内目录可以完成本地目录挂载; - 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-- -v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql
-- -v./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录
查看容器中是否有数据卷
bash
docker inspect mysql

2.3 自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件 的文件包。构建镜像的过程其实就是把文件打包的过程。


- Dockerfile语法
- Dockerfile 是一个文本文件 ,里面包含了一系列构建镜像的指令 。可以把它理解为镜像的配方 或制作说明书 。



- 自定义镜像
将jdk.tar包复制到根目录下(如yueyue/目录)------执行docker load -i jdk.tar命令,载入镜像------执行cd demo/命令,进入demo目录------执行docker build -t docker-demo .,构建基础镜像------基础镜像构建完成,使用docker images查看------执行docker run -d --name dd -p 8080:8080 docker-demo命令,启动该镜像
执行docker build -t docker-demo【基础镜像构建完成】

执行docker run -d --name dd -p 8081:8080 docker-demo【启动镜像】

执行docker logs -f dd【查看jdk镜像日志】

在浏览器中使用http://192.168.19.128:8081/hello/count路径访问

2.4 网络
查看容器
执行docker inspect mysql,查看【mysql】容器详情


执行docker inspect dd,查看【jdk】容器详情

执行docker inspect nginx,查看【nginx】容器详情

发现以上容器IP地址,均在同一网段,则这些容器之间可以互相访问
网络
默认情况下,所有容器都是以bridge方式 连接到Docker的一个虚拟网桥上:


使用网络,可以将容器加入同一个自定义网络,可以通过容器名互相访问;
三、项目部署
3.1 部署Java应用
需求: 将hmall项目打包为镜像并部署,镜像名为hmall
idea工具打开项目------maven中package打包(注意要取消test用例)------打包项目在target中(.jar包)------将对应的src中的Dockerfile和target中的jar包放入虚拟机------


浏览器中访问http://192.168.19.128:8081/hi

3.2 部署前端
需求:创建一个新的nginx容器,将nginx.conf、html目录与容器挂载
打开前端文件nginx------复制到虚拟机------执行命名1(报nginx名已存在)------执行命令2(删除重名容器nginx)------再次执行命令1------
bash
# 命令1
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /home/yueyue/nginx/html:/usr/share/nginx/html \
-v /home/yueyue/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
--network yue \
nginx
# 命令2
docker rm -f nginx
浏览器中访问http://192.168.19.128:18080/

部署一个完整的项目步骤:
- 创建一个自定义网络;
- docker在自定义网络中部署mysql、java后端代码、nginx前端代码,形成同一个自定义网络下的不同容器;
- docker启动容器;
- Java后端数据库的连接、前端与后端接口的连接;
3.3 DockerCompose
Docker Compose 通过一个单独的docker-compose.yml模板文件 (YAML格式)来定义一组相关联的应用容器 ,帮助我们实现多个相互关联的Docker容器的快速部署。

部署mysql

部署项目------docker-compose

将项目中所有使用到的容器全部写入到docker-compose文件中(yaml格式),------将docker-compose文档上传的虚拟机------

执行命令docker rm -f nginx hm mysql,将之前部署的容器删除)------执行命令docker compose up -d,实现一键部署(如下图)------执行docker compose ps,查看项目下的所有进程------

列出所有启动的容器

查看虚拟机中的所有的镜像

停止并移除所有容器、网络

Docker Compose文件模板
yaml
# 版本声明(新版可省略)
version: '3.8'
# 服务定义(必需)
services:
service1:
# 服务配置...
service2:
# 服务配置...
# 网络定义(可选)
networks:
my-network:
# 数据卷定义(可选)
volumes:
my-volume:
hmall示例项目docker-compose文件
yaml
name: hmall
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123
TZ: Asia/Shanghai
volumes:
- mysql_data:/var/lib/mysql
networks:
- hmall-network
backend:
build: ./hmall
container_name: hmall-backend
restart: unless-stopped
ports:
- "8081:8080"
depends_on:
mysql:
condition: service_healthy
environment:
DB_HOST: mysql
DB_PORT: 3306
DB_PASSWORD: 123
networks:
- hmall-network
frontend:
image: nginx:alpine
container_name: hmall-nginx
restart: unless-stopped
ports:
- "18080:18080"
- "18081:18081"
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- backend
networks:
- hmall-network
networks:
hmall-network:
driver: bridge
volumes:
mysql_data:
标准化的部署流程:
- 准备阶段: 确保代码在虚拟机上,进入项目目录;
bash
# 1. 确保代码在虚拟机上(任选一种方式)
# 方式A:Git拉取(推荐)
git clone https://github.com/your/project.git
# 方式B:手动上传
scp -r ./project user@192.168.19.128:/home/user/
# 2. 进入项目目录
cd /home/user/project
- 准备Docker相关文件: 在项目根目录创建文件(Dockerfile、docker-compose.yml);
dockerfile
# Dockerfile
FROM openjdk:17-jdk-alpine
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
yaml
# docker-compose.yml
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- mysql_data:/var/lib/mysql
backend:
build: . # 使用当前目录的Dockerfile
ports:
- "8080:8080"
depends_on:
- mysql
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
mysql_data:
- 构建和部署: 构建镜像(使用Dockerfile)、一键启动所有服务(使用Compose)、验证部署是否成功;
bash
# 1. 构建镜像(如果使用Dockerfile)
docker build -t myapp:latest .
# 2. 一键启动所有服务(使用Compose)
docker compose up -d
# 3. 验证部署是否成功
docker compose ps # 查看容器状态
docker compose logs -f # 查看日志
curl http://localhost:8080 # 测试接口
- 维护更新: 更新代码后重新部署(或者更简单的热更新)、停止项目、停止并删除数据卷(会丢失数据)
bash
# 更新代码后重新部署
git pull # 拉取新代码
docker compose build # 重新构建镜像
docker compose up -d --force-recreate # 强制重建容器
# 或者更简单的热更新(开发环境用)
docker compose restart backend
# 停止项目
docker compose down
# 停止并删除数据卷(⚠️会丢失数据)
docker compose down -v