什么是 Docker ?
Docker 是一款快速构建,运行,管理应用的工具。
首先要安装 Docker,参考:https://heuqqdmbyk.feishu.cn/wiki/GAwGwd0GHibOovkLpH3cjpMwnVm
安装完成后启动 Docker 即可,执行命令:systemctl start docker
快速入门
通过前面对于 Linux 学习,会发现在 Linux 完成软件的安装非常麻烦和繁琐,但是如果用 docker的话就会简单很多,这里用安装 MySQL 为例。
安装 MySQL
先停掉虚拟机中的 MySQL,确保你的虚拟机已经安装 Docker,且网络开通的情况下,执行下面命令即可安装 MySQL:
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql:8
docker run:创建并运行一个容器,-d 是让容器在后台运行
--name mysql:给容器起一个名字,必须唯一
-p 3307:3306:设置映射端口
-e KEY=VALUE:设置环境变量
mysql:8:指定运行的镜像的名字,版本
镜像和容器
当我们利用 Docker 安装应用时,Docker 会自动搜索并下载应用镜像(image)。
镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。Docker 会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库:存储和管理镜像的平台,Docker 官方维护了一个公共仓库:Docker Hub。
Docker 核心
常见命令
Docker 最常见的命令就是操作镜像,容器的命令,详细可参考官方文档。
数据卷挂载
利用 Nginx 容器部署静态资源
需求:
创建 Nginx 容器,修改 nginx 容器内的 html 目录下的 index.html 文件,查看变化
将静态资源部署到 nginx 的 html 目录
创建容器:
进入容器:
参考官方文档找到这个 html 目录在哪,答案是在 /usr/share/nginx/ 下。
进入该目录,然后可以发现:
再进入 html,如果我们直接用 vi 或者 vim 进行编辑的话,会发现里面没有 vi 和 vim 的指令。因为对于 nginx 来说,这个指令不是必须的,为了控制镜像的体积,它并没有去提供这些指令。
这时候就需要用到数据卷了。
数据卷(volume)是一个虚拟目录,是 容器内目录 与 宿主机目录 之间映射的桥梁
当我们创建 nginx 容器时,也就是执行 docker run 命令时,使用 -v 数据卷:容器内目录 形式可以完成数据卷挂载(数据卷不存在,会自动创建)
先把之前创建的容器删除:
然后创建
进入之后可以看到以下,就说明我们已经成功的将容器里面的文件映射到宿主机上,是通过数据卷来实现的。
我们还要知道这个数据卷对应的宿主机上的磁盘是哪个,可以执行以下命令
第四行那个 Mountpoint 叫做挂载点,也就是我们编辑的地方
进入该目录下就可以用 vim 编辑了
最后直接将要上传的文件拖到宿主机的 html/_data 目录下即可,容器内的 html 文件也会自动上传
本地目录挂载
命令:
docker run -d --name 容器名 -p 宿主机端口:容器端口 -v 宿主机目录或文件:容器内目录或文件 镜像名
创建 MySQL 容器并实现本地目录挂载
需求:
创建 MySQL 容器,并基于本地目录挂载实现 MySQL 容器数据目录,配置文件,初始化脚本的目录挂载。(官方文档)
步骤:
自定义镜像
镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
具体步骤:
镜像结构:
要想描述这个镜像的结构,就得编写一份描述文件,这个文件是固定的叫 Dockerfile
Dockerfile 就是一个文本文件,其中包含了一个个的指令(Insturction),用指令来说明要执行什么操作来构建镜像。将来 Docker 可以根据 Dockerfile 来帮我们构建镜像。
常见指令如下:
我们可以基于 CentOS7 基础镜像,利用 Dockerfile 描述镜像结构
编写好了 Dockerfile 后,可以利用下面命令来构建镜像:
-t:是给镜像起名,格式依然是 respository:tag 格式,不指定 tag 时,默认为 latest
.:是指定 Dockerfile 所在目录,如果就在当前目录,则指定为 "."
网络
以下是 MySQL 容器的 IP 地址
以下是 java应用app容器 对应的 IP 地址
可以看见这两个容器的 IP 地址是在同一个网段,意味着它们很大概率可以互相通信。下面来解释其原理:
默认情况下,所有容器都是以 bridge 方式连接到 Docker 的一个虚拟网桥上,虚拟网桥就是我们安装 Docker 后自带的,就是下面的 docker0.
现在想一个问题,当我的一个应用连接到一个 MySQL 容器时,我把这个 MySQL 容器停止后重新启动起来,那么因为这个 IP 地址是随机分配的,所以这个容器的地址就会产生变化,进而导致 bug,对于这个问题,我们可以通过 Docker 当中的自定义网络来解决。
指的就是我们可以通过 Docker 中的一些指令,自己创建一个虚拟的网桥,然后我们创建容器的时候,我们让我们所创建的容器连接到我们自己创建的虚拟网卡当中,这样我们容器之间相互通信你的时候,就可以通过容器之间的名字相互通信,就不用再管这个 IP 地址了,容器名字是不会变化的。
项目部署
服务端部署
首先要让 DataGrip 连接上 docker 里面的数据库
然后记得修改 yml 文件里的 url 和 logback.xml 文件下日志保存路径,这里的 url 可以不用 ip 地址,直接用容器名,因为我们之前在 网络 配置过了。修改后打包成 jar 包即可
之后编写 Dockerfile 文件,OSS 的 ID 和 SECRET 要改成自己的。
# 使用 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
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"]
然后在 /usr/local 目录下新建一个目录 docker-app,并将文件上传上来
构建镜像
有了镜像就可以创建容器了
前端部署
这里主要是用到目录映射
我们先将需要挂载的文件上传到 /root/tlias-nginx目录里
然后创建这个 nginx 容器
docker run -d \
--name nginx-tlias \
-v /root/tlias-nginx/html:/usr/share/nginx/html \
-v /root/tlias-nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
--network itheima \
-p 80:80 \
nginx:1.20.2
DockerCompose
Docker Compose 通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的 Docker 容器的快速部署
我们先把之前创建的容器,网络全部删掉,镜像的话留这三个
然后我们分三步完成:
1:准备资源(tlias.sql,服务端的 jdk17,jar包,Dockerfile,前端项目打包文件,nginx.conf)
2:准备 docker-compose.yml 配置文件
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-tlias
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
3:基于 Docker-Compose 快速构建项目
将我们需要的东西全部上传到 /root/usr/local/app 这个文件夹里
然后就可以用 compose 来构建项目了,这些需要用到 compose 命令
启动
移除