镜像结构

Dockerfile自定义镜像_指定目录

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项目构建镜像,并运行

Java项目的jar包:

链接:https://pan.baidu.com/s/1Gc7sP9YrCbtSdViTwrw0aA
提取码:j8g7

JDK8

链接:https://pan.baidu.com/s/1IMSpGyiH7Cdu2kvgAmlDdw
提取码:fr8l

构建镜像思想

通过Dockerfile来构建,Dockerfile是指令集合,首先要知道如何编写Dockerfile

Dockerfile要做些什么:

  • 基于Linux内核
  • 配置环境,Java运行需要jdk
  • Java项目的jar包
  • 项目启动脚本

将jdk和Java项目上传到指定目录(新建目录:docker-demo),然后编写Dockerfile文件也上传到Docker-demo目录下

Dockerfile自定义镜像_docker_02

编写Dockerfile

# 指定基础镜像
From ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk到指定目录
COPY ./jdk8.tar.gz $JAVA_DIR

# 安装JDK
#进入JDK所在目录
#执行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

# 拷贝Java项目jar包到指定目录
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口(容器内部使用端口)
EXPOSE 8090

# Java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

上传Dockerfile

Dockerfile自定义镜像_docker_03

进入docker-demo目录,运行Dockerfile

docker build -t javaweb:1.0 .
# docker build 构建
# -t tag
# javaweb:1.0 镜像名:版本号
# . Dockerfile文件所在目录( 点:代表当前位置)

Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout(Docker镜像拉取错误)

修改或新建/ect/docker/daemon.json文件

sudo vim daemon.json

编辑阿里云的镜像地址:

{
 "registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}

再次执行

Dockerfile自定义镜像_docker_04

通过docker images查看镜像

Dockerfile自定义镜像_指定目录_05

启动镜像,创建容器

docker run -p 8090:8090 -d javaweb:1.0

 

Dockerfile自定义镜像_指定目录_06

通过浏览器访问 http://192.168.223.128:8090/hello/count

Dockerfile自定义镜像_java_07

现在如果有多个Java项目依赖都时JDK8的话,是不是Dockerfile就都要写红色框中的指令

Dockerfile自定义镜像_指定目录_08

可以将红色框中的指令单独构建成镜像(java:8-alpine),使用方式:

FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar