DockerFile是什么?
D o c k e r F i l e 是 用 来 构 建 D o c k e r 镜 像 的 构 建 文 件 , 是 由 一 系 列 命 令 和 参 数 构 成 的 脚 本 \color{red}DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤
- 编写DockerFile文件
- docker build生成 镜像文件
- docker run 运行镜像文件
文件案例
推荐网站:https://hub.docker.com/
FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-6-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20181006"
CMD ["/bin/bash"]
DockerFile构建过程
基础知识
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
执行DockerFile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令知道所有指令都执行完成
小总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。
Dockerfile体系结构(保留字指令)
−
F
R
O
M
:
基
础
镜
像
,
当
前
新
镜
像
基
于
哪
个
镜
像
,
基
本
所
有
的
镜
像
都
会
带
上
该
关
键
字
\color{red} - FROM:基础镜像,当前新镜像基于哪个镜像,基本所有的镜像都会带上该关键字
−FROM:基础镜像,当前新镜像基于哪个镜像,基本所有的镜像都会带上该关键字
s
c
r
a
t
c
h
是
最
基
础
的
镜
像
,
类
似
于
j
a
v
a
的
o
b
j
e
c
t
\color{red} scratch是最基础的镜像,类似于java的object
scratch是最基础的镜像,类似于java的object
−
M
A
I
N
T
A
I
N
E
R
:
镜
像
维
护
着
的
姓
名
和
邮
箱
地
址
\color{red} - MAINTAINER:镜像维护着的姓名和邮箱地址
−MAINTAINER:镜像维护着的姓名和邮箱地址
−
R
U
N
:
容
器
构
建
时
需
要
运
行
的
命
令
\color{red} - RUN:容器构建时需要运行的命令
−RUN:容器构建时需要运行的命令
−
E
X
P
O
S
E
:
当
前
容
器
对
外
暴
露
的
端
口
\color{red} - EXPOSE:当前容器对外暴露的端口
−EXPOSE:当前容器对外暴露的端口
−
W
O
R
K
D
I
R
:
指
定
创
建
容
器
后
,
终
端
默
认
登
录
进
来
的
工
作
目
录
,
一
个
落
脚
点
\color{red} - WORKDIR:指定创建容器后,终端默认登录进来的工作目录,一个落脚点
−WORKDIR:指定创建容器后,终端默认登录进来的工作目录,一个落脚点
−
E
N
V
:
用
来
构
建
镜
像
过
程
中
,
设
置
环
境
变
量
\color{red} - ENV:用来构建镜像过程中,设置环境变量
−ENV:用来构建镜像过程中,设置环境变量
−
A
D
D
:
将
宿
主
机
目
录
下
的
文
件
拷
贝
进
镜
像
且
A
D
D
命
令
会
自
动
处
理
U
R
L
和
解
压
t
a
r
压
缩
包
\color{red} - ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
−ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
−
C
O
P
Y
:
类
似
于
A
D
D
拷
贝
文
件
和
目
录
到
镜
像
中
,
但
是
不
会
自
动
解
压
\color{red} - COPY:类似于ADD拷贝文件和目录到镜像中,但是不会自动解压
−COPY:类似于ADD拷贝文件和目录到镜像中,但是不会自动解压
COPY src dest
COPY["src", "dest"]
−
V
O
L
U
M
E
:
容
器
数
据
卷
,
用
于
数
据
保
存
和
持
久
化
工
作
\color{red} - VOLUME:容器数据卷,用于数据保存和持久化工作
−VOLUME:容器数据卷,用于数据保存和持久化工作
−
C
M
D
:
指
定
一
个
容
器
启
动
时
要
运
行
的
命
令
\color{red} - CMD:指定一个容器启动时要运行的命令
−CMD:指定一个容器启动时要运行的命令
【注意】当DockerFile中有多个CMD时,只有最后一个生效,其他的都会被覆盖,且CMD会被docker run之后的参数替换
−
E
N
T
R
Y
P
O
I
N
T
:
指
定
一
个
容
器
启
动
时
要
运
行
的
命
令
,
与
C
M
D
一
样
,
它
多
个
生
效
,
\color{red} - ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样,它多个生效,
−ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样,它多个生效,
且
会
被
d
o
c
k
e
r
r
u
n
之
后
的
参
数
追
加
\color{red}且会被docker run之后的参数追加
且会被dockerrun之后的参数追加
−
O
N
B
U
I
L
D
:
当
构
建
一
个
被
集
成
的
D
o
c
k
e
r
f
i
l
e
时
运
行
命
令
,
父
镜
像
在
被
子
集
成
后
父
镜
像
的
o
n
b
u
i
l
d
被
触
发
\color{red} - ONBUILD:当构建一个被集成的Dockerfile时运行命令,父镜像在被子集成后父镜像的onbuild被触发
−ONBUILD:当构建一个被集成的Dockerfile时运行命令,父镜像在被子集成后父镜像的onbuild被触发
保留字小总结
入门小案例
自定义Linux镜像
FROM centos
MAINTAINER xiaozehng<xiaozheng@joinpay.com>
ENV MYPAYCH /usr/local
WORKDIR $MYPAYCH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPAYCH
CMD echo "success........ok"
CMD /bin/bas
制作CMD版查询ip镜像
主要学习:CMD 和 ENTRYPOINT
FROM centos
RUN yum -y install curl
CMD [ "curl", "-i", "http://ip.cn" ]
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-i", "http://ip.cn" ]
测试启动命令
docker run -it 镜像ID -s
总结
按照上面的操作就可以了,希望对你有帮助!
授
人
以
鱼
不
如
授
人
以
渔
,
知
道
的
越
多
,
不
知
道
的
越
多
,
希
望
对
你
有
帮
助
!
\color{red}授人以鱼不如授人以渔,知道的越多,不知道的越多,希望对你有帮助!
授人以鱼不如授人以渔,知道的越多,不知道的越多,希望对你有帮助!