Dockerfile介绍
docker是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
基础知识
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件
Docker 镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维 缺一不可
DockerFile:构建文件,定义了一切步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候就会运行 ONBUILD 的命令。触发指令
COPY # 类似ADD,将文件拷贝到镜像中
ENY # 构建的时候设置环境变量!
实战测试
Docker Hub中99%镜像都是从这个基础镜过来的 FROM scratch,然后配置需要的软件和配置来进行的构建
创建一个自己的centos
1、编写dockerfile的文件[root@wq dockerfile]# vim mydockerfile-centos
[root@wq dockerfile]#
[root@wq dockerfile]# cat mydockerfile-centosFROM centos:7
MAINTAINER wq<123456@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash2、通过这个文件构建镜像#命令docker build -f dockerfile文件路径 -t 镜像名:[tag]
#官方命令是Dockerfile,使用这个命名,build的时候就会自动寻找这个文件,就不需要 -f 了#别忘了最后的点,表示当前目录[root@wq dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .3、测试运行[root@wq dockerfile]# docker images |grep centos
mycentos 0.1 6627b0adacef 54 seconds ago 501MB[root@wq dockerfile]# docker run -it mycentos:0.1
[root@775d3babc008 local]# pwd #设置的工作目录,因此进入容器直接到了这个目录
/usr/local
对比:之前的原生的centos
增加之后的镜像
列出本地镜像变更历史
这样平时拿到一个镜像,就知道它是怎么做的了
CMD 和 ENTRYPOINT 区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
#编写dockerfile文件
[root@wq dockerfile]# cat dockerfile-cmd-test
FROM centos:7
CMD ["ls","-a"]#构建镜像
[root@wq dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
[+] Building 15.3s (5/5) FINISHED docker:default=> [internal] load build definition from dockerfile-cmd-test 0.0s=> => transferring dockerfile: 76B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/centos:7 15.2s=> CACHED [1/1] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd6184 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:c757e3a723ae82c9a6b3b7581f54ee6d140d3cd1f29acb9a4bcfe32ed77f8684 0.0s=> => naming to docker.io/library/cmdtest 0.0s[root@wq dockerfile]# docker images |grep cmdtest
cmdtest latest c757e3a723ae 2 years ago 204MB#run运行 发现ls -a命令生效
[root@wq dockerfile]# docker run c757e3a723ae
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var#想追加一个命令 -l ls -al
[root@wq dockerfile]# docker run c757e3a723ae -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.#cmd的情况下 -l 替换了 CMD ["ls","-a"] 命令,-l 不是命令所以报错!
测试ENTRYPOINT
[root@wq dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos:7
ENTRYPOINT ["ls","-a"][root@wq dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
[+] Building 15.3s (5/5) FINISHED docker:default=> [internal] load build definition from dockerfile-cmd-entrypoint 0.0s=> => transferring dockerfile: 89B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/centos:7 15.2s=> CACHED [1/1] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd6184 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:5184c7d459a0111136914d90d94e7121f7fce3c2746b17b74fc2f1e808a37da8 0.0s=> => naming to docker.io/library/entrypoint-test 0.0s[root@wq dockerfile]# docker images |grep entrypoint-test
entrypoint-test latest 5184c7d459a0 2 years ago 204MB[root@wq dockerfile]# docker run 5184c7d459a0
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@wq dockerfile]# docker run 5184c7d459a0 -l
total 64
drwxr-xr-x 1 root root 4096 Mar 3 12:06 .
drwxr-xr-x 1 root root 4096 Mar 3 12:06 ..
-rwxr-xr-x 1 root root 0 Mar 3 12:06 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 3 12:06 dev
drwxr-xr-x 1 root root 4096 Mar 3 12:06 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 155 root root 0 Mar 3 12:06 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Feb 27 06:47 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var