持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
Dockerfile详情
Docker可以通过读取来自Dockerfile。Dockerfiel是一个文本文档,其中包含用户可以在命令行上 调用以组合的所有命令。写完文件文档,我们可以使用docker build用户可以创建连续执行多个命令 指令的自动构建 例如: vim dockerfile FROM RUN CMR .... docker bulid 镜像名称:版本 dockerfile的路径
用法
用户从构建dockerfile和一个上下文。构建的上下文是指定位置PATH和url,PATH是用户本地文件系统目录, URL是一个Git存储库位置。构建上下文是递归处理的
[root@192.168.146.112/data/dockerfile/centos6.9_ssh_nginx]# docker build -t centos6.9_ssh_nginx:v1 .
Sending build context to Docker daemon 3.072kB
......
构建由Docker守护程序运行,而不是由CLI运行。构建过程做的第一件事是将整个上下文(递归地)发送到 守护进程。在大多数情况下,最好从一个空目录作为上下文开始(创建一个空目录,只属于某个服务),并 将 Dockerfile 保存在该目录中。仅添加构建 Dockerfile 所需的文件。
记住==============================警告 不要使用根目录/作为PATH构建上下文,因为它会导致构建将硬盘驱动器的全部内容传输到 Docker 守护程序。 (白话:就是我们构建dockerfile的时候,不能使用跟目录做完构建镜像的目录)
要在构建上下文中使用文件,Dockerfile指的是指令中指定的文件,例如COPY指令。要提高构建的性能
传统上,Dockerfile被调用Dockerfile并位于上下文的根中。您可以使用-fwith 标志docker build指向文件系统中任何位置的 Dockerfile。 $ docker build -f /path/to/a/Dockerfile .
如果构建成功,您可以指定存储新映像的存储库和标签: $ docker build -t shykes/myapp .
要在构建后将映像标记到多个存储库中,请在-t运行build命令时添加多个参数: $ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
在 Docker 守护程序运行 中的指令之前Dockerfile,它会执行 的初步验证,Dockerfile如果语法不正确,则返回错误: $ docker build -t test/myapp .
Docker 守护进程Dockerfile逐一运行指令,必要时将每条指令的结果提交到新镜像,最后输出新镜像的 ID。Docker 守护进程将自动清理您发送的上下文。 请注意,每条指令都是独立运行的,并会导致创建一个新图像 - 因此RUN cd /tmp不会对下一条指令产生任何影响。
DockerDockerfile按顺序运行指令。一个Dockerfile 必须以开始FROM的指令。这可能在解析器指令、 注释和全局范围的 ARG 之后。该FROM指令指定您正在构建的父映像。FROM前面只能有一个或多个ARG 指令,这些指令声明FROM在Dockerfile.
在执行 Dockerfile 指令之前删除注释行,这意味着以下示例中的注释不是由执行echo命令的 shell 处理的,以下两个示例是等效的:
RUN echo hello \
# comment
world
RUN echo hello \
world
dockerfile主要组成部分
- 基础镜像信息
-
- FORM centos:6.9
- 制作镜像操作指令
-
- RUN yum -y install openssh-server
- 容器启动时操作指令
-
- CMD ["/bin/bash"]
dockerfile常用指令
FROM(from)
- 指定基础镜像
MAINTAINER(maintainer)
- 镜像的描述,目前已不再使用
LABLE(lable)
- 标签,也就是镜像的描述
- LABLE xxxx
RUN(run)
- 你想操作些什么,也就是定义镜像里面执行的命令
- RUN rm -rf /etc/yum.repos.d/*
ADD(add)
- 将本地文件传到镜像里面,如果是压缩文件会自动解压
- ADD kodexporer.conf /etc/nginx/conf.d/
WORKDIR(workdir)
- 相当于cd命令,设置当前的工作目录
- WORKDIR /web/kodexporer
列子:
1.编写dockerfile指定workdir
[root@192.168.146.112/data/dockerfile]# cd centos6.9_kod/
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# vim dockerfile
FROM centos:6.9
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://file.kangle.odata.cc/repo/Centos-6.repo ;curl -o /etc/yum.repos.d/epel.repo http://file.kangle.odata.cc/repo/epel-6.repo
RUN yum -y install openssh-server
RUN /etc/init.d/sshd start
RUN echo redhat | passwd --stdin root
WORKDIR /data/kodexporer
CMD ["/usr/sbin/sshd","-D"]
2.自建镜像
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker build -t centos6.9_kod_ssh:v1 .
Successfully built 333bcc528375
Successfully tagged centos6.9_kod_ssh:v1
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker run -d -p 245:22 centos6.9_kod_ssh:v1
d69a1039f27801c2bb12d89cd13a454ee430d5f858777c52712bc83795b9fed4
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d69a1039f278 centos6.9_kod_ssh:v1 "/usr/sbin/sshd -D" 20 seconds ago Up 18 seconds 0.0.0.0:245->22/tcp, :::245->22/tcp goofy_bohr
3.进入容器后发现默认就是/data/kodexporer
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker exec -it goofy_bohr /bin/bash[root@d69a1039f278 kodexporer]# ls
[root@d69a1039f278 kodexporer]# pwd
/data/kodexporer
VOLUME(volume)
- 存放数据的地方,也就是设置数据卷,挂载主机目录
- VOLUME /data/kodexporer
- 在dockerfile中写好后,运行容器后会自动生成一个数据卷,并挂载到/data/kodexporer目录中
列子
1.编写dockerfile
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# vim dockerfile
VOLUME /data/kodexporer
2.构建镜像
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker build -t centos6.9_kod_ssh:v2 .
Successfully built cd399b582b32
Successfully tagged centos6.9_kod_ssh:v2
3.运行容器
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker run -d -p 99:22 centos6.9_kod_ssh:v2
a60efd02d3477a2c7c61f0a9676391aa771215d7e8bd40dff5d30aaa078c5888
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a60efd02d347 centos6.9_kod_ssh:v2 "/usr/sbin/sshd -D" 17 seconds ago Up 17 seconds 0.0.0.0:99->22/tcp, :::99->22/tcp pensive_einstein
4.查看卷组
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker volume ls
DRIVER VOLUME NAME
local c981d20f2fef0990216ae853a3ff4dae3177c375bb92cf9ddc3361597c58c9e3
5.查看卷组内容
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# ls /var/lib/docker/volumes/c981d20f2fef0990216ae853a3ff4dae3177c375bb92cf9ddc3361597c58c9e3/
_data
6.去页面上传一个文件并查看
EXPOSE
- 指定对外的端口(-P:指定随机端口)
- EXPOST 80 9000(多个端口空格隔开) 列子:
1.编写dockerfile
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# vim dockerfile
#设置对外提供的端口
EXPOSE 80 9000
2.自动构建镜像
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker build -t centos6.9_kod_df:v3 .
......
Successfully built 225ba2e932e1
Successfully tagged centos6.9_kod_df:v3
3.运行容器并测试,会发现随机端口映射成内部指定端口
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker run -d -it -P centos6.9_kod_df:v3
5b8c3a9a85d18fa527fbf23642fbe809553b5171a614e7b1a8d943ee48f61963
[root@192.168.146.112/data/dockerfile/centos6.9_kod]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b8c3a9a85d1 centos6.9_kod_df:v3 "/usr/sbin/sshd -D" 53 seconds ago Up 52 seconds 0.0.0.0:49155->80/tcp, :::49155->80/tcp, 0.0.0.0:49154->9000/tcp, :::49154->9000/tcp stoic_wescoff
CMD
- 指定容器后要启动的命令
- 容易被替换,所谓容易被替换是指在dockerfile指定好命令后,用docker run指定别的命令后会被替换