一 . 镜像结构
先来复习一下镜像的概念 : 镜像是将应用程序以及需要的系统函数库、环境、配置、依赖打包而成 .
我们以 MySQL 的镜像为例 , 分析一下镜像的结构
二 . Dockerfile 语法
2.1 什么是 Dockerfile ?
Dockerfile 就是一个文本文件 , 其中包含了一个个的指令 , 通过指令来说明要执行什么操作来去构建镜像 .
我们就可以把 Dockerfile 当做一个构建镜像的说明书 , Docker 就会按照说明书构建出指定的镜像了 .
那每一个指令 , 其实都会形成一层 Layer .
2.2 Dockerfile 的语法
指令 |
说明 |
实例 |
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 |
2.3 基于 Ubuntu 镜像构建出一个新镜像 , 运行一个 Java 项目
① 新建一个空的文件夹 docker-demo
cd /tmp/ mkdir docker-demo cd docker-demo/
② 将所需要的文件拷贝到 docker-demo 目录下
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 构建镜像
# 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
2.4 基于 java:8-alpine 镜像 , 将一个 Java 项目构建为镜像
我们刚才的 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 .