文章目录
dockerfile是用来构建docker镜像的文件的命令参数脚本
构建步骤
- 编写一个dockerfile
- docker bulid 构建一个镜像
- docker run运行镜像
- docker push 发布镜像到DockerHub,阿里云镜像仓库
指令
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录位置 |
EXPOSE | 指定暴露端口配置 |
CMD | 指定这个容器启动的时候要运行的命令(只有最后一个会生效) |
EMTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令 |
COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 |
ENV | 构建的时候设置环境变量 |
- 指令必须为大写字母
- 从上到下顺序执行
- #为注释
- DockerFile 每一个指令都会创建一个新的镜像层.
关于Dockerfile指令的详细语法解释:Dockerfile文件详解
Dockerfile指令介绍的官方文档:https://docs.docker.com/engine/reference/builder/
如何去提交一个Dokcer镜像给他人交付
示例:构建centos加入vim和net-tools
#编写dockerfile
FROM centos
MAINTAINER yjwson<787654478@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end------"
CMD /bin/bash
#通过文件构建镜像
docker build -f dockerfile文件目录 -t 镜像名:[tag] .
#可以发现进入了设置的工作目录$MYPATH
[root@d67220e15590 local]# pwd
/usr/local
#并且可以使用vim命令
列出镜像变更历史
docker history
Error response from daemon: no such id: mydentos
[root@iZ70eyv5ttqkcsZ ~]# docker history 738244ab554e
IMAGE CREATED CREATED BY SIZE COMMENT
738244ab554e 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/b... 0 B
7e665d843e16 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "ec... 0 B
aef0871f7f8c 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "ec... 0 B
e6f6e67d7415 6 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
4e00d1d65ae7 6 minutes ago /bin/sh -c yum -y install net-tools 27.3 MB
2eee4eb2d497 6 minutes ago /bin/sh -c yum -y install vim 64.7 MB
4792fba155e9 7 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0 B
5fa99426de96 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0 B
6d027965a817 7 minutes ago /bin/sh -c #(nop) MAINTAINER yjwson<78765... 0 B
b87454c9f973 7 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/b... 0 B
47ae91d9d1a5 7 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "ec... 0 B
2324d5195be1 7 hours ago /bin/sh -c #(nop) VOLUME [volume01 volume02] 0 B
5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.... 0 B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0b... 231 MB
CMD和ENTRYPOING的区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可以被代替
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
#dockerfile
FROM centos
CMD ["ls","-a"]
#构建镜像
docker build -f mydockerfile2 -t cmdtest .
#执行镜像之后ls -a 命令生效了
[root@iZ70eyv5ttqkcsZ dockerfile]# docker run f5a0a65d1e51
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
volume01
volume02
#追加-l之后
[root@iZ70eyv5ttqkcsZ dockerfile]# docker run f5a0a65d1e51 -l
container_linux.go:235: starting container process caused "exec: \"-l\": executable file not found in $PATH"
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "exec: \"-l\": executable file not found in $PATH".
#使用 ps -al
[root@iZ70eyv5ttqkcsZ dockerfile]# docker run f5a0a65d1e51 ls -al
total 64
drwxr-xr-x 1 root root 4096 Dec 27 13:50 .
drwxr-xr-x 1 root root 4096 Dec 27 13:50 ..
-rwxr-xr-x 1 root root 0 Dec 27 13:50 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 27 13:50 dev
drwxr-xr-x 1 root root 4096 Dec 27 13:50 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 105 root root 0 Dec 27 13:50 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
drwxr-xr-x 1 root root 4096 Dec 27 13:50 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Dec 27 13:50 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
drwxr-xr-x 2 root root 4096 Dec 27 13:50 volume01
drwxr-xr-x 2 root root 4096 Dec 27 13:50 volume02
#可以看出来是进行了替换而不是追加
测试 entrypoint指令
#编写dockerfile
FROM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
[root@iZ70eyv5ttqkcsZ dockerfile]# docker build -f dockerfile-cmd -t entorypoint-test .
Sending build context to Docker daemon 4.096 kB
Step 1/2 : FROM centos
---> b87454c9f973
Step 2/2 : ENTRYPOINT ls -a
---> Running in 83e1eeebcc36
---> 7fe30dd55dc0
Removing intermediate container 83e1eeebcc36
Successfully built 7fe30dd55dc0
#运行镜像
[root@iZ70eyv5ttqkcsZ dockerfile]# docker run 7fe30dd55dc0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
volume01
volume02
#追加参数 -l
[root@iZ70eyv5ttqkcsZ dockerfile]# docker run 7fe30dd55dc0 -l
total 64
drwxr-xr-x 1 root root 4096 Dec 27 13:55 .
drwxr-xr-x 1 root root 4096 Dec 27 13:55 ..
-rwxr-xr-x 1 root root 0 Dec 27 13:55 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Dec 27 13:55 dev
drwxr-xr-x 1 root root 4096 Dec 27 13:55 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 14:17 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 104 root root 0 Dec 27 13:55 proc
dr-xr-x--- 2 root root 4096 Sep 15 14:17 root
drwxr-xr-x 1 root root 4096 Dec 27 13:55 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Dec 27 13:50 sys
drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp
drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
drwxr-xr-x 2 root root 4096 Dec 27 13:55 volume01
drwxr-xr-x 2 root root 4096 Dec 27 13:55 volume02
fff
示例:Tomcat镜像+jdk压缩包
-
准备镜像文件,tomcat压缩包,jdk安装包
-
编写dockerfile文件,官方命名Dockerfile ,这样build命令自动寻找这根文件不需要-f指定路径了!
FROM centos
MAINTAINER yjw
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u181-linux-x64.tar.gz.gz /usr/local
ADD apache-tomcat-8.5.73.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.73
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.73
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.73/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.73/logs/catalina.out
#docker build
docker build -t yjwtomcat:1.0 .
- docker运行自定义镜像 yjwtomcat:1.0
docker run -d -p 8080:8080 --name yjwtomcat -v /home/newtomcat/test:/usr/local/apache-tomcat-8.5.73/webapps/test -v /home/newtomcat/logs/:/usr/local/apache-tomcat-8.5.73/logs tomcat:1.0
- 新建一个test.html文件从宿主机放入/home/newtomcat/test路径下,尝试访问
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>这是个标题</title>
</head>
<body>
<h1>这是一个一个简单的HTML</h1>
<p>Hello World!</p>
</body>
</html>
webxml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
</web-app>