DockerFile
DockerFile介绍
dockerFile是用来构建Docker镜像的文件,是命令参数脚本
构建步骤:
- 编写dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(可发送到两个位置)
- DockerHub,可供他人使用
- 阿里云镜像仓库
发布到hub
点进去之后就是镜像位置,会跳转到gitHub
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
DockerFile的构建过程
脚本的编写!!
- 指令的大小写:DockerFile的指令是忽略大小写的,但建议使用大写
- 指令的执行顺序是从上到下的
#
表示注释- 每一个指令都会创建一个新的镜像层,并提交
DockerFile是面向开发的,以后发布项目,创建镜像,都需要编写DockerFile文件
Docker镜像逐渐成为企业交付的标准,必须掌握
步骤:开发 部署 上线运维…缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
使用这些命令可构建自己的镜像
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 指定维护者的信息 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:如要搭建tomcat镜像,需要加入tomcat是压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置 如果不写,需要在启动时使用-p命令
CMD # 指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候需要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的 DockerFile ,这个时候就会运行ONBUILD指令,是一个触发指令
COPY # 类似ADD ,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试
centos测试
- 编写DockerFile的文件
FROM centos
MAINTAINER ayuan<3610089198@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
- 编译运行,通过这个文件构建镜像
# 运行成功的部分信息
Successfully built 55313e0af22e
Successfully tagged mycentos:1.0
- 运行测试
[root@localhost dockerfile]# docker run -it mycentos:1.0
[root@0a77b114ce96 local]# pwd
/usr/local # dockerfile中编写的MYPATH
# 比较一下原版centos
[root@bogon ~]# docker run -it centos
[root@48b2f248c7ce /]# pwd
/ # 启动之后默认是在根目录
- 使用ifconfig测试
[root@0a77b114ce96 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 测试 vim
[root@0a77b114ce96 local]# vim test
cat test
注:mydockerfile-centos文件中写了多个CMD,只有最后一个会生效,所以当使用命令
docker run mycentos:1.0
的时候,并不会有内容输出.
新建一个mydockerfile-centos2,内容如下
FROM centos
MAINTAINER ayuan<3610089198@qq.com>
ENV MYPATH /usr/local2
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 81
CMD echo "now u see me"
并使用其创建的镜像为 mycentos:1.1
此时再使用docker run mycentos:1.1
的时候会有内容输出
[root@bogon dockerfile]# docker run mycentos:1.1
now u see me
查看镜像构建历史
[root@bogon ~]# docker history b4d1f561551c
IMAGE CREATED CREATED BY SIZE COMMENT
b4d1f561551c 20 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
ec25d74b54d8 20 hours ago /bin/sh -c #(nop) EXPOSE 81 0B
a15cf7014ac8 20 hours ago /bin/sh -c yum -y install net-tools 24.9MB
fc3ebb2dce60 20 hours ago /bin/sh -c yum -y install vim 60.7MB
148148e015b4 20 hours ago /bin/sh -c #(nop) WORKDIR /usr/local2 0B
5894cd6588ba 20 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local2 0B
d000efa750f3 20 hours ago /bin/sh -c #(nop) MAINTAINER ayuan<36100891… 0B
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD和ENTRYPOINT区别
CMD["[命令1]","[命令2]",…]:执行多条命令,用“,”分割,表示运行之后自动执行的命令
- 测试CMD
1. 编写dockerfile-cmd-test文件
[root@bogon dockerfile]# cat dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
2. 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .
3. 运行之后会自动执行 ls -a 命令
[root@bogon dockerfile]# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
4. 尝试为CMD增加参数 意使其执行 ls -al
[root@bogon dockerfile]# docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# 结果会报错,因为在CMD的情况下,-l会取代 ls -a ,但是-l不是完整的命令,所以会报错
# 改正,ls -al 是完整的命令,会执行
[root@bogon dockerfile]# docker run cmdtest ls -al
total 0
drwxr-xr-x. 1 root root 6 Jun 25 03:20 .
drwxr-xr-x. 1 root root 6 Jun 25 03:20 ..
-rwxr-xr-x. 1 root root 0 Jun 25 03:20 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jun 25 03:20 dev
drwxr-xr-x. 1 root root 66 Jun 25 03:20 etc
drwxr-xr-x. 2 root root 6 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 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 112 root root 0 Jun 25 03:20 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 25 02:05 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
- 测试ENTRYPOINT
1. 编写 dockerfile-entrypoint-test 文件
[root@bogon dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls","-a"]
2. 构建镜像
docker build -f dockerfile-entrypoint-test -t entrypoint-test .
3. 运行之后会自动执行 ls -a 命令
[root@bogon dockerfile]# docker run 94c729adceb6
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
4. 追加运行
# 实际执行的是 ls -al
[root@bogon dockerfile]# docker run 94c729adceb6 -l
total 0
drwxr-xr-x. 1 root root 6 Jun 25 03:31 .
drwxr-xr-x. 1 root root 6 Jun 25 03:31 ..
-rwxr-xr-x. 1 root root 0 Jun 25 03:31 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jun 25 03:31 dev
drwxr-xr-x. 1 root root 66 Jun 25 03:31 etc
drwxr-xr-x. 2 root root 6 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 6 Dec 4 2020 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 115 root root 0 Jun 25 03:31 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jun 25 02:05 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
实战:Tomcat镜像
莫得资源,盲听
-
准备镜像文件,tomcat压缩包,jdk压缩包
-
编写DockerFile文件,官方命名
DockerFile
,build的时候会自动寻找这个文件,就不需要-f
指定了
FROM centos
MAINTAINER ayuan<3610089198@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8ull-linux-x64.tar.gz /usr/local # ADD命令,运行的时候会自动解压压缩包到指定的路径
ADD apache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
# 配置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
# tail -F [文件名]:tail命令启动的时候,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件
- 构建镜像
docker build -t diytomcat . # 因为用的是官方的名字,所以可以不使用 -f [DockerFile名字] 来指定文件
运行日志截图:
- 启动镜像
# 同步test信息,同步日志信息
docker run -d -p 9090:8080 --name mytomcat -v /home/mytomcat/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/kuangshen/build/tomca/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat
- 访问测试
curl localhost:9090 # 如果可以成功访问,那么在外网也可以访问
-
发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了,不必再进入容器)
- 进入挂载的test目录
2. 在test下创建WEB-INF目录,并在WEB-INF目录下创建web.xml文件
3. 在test下创建index.jsp文件
4. 查看日志
日志信息:
发布自己的镜像
DockerHub
-
地址 https://hub.docker.com/注册账号
-
确定账号可登录
-
在自己的服务器上提交自己的镜像
-
登录完毕后就可以提交镜像了
这里被拒绝是因为有重复的,建议加上作者信息和版本号便于区分和维护
发布中部分日志
提交的时候也是按照层级来提交的
发布到aliyun
-
登录aliyun
-
找到容器镜像服务
-
创建命名空间
-
创建容器镜像
-
浏览信息
# 公网地址:可通过这个地址来访问当前仓库
6. 发布步骤