目录
[1 Docker简介](#1 Docker简介)
[2 Docker命令解读](#2 Docker命令解读)
[3 Docker基础](#3 Docker基础)
[3.1 常见命令](#3.1 常见命令)
[3.2 数据卷](#3.2 数据卷)
[3.3 自定义镜像](#3.3 自定义镜像)
[3.4 网络](#3.4 网络)
[4 项目部署](#4 项目部署)
[5 Dockers Compose](#5 Dockers Compose)
1 Docker简介
如果是利用传统方式部署MySQL,大概的步骤有:
搜索并下载MySQL安装包、上传至Linux环境、解压和配置环境、安装、初始化和配置。
而使用Docker安装,仅仅需要一步即可。
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql:8
当我们执行命令后,Docker做的第一件事情,是去自动搜索并下载了MySQL,然后会自动运行MySQL,我们完全不用插手,是非常方便的 。
不同操作系统下其安装包、运行环境是都不相同的!如果是手动安装,必须手动解决安装包不同、环境不同的、配置不同的问题!但Docker这种安装方式完全不用考虑运行的操作系统环境,它不仅仅在CentOS系统是这样,在Ubuntu系统、macOS系统、甚至是装了WSL的Windows下,都可以使用这条命令来安装MySQL,这就是因为Docker会自动搜索并下载MySQL。
注意: 这里下载的不是安装包,而是镜像(image)。 镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了,这套独立运行的隔离环境我们称为容器(container)。
Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利,被称为镜像仓库。DockerHub网站是官方仓库,阿里云、华为云会提供一些第三方仓库,我们也可以自己搭建私有的镜像仓库。

Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。Docker服务部署应用时,首先要去搜索并下载应用对应的镜像 ,然后根据镜像创建并允许容器,应用就部署完成了。
2 Docker命令解读
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 : 设置端口映射,宿主机端口:容器内端口。容器是隔离环境,外界不可访问,但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。示例中就是将宿主机的3307映射到容器内的3306端口。
-e : 配置容器内进程运行时的一些参数。
mysql:8 : 设置镜像名称,Docker会根据这个名字搜索并下载镜像。REPOSITORY:TAG,其中REPOSITORY可以理解为镜像名,TAG是版本号,在未指定TAG的情况下,默认是最新版本,也就是mysql:latest。
3 Docker基础
3.1 常见命令

| 命令 | 说明 |
|---|---|
| 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和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
举例:Nginx
查看 DockerHub,拉取 Nginx 镜像,创建并运行 Nginx 容器。
DockerHub查看nginx镜像仓库及相关信息:
https://hub.docker.com/_/nginx/tags?name=1.20.2

docker pull nginx:1.20.2
# 第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
3.2 数据卷
数据卷(volume) 是一个虚拟目录,是容器内目录 与宿主机目录之间映射的桥梁。
挂载本地目录或文件,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载,挂载语法与数据卷类似。
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
注意 :本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
前端:打包成静态文件,丢进官方 Nginx 即可。
MySQL:官方镜像,你只需要挂数据卷。
Java:自定义镜像,必须把你的 jar 包放进去,才能运行。
3.3 自定义镜像
镜像 就是包含了应用程序 、程序运行的系统函数库 、运行配置等文件的文件包。构建镜像的过程其实就是把程序打包的过程。
我们要从0部署一个Java应用,大概流程是这样:
-
准备一个linux服务(CentOS或者Ubuntu均可)
-
安装并配置JDK
-
上传Jar包
-
运行jar包
因此,我们打包镜像也是分成这么几步:
-
准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
-
安装并配置JDK
-
拷贝jar包
-
配置启动脚本
上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合。
镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer (层)。

Docker就提供了自动打包镜像的功能。
Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据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 |
Dockerfile文件编写好--docker build -t 镜像名 .(构建镜像)--docker run(容器)
3.4 网络
我们创建了一个Java项目的容器,而Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。现在,我们的容器之间能否互相访问呢?
可以互联,但是容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
因此我们采用自定义网络 ,之后访问的时候用名称去访问就可以了。
| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
# 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 都加入该网络
docker network connect itheima mysql
docker network connect itheima myapp
# 4.进入dd容器,尝试利用别名访问db
docker exec -it myapp bash
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
OK,现在无需记住IP地址也可以实现容器互联了。
4 项目部署
需求:将我们开发的 tlias-web-management 项目打包为镜像,并部署。
步骤:
- 准备MySQL容器,并创建tlias数据库及表结构。
- 修改项目的配置文件,修改数据库服务地址(package打包jar)。
- 编写Dockerfile文件(AI辅助)。
- 构建Docker镜像,部署Docker容器,运行测试。
编写Dockerfile文件
# 使用 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"]
由于项目要运行,需要依赖jdk的环境,所以这里我们需要将tlias.jar,jdk17.tar.gz,Dockerfile三个文件,上传到Linux服务器的 /root/tlias 目录下(如果没有这个目录,提前创建好)。
构建Docker镜像:docker build -t tlias:1.0 .
部署Docker容器:docker run -d --name tlias-server --network itheima -p 8080:8080 tlias:1.0
通过 docker logs -f 容器名,就可以查看容器的运行日志。
5 Dockers Compose
可以看到,我们部署一个简单的java项目,其中包含3个容器:MySQL、Java项目、Nginx,我们依次按照顺序部署,复杂的项目会更多,此时Docker Compose 就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
docker run部署MySQL的命令
XML
docker run -d \
--name nginx-tlias \
-p 80:80 \
-v /usr/local/app/html:/usr/share/nginx/html \
-v /usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf \
--network itheima \
nginx:1.20.2
------->docker-compose.yml文件
XML
services:
mysql:
image: "nginx:1.20.2"
container_name: nginx-tlias
ports:
- "80:80"
volumes:
- "/usr/local/app/html:/usr/share/nginx/html"
- "/usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf"
networks:
- itheima
networks:
itheima:
name: itheima
| docker run 参数 | docker compose 指令 | 说明 |
|---|---|---|
| --name | container_name | 容器名称 |
| -p | ports | 端口映射 |
| -e | environment | 环境变量 |
| -v | volumes | 数据卷配置 |
| --network | networks | 网络 |
XML
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
编写好docker-compose.yml文件,就可以部署项目了。
XML
docker compose [OPTIONS] [COMMAND]
docker compose up -d
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 |
| Options | -p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 |
| Commands | up | 创建并启动所有service容器 |
| Commands | down | 停止并移除所有容器、网络 |
| Commands | ps | 列出所有启动的容器 |
| Commands | logs | 查看指定容器的日志 |
| Commands | stop | 停止容器 |
| Commands | start | 启动容器 |
| Commands | restart | 重启容器 |
| Commands | top | 查看运行的进程 |
| Commands | exec | 在指定的运行中容器中执行命令 |