一、MySQL安装步骤
1. 卸载系统mysql避免冲突
bash
# 查看已安装的MySQL
rpm -qa | grep mysql
rpm -qa | grep mariadb
# 卸载MySQL
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
2.下载MySQL RPM 包
Mysql下载官网: Mysql下载

3.Mysql安装
bash
# 上传MySQL的安装包
# 解压缩
tar -xvf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
# 移动&重命名
mv mysql-8.0.30-linux-glibc2.12-x86_64 /usr/local/mysql
# 切换目录
cd /usr/local/mysql
4.Mysql配置环境变量
bash
# 配置MySQL环境变量
vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
# 刷新环境变量,立即生效
[root@heima mysql]# source /etc/profile
# 注册MySQL为系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql
5.创建Mysql用户和分组
bash
# 创建一个用户组,组名就叫mysql
groupadd mysql
# 创建一个系统用户 mysql, 并归属于用户组 mysql
useradd -r -g mysql -s /bin/false mysql
# 初始化mysql
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
6.启动Mysql服务
bash
# 启动MySQL服务
systemctl start mysql
# 通过初始化时的临时密码,登录MySQL
mysql -uroot -pxxxxx
# 修改root用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
7.开启远程登录权限
bash
# 1. 给 root 用户开启任意IP访问权限
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
# 2. 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
# 3. 刷新权限
FLUSH PRIVILEGES;
8.开放Linux 防火墙的 3306 端口
bash
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-ports
可以使用Docker 命令 ,直接替代了前面所有繁琐的手动安装步骤
二、Docker安装MySQL
1.卸载旧版
首先如果系统中已经存在旧的Docker,则先卸载
bash
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
2.配置Docker的yum库
首先要安装一个yum工具
bash
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
安装成功后,执行命令,配置Docker的yum源(已更新为阿里云源):
bash
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立缓存
bash
sudo yum makecache fast
3.安装Docker
最后,执行命令,安装Docker
bash
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.启动和校验
bash
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
5.配置镜像加速
镜像地址可能会变更,如果失效可以百度找最新的docker镜像。
配置镜像步骤如下:
bash
# 创建目录
rm -f /etc/docker/daemon.json
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
三、Docker的介绍
1.本地环境缺失镜像

2.pull拉取过程

镜像仓库:镜像仓库地址

3.镜像,容器,镜像仓库
什么是镜像?
将应用所需的运行环境、配置文件、系统函数库等与应用一起打包得到的就是镜像
什么是容器?为每个镜像的应用进程创建的隔离运行环境就是容器
什么是镜像仓库?存储和管理镜像的平台就是镜像仓库
DockerHub 是目前最大的镜像仓库,其中包含各种常见的应用镜像
4.容器运行命令解读
bash
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql:8
docker run -d:创建并运行一个容器,-d则是让容器以后台进程运行
--name mysql: 给容器起个名字叫mysql,你可以叫别的
-p 3307:3306: 设置端口映射。
容器是隔离环境 ,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
格式:
-p 宿主机端口:容器内端口,示例中就是将宿主机的3307映射到容器内的3306端口
-``e`` TZ=Asia/Shanghai: 配置容器内进程运行时的一些参数
格式:
-e KEY=VALUE,KEY和VALUE都由容器内进程决定案例中,
TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
mysql:8: 设置镜像名称,Docker会根据这个名字搜索并下载镜像
格式:
REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号在未指定
TAG的情况下,默认是最新版本,也就是mysql:latest
5.Docker常见命令

| 命令 | 说明 |
|---|---|
| docker pull | 拉取镜像 |
| docker push | 推送镜像到DockerRegistry |
| docker images | 查看本地镜像 |
| docker rmi | 删除本地镜像 |
| docker run | 创建并运行容器(不能重复创建) |
| docker stop | 停止指定容器 |
| docker start | 启动指定容器 |
| docker restart | 重新启动容器 |
| docker rm | 删除指定容器 |
| docker ps | 查看容器 |
| docker logs | 查看容器运行日志 |
| docker exec | 进入容器 |
| docker save | 保存镜像到本地压缩文件 |
| docker load | 加载本地压缩文件到镜像 |
| docker inspect | 查看容器详细信息 |
Docker开机自启
bash
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
Docker命令演示
bash
# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像 (比较耗时)
docker pull nginx:1.20.2
# 第3步,查看镜像
docker images
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
6.数据卷介绍

数据卷命令
| 命令 | 说明 |
|---|---|
| docker volume create | 创建数据卷 |
| docker volume ls | 查看所有数据卷 |
| docker volume rm | 删除指定数据卷 |
| docker volume inspect | 查看某个数据卷的详情 |
| docker volume prune | 清除数据卷 |
Nginx的html目录挂载
bash
# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx:1.20.2
# 2.然后查看数据卷
docker volume ls
# 3.查看数据卷详情
docker volume inspect html
# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html
# 6.打开页面,查看效果
# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash
本地目录挂载

mysql本地目录挂载
bash
docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql:8
挂载
/root/mysql/data到容器内的/var/lib/mysql目录(数据存放目录)挂载
/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)挂载
/root/mysql/conf到容器内的/etc/mysql/conf.d目录(配置文件目录)

MySQL的匿名数据卷
查看MySQL容器详细信息
bash
# 1.查看MySQL容器详细信息
docker inspect mysql
关注其中.Config.Volumes部分和.Mounts部分
bash
{
"Config": {
// ... 略
"Volumes": {
"/var/lib/mysql": {}
}
// ... 略
}
}
可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。
bash
{
"Mounts": [
{
"Type": "volume",
"Name": "29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f",
"Source": "/var/lib/docker/volumes/29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
}
]
}
Source:宿主机目录
Destination : 容器内的目录
Name:数据卷名称。未设置容器名,这是匿名卷自动生成的名字,一串hash值
7.自定义镜像
自定义镜像

镜像结构

Dockerfile编写
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:7 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
bash
# 使用 CentOS 7 作为基础镜像
FROM centos:7
# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH
# 创建应用目录
RUN mkdir -p /app
WORKDIR /app
# 复制应用 JAR 文件到容器
COPY app.jar app.jar
# 暴露端口
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

Dockerfile构建镜像


8.Docker网络

| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
自定义网络
bash
# 1.首先通过命令创建一个网络
docker network create itheima
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 itheima bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了itheima以外,其它都是默认的网络
# 3.让 myapp 和 mysql 都加入该网络
# 3.1.mysql容器,加入 itheima 网络
docker network connect itheima mysql
# 3.2.myapp容器,也就是我们的java项目, 加入 itheima 网络
docker network connect itheima myapp
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it myapp bash
# 4.2.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
四、Docker项目部署
1.后端部署流程

2.自定义网络
bash
# 1.首先通过命令创建一个网络
docker network create itheima
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 itheima bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了itheima以外,其它都是默认的网络
# 3.让 myapp 和 mysql 都加入该网络
# 3.1.mysql容器,加入 itheima 网络
docker network connect itheima mysql
# 3.2.myapp容器,也就是我们的java项目, 加入 itheima 网络
docker network connect itheima myapp
# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it myapp bash
# 4.2.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
3.Dockerfile文件
bash
# 使用 CentOS 7 作为基础镜像
FROM centos:7
# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH
# 阿里云OSS环境变量
ENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot
#统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8
# 创建应用目录
RUN mkdir -p /tlias
WORKDIR /tlias
# 复制应用 JAR 文件到容器
COPY tlias.jar tlias.jar
# 暴露端口
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]
将tlias.jar,jdk17.tar.gz,Dockerfile上传到Linux服务器
4.构建Docker镜像
bash
docker build -t tlias:1.0 .
5.部署Docker容器
bash
docker run -d --name tlias-server --network itheima -p 8080:8080 tlias:1.0
6.前端部署流程

7.部署nginx容器
准备静态文件及配置文件存放到对应目录(在 /usr/local 目录下创建 tlias-web 目录)
bash
docker run -d \
--name nginx-tlias \
-v /usr/local/tlias-web/html:/usr/share/nginx/html \
-v /usr/local/tlias-web/conf/nginx.conf:/etc/nginx/nginx.conf \
--network itheima \
-p 80:80 \
nginx:1.20.2
五、DockerCompose部署

| docker run 参数 | docker compose 指令 | 说明 |
|---|---|---|
| --name | container_name | 容器名称 |
| -p | ports | 端口映射 |
| -e | environment | 环境变量 |
| -v | volumes | 数据卷配置 |
| --network | networks | 网络 |
docker-compose文件
bash
services:
mysql:
image: mysql:8
container_name: mysql
ports:
- "3307:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
- "/usr/local/app/mysql/data:/var/lib/mysql"
- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
networks:
- tlias-net
tlias:
build:
context: .
dockerfile: Dockerfile
container_name: tlias-server
ports:
- "8080:8080"
networks:
- tlias-net
depends_on:
- mysql
nginx:
image: nginx:1.20.2
container_name: nginx
ports:
- "80:80"
volumes:
- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "/usr/local/app/nginx/html:/usr/share/nginx/html"
depends_on:
- tlias
networks:
- tlias-net
networks:
tlias-net:
name: itheima
执行如下指令,基于DockerCompose部署项目
bash
docker compose up -d
六、注意
1. 普通桥接 + -p 端口映射
bash
# 默认bridge桥接 + 端口映射
docker run -d --name nginx-bridge -p 8080:80 nginx
特点:
- 容器独立 IP、独立网络栈
- 强制写入 iptables NAT 转发规则
- 无视 firewalld,防火墙放行失效
- 风险:端口意外暴露
- 会篡改 iptables
2. Host 主机网络
bash
# host网络,不做端口映射,直接复用宿主机端口
docker run -d --name nginx-host --network=host nginx
特点:
- 容器和宿主机共用同一张网卡、同一个 IP、同一网络栈
- 不会修改任何 iptables 规则
- 严格受 firewalld / 云安全组控制
- 要用端口就直接用容器内端口:访问宿主机 80 端口即可
- 受 firewalld 管控,生产安全
