初识Docker:(5)Docker自定义镜像
- 镜像结构
- Dockerfile语法
- 什么是Dockerfile
- 构建Java项目
- 案例1:基于ubuntu镜像构建一个新镜像,运行一个java项目
- 案例2:基于java:8-alpine镜像,将一个java项目构建为镜像
- 总结
镜像结构
- 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成
镜像是分层结构,每一层称为一个Layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其他:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
Dockerfile语法
什么是Dockerfile
构建Java项目
案例1:基于ubuntu镜像构建一个新镜像,运行一个java项目
编写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
构建java项目镜像:
# 步骤一:构建javaweb镜像
$ docker build -t javaweb:1.0 .
Sending build context to Docker daemon 211.1MB
Step 1/9 : FROM ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
b51569e7c507: Pull complete
da8ef40b9eca: Pull complete
fb15d46c38dc: Pull complete
Digest: sha256:1f1a2d56de1d604801a9671f301190704c25d604a416f59e03c04f5c6ffee0d6
Status: Downloaded newer image for ubuntu:16.04
---> b6f507652425
Step 2/9 : ENV JAVA_DIR=/usr/local
---> Running in 56b1aa0c0caa
Removing intermediate container 56b1aa0c0caa
---> 7aa1180d13dd
Step 3/9 : COPY ./jdk8.tar.gz $JAVA_DIR/
---> 56a3e08c07ab
Step 4/9 : COPY ./docker-demo.jar /tmp/app.jar
---> 22005446b7a4
Step 5/9 : RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8
---> Running in 9416f8f3ad24
Removing intermediate container 9416f8f3ad24
---> 9fd66f7be0e0
Step 6/9 : ENV JAVA_HOME=$JAVA_DIR/java8
---> Running in c91fcc94f02e
Removing intermediate container c91fcc94f02e
---> cd925bdf19b8
Step 7/9 : ENV PATH=$PATH:$JAVA_HOME/bin
---> Running in fee99c64381b
Removing intermediate container fee99c64381b
---> b82e606ede47
Step 8/9 : EXPOSE 8090
---> Running in 6a7c4c4041c0
Removing intermediate container 6a7c4c4041c0
---> 22dd1186d176
Step 9/9 : ENTRYPOINT java -jar /tmp/app.jar
---> Running in bb6b25baa1e3
Removing intermediate container bb6b25baa1e3
---> f02cf425f5c5
Successfully built f02cf425f5c5
Successfully tagged javaweb:1.0
# 步骤二:查看javaweb镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
javaweb 1.0 f02cf425f5c5 59 seconds ago 722MB
# 步骤三:启动java项目容器
$ docker run --name web -p 8090:8090 -d javaweb:1.0
32c1b2a4b58f52f7fdbbbe85635f140abfc38d44bc00f19572c96d07d9f3f038
# 步骤四:查看java容器状态
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32c1b2a4b58f javaweb:1.0 "/bin/sh -c 'java -j…" 3 seconds ago Up 2 seconds 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp web
# 步骤五:访问java项目路径
$ curl 127.0.0.1:8090/hello/count
今天被访问了1次
案例2:基于java:8-alpine镜像,将一个java项目构建为镜像
实践:
(1)简化
编写dockerfile
# 指定基础镜像
FROM openjdk:8u92-jdk-alpin
# 拷贝java项目
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
(2)编译镜像
# 步骤一:构建javaweb镜像
$ docker build -t javaweb:2.0 .
Sending build context to Docker daemon 211.1MB
Step 1/4 : FROM openjdk:8u92-jdk-alpine
---> f23144173f4f
Step 2/4 : COPY ./docker-demo.jar /tmp/app.jar
---> 26bd15928365
Step 3/4 : EXPOSE 8090
---> Running in 0d96cd08728d
Removing intermediate container 0d96cd08728d
---> d15bfdb1312d
Step 4/4 : ENTRYPOINT java -jar /tmp/app.jar
---> Running in c7edf773e60f
Removing intermediate container c7edf773e60f
---> 6565afa9c4f9
Successfully built 6565afa9c4f9
Successfully tagged javaweb:2.0
# 步骤二:启动java项目container
$ docker run --name web -p 8090:8090 -d javaweb:2.0
98c9d9dc90fa59fc73486d2a8264b6db4a015ce1f1de8f1515af469655753fb9
# 步骤三:查看镜像状态
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98c9d9dc90fa javaweb:2.0 "/bin/sh -c 'java -j…" 3 seconds ago Up 2 seconds 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp web
# 步骤四:访问镜像服务
$ curl 127.0.0.1:8090/hello/count
今天被访问了1次
总结
- Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
- Dockerfile的第一行必须是From,从一个基础镜像来构建
- 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,如:java:8-alpine