Docker - 自定义镜像(Dockerfile)
# 镜像结构
镜像是分层结构,每一层称为一个 Layer
- BaseImage 层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其它:在 BaseImage 基础上添加依赖、安装程序、完成整个应用的安装和配置
# 什么是 Dockerfile
Dockerfile 就是一个文本文件,其中包含一个个的指令 (Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层 Layer。
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 执行 Linux 的 shell 命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
# 案例:容器运行 Java 项目
基于 Ubuntu 镜像构建一个新镜像,运行一个 java 项目
# 传统部署流程
- 安装
Ubuntu系统
- 系统中安装
JDK
- 把
jar包
搞到系统里去,可以是上传,也可以是在服务器里用 Maven 构建 - 然后使用
java -jar
命令运行 - 浏览器访问
# Docker 部署流程
新建文件夹
docker-demo
拷贝
docker-demo.jar
文件到docker-demo
目录拷贝
jdk8.tar.gz
文件到docker-demo
目录拷贝
Dockerfile
到docker-demo
目录进入
docker-demo
构建镜像,运行命令:
docker build -t javaweb:1.0 .
运行:
docker run --name web -p 8090:8090 -d javaweb:1.0
最后访问 http://localhost:8090/hello/count,其中的 ip 改成你的虚拟机 ip
Dockerfile
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
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
使用此 Dockerfile,会导致每个微服务镜像都需要重复安装 JDK 环境变量,可使用
java:8-alpine
镜像代替
# 改进
可使用 java:8-alpine
镜像
Dockerfile
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
# ENTRYPOINT java -jar /tmp/app.jar #与下面等价
ENTRYPOINT ["java","-jar","/tmp/app.jar"]
上次更新: 2024/09/24, 16:49:56