1.概述
如果你想要构建自己的镜像,你就需要学习写Dockerfile文件,Dockerfile文件中使用特定的命令来说明你是怎么一步一步的构建自己镜像的,之后使用 docker build
命令即可完成构建。
2.构建镜像方式介绍
docker build 命令能够创建一个镜像从Dockerfile和一个上下文中,Dockerfile就是一个构建说明,告诉Docker如何构建镜像,每一步要如何去做,而上下文,就是一个路径,一个目录,总结来说就是,以哪个目录为基础,构建镜像。
一般情况下,你最好使用一个仅包含构建所需东西的目录来作为构建镜像的目录,并提供一个Dockerfile。当然你也可以不将Dockerfile放在构建镜像的目录下,你可以通过 -f 选项去指定。
具体来讲就是下面这条构建命令:
docker build -f [Dockerfile的位置] [构建镜像的目录路径]
3.官方实例练习
构建镜像需要2件东西,Dockerfile和一个构建镜像目录。
①创建一个构建镜像目录
mkdir myproject
②在这个构建镜像目录中随便放入点东西(比如放个文本文件)
echo "hello" > hello
③创建一个Dockerfile
FROM busybox
COPY /hello /
RUN cat /hello
在不知到命令前咱们可以尝试读一下这个文件
以 busybox 镜像为基础
拷贝 /hello 到 /
执行 cat /hello
从中我们可以知道:
先看下目录结构
1.指定构建目录(myproject)后, 当前目录就是一个 跟路径了。对于 hello文件来说 ,在根目录的第一级,所以使用 /hello 来定位到。
2.它将/hello文件拷贝到 容器内的 根目录下
④启动容器并查看
docker run -it helloapp:v1
4.Dockerfile中命令
4.1指明已哪个镜像为基础(FROM)
FROM 镜像名:TAG
①这个命令指明要构建的镜像在哪个镜像基础上构建
②如果不指定TAG,就是latest
4.2指明构建镜像时要运行哪个命令(RUN)
RUN 命令 选项
或者
RUN ["命令","选项",....]
做个例子帮助理解。
需求:构建一个以ubuntu为基础,并创建一个gaoxi目录在 / 下
Dockerfile
FROM ubuntu
RUN mkdir /gaoxi
4.3设置启动容器后立即运行的命令(CMD)
需求:你想让ubuntu镜像运行后立刻打印一个 “hello world”
FROM ubuntu
CMD echo "hello world"
其实在CMD之前,ubuntu镜像中就有一个ENTRYPOINT 命令,CMD会追加到其后面执行,但是如果ENTRYPOINT为空,那么就直接执行CMD。
4.4设置启动容器后立即执行的前缀命令(ENTRYPOINT)
ENTRYPOINT
的两种写法:
exec方式:
ENTRYPOINT ["executable", "param1", "param2"]
shell 方式
ENTRYPOINT command param1 param2
这种方式会在你的命令前添加/bin/sh -c
,也就是说你的命令是这样的 /bin/sh -c comand param1 param2
但是此种方式会忽略之后出现的所有 CMD命令。
注:如果Dockerfile中存在多个ENTRYPOINT
,则后面覆盖前面
也就说在镜像构建时一旦指定了ENTRYPOINT
在启动 docker run xxx 命令
其中命令只能追加到ENTRYPOINT
后面 ,如果想要修改,使用选项 —entrypoint ,docker run --entrypoint xxx 命令
因此这便是解决测试环境 jvm参数配置的关键
4.5 ADD和COPY
可以将本机的文件拷贝到镜像中,如果想要拷贝目录,好像需要指定父目录。
4.6 VOLUME
指定容器内的目录挂在到本地,进行的是匿名挂在。