大家好 , 今天我要和大家分享一个现代软件开发中不可或缺的工具 - Docker . 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .
本文参考资源 : https://www.bilibili.com/video/BV1HP4118797/?spm_id_from=333.337.search-card.all.click
专栏地址 : https://blog.csdn.net/m0_53117341/category_12682419.html
先来复习一下镜像的概念 : 镜像是将应用程序以及需要的系统函数库、环境、配置、依赖打包而成 .
我们以 MySQL 的镜像为例 , 分析一下镜像的结构
Dockerfile 就是一个文本文件 , 其中包含了一个个的指令 , 通过指令来说明要执行什么操作来去构建镜像 .
我们就可以把 Dockerfile 当做一个构建镜像的说明书 , Docker 就会按照说明书构建出指定的镜像了 .
那每一个指令 , 其实都会形成一层 Layer .
指令 | 说明 | 实例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:8 |
ENV | 设置环境变量 (可以理解为全局变量) , 可供后续指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | copy ./mysql-5.7 .rpm /tmp |
RUN | 执行 Linux 的相关 Shell 命令 , 一般是安装命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口 , 也就是 -p 后面的参数 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令 , 容器运行时进行调用 | ENTRYPOINT java -jar xx.jar |
cd /tmp/
mkdir docker-demo
cd docker-demo/
docker-demo.jar
jdk8.tar.gz
Dockerfile.zip
Dockerfile 需要进行解压之后再进行上传
我们可以来看一下 Dockerfile 的内容
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量, JDK 的安装目录
# ENV 就相当于全局变量
ENV JAVA_DIR=/usr/local
# 拷贝 JDK 和 Java 项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装 JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
# docker build 表示构建镜像
# -t 表示版本 (tag)
# test:1.0 前半部分是镜像名称, 后半部分是镜像的版本号
# . 表示的是 Dockerfile 所在的目录, 当前 Dockerfile 文件就在此目录
docker build -t test:1.0 .
此时我们就可以看一下镜像是否构建完毕
# 查看本地镜像
docker images
我们可以构建并且启动容器
# docker run : 创建并运行容器
# --name web : 给当前容器起一个别名
# -p 8090:8090 : 将宿主机的 8090 端口和容器的 8090 端口进行绑定
# -d : 设置容器后台运行
# test:1.0 : 要操作的镜像
docker run --name web -p 8090:8090 -d test:1.0
我们刚才的 Dockerfile 文件 , 其实我们观察一下 , 只有一个位置才发挥了作用
那 java:8-alpine 镜像就包含了基础环境的所有步骤 , 那所以我们就可以把无用代码全部删掉 , 基础镜像指定成 java:8-alpine 就可以了
# 指定基础镜像
FROM java:8-alpine
# 拷贝 java 项目包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口, Java 项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
那我们就可以把修改之后的 dockerfile 重新上传
我们重新构建镜像
我们需要提前关闭之前 1.0 版本的镜像
docker stop web
# 构建镜像
docker build -t test:2.0 .