文章目录
一、Dockerfile
dockerfile 就是一个构建docker镜像的文件【命令行脚本】
1.1 centos dockefile
光嘴巴说 makes no sense。我们看看docker hub (以centos 为例):
截图显示 centos镜像支持 centos7 版本,点开发现:
这个DockerFile的目的很简单,就是构建一个干净的centos镜像,注意到一些 命令 ping 、ll 等都没有打进去。
实际使用过程中,我们希望镜像中能带有常用软件,jdk redis 等,就要自己写DockerFile了。
1.2 基于dockerfile构建
如何基于DockerFile构建一个 Image:
- 写一个DockerFile
- docker build 烘焙一个镜像
- docker run 拉起一个容器
- docker push 发布一个镜像(docker hub or 私有镜像 or 阿里云镜像库)
- 一些企业可能把docker 镜像作为交付标准,而不是jar。Dockerfile 就是定义镜像的文件。
Dockerfile的基础:
- 每个保留关键字(指令)都是大写的
- 每一个指令都会提交一个新的镜像层
1.3 语法
-
FROM 基础镜像,比如centos
-
MAITAINER
-
RUN
-
ADD 添加包(会自动解压)
-
WORKDIR (镜像的工作目录)
WORKDIR $MYPATH --> 定义进入容器时的默认位置,并指定了接下来的Dockerfile 指令执行的目录
-
VOLUME 挂载目录
-
EXPOSE 暴露端口 (不一定要在dockerfile,也可以 -P -p 指定,但在DockerFile中指定显然易于管理得多)
-
CMD 指定容器启动时要执行的命令:只要最后一个生效,可被替代
-
ENTRYPOINT 指定容器启动时要执行的命令,可以追加命令
-
ONBUILD 当构建一个被继承DockerFile 时,就会运行 ONBUILD (这是触发指令)
-
COPY 类似 ADD,将文件拷贝到镜像中
-
ENV 构建时设置环境变量 (docker run -e 也是设置环境变量)
1.4 构建一个私人订制的centos镜像
官网的centos7 镜像是没有很多常用的命令的,比如ifconfig vim
等,我们自己定制一个centos7镜像,加上这些.
1、写dockefile
FROM centos
MAINTAINER xiaohe.hu
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum install -y vim
RUN yum install -y net-tools
EXPOSE 80
CMD echo working in $MYPATH
CMD "--end of docker file--"
CMD /bin/bash
2、构建镜像 【注意最后的一个点】
docker build -f xiaohe-centos-dockerfile -t xiaohe/centos:1.0 .
当出现下面提示时表示构建成功:
Successfully built fdb41eb9d9f8
`Successfully tagged xiaohe/centos:1.0``
也可以通过docker images
确认新镜像已创建
3、基于私人定制的镜像拉起一个进程
从截图的箭头可以看到,这个容器确实拥有了 DockerFile中 增加的 vim 等命令。有意思的是,尽管在 DockerFile中我们 expose 80 端口,实际上容器并未监听这个端口。这是因为 DockerFile 中 EXPOSE
只是一种协定:镜像发行方告诉使用方,建议在 80 监听;可以通过 -p 、 -P 重新指定
1.5 docker history 回看构建过程
docker history ContainerID
docker history ContainerID
不仅适用于自定义镜像,对于从docker hub 拉下来的镜像也起效。可以借此学习和了解一下优秀开源镜像是如何制作的。
1.6 CMD 和 ENTRYPOINT
实测一下:
1、写一个简单的 DockerFile
[root@localhost dockerfile-test]# cat xiaohe-cmd-dockerfile
FROM centos
CMD ["ls","-a"]
2、构建镜像并执行
[root@localhost dockerfile-test]# docker build -f xiaohe-cmd-dockerfile -t xiaohe-cmd/centos:1.0 .
[root@localhost dockerfile-test]# docker run -it 7842aa239a7a
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
可以看到 容器拉起并执行了 ls -a
3、但是 假如 我们追加一个 命令 参数 -l ,执行则会报错
[root@localhost dockerfile-test]# docker run 7842aa239a7a -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
4、同理,我们追加一个 完整的命令 ls -l ; 执行则OK
[root@localhost dockerfile-test]# docker run 7842aa239a7a ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
....
通过这个小测试说明:
CMD : docker run
后追加的命令会替代掉dockerfile中的命令
类似的,将DockerFile中 CMD
换成 ENTRYPOINT
,会发现docker run
后追加命令能够执行
这样理解:
- CMD 启动应用的动态参数
- ENTRYPOINT 启动应用的固定命令
二、自己做Tomcat镜像
1、准备镜像文件tomcat 压缩包、jdk 包
FROM centos
MAINTAINER xiaohe.hu
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-7.0.29.tar.gz /usr/local 【打镜像时会自动解压】
ADD jdk-7u67-linux-x64.tar.gz /usr/local 【打镜像时会自动解压】
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.7.0_67
ENV CLASSPATH $JAVA_HOME/lib/dat.jar;$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.29
ENV CATALINA_BASE /usr/local/apache-tomcat-7.0.29
ENV PATH $PATH;$JAVA_HOME/bin;$CATALINA_HOME/lib;$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-7.0.29/bin/startup.sh && tail -f /usr/local/apache-tomcat-7.0.29/logs/catalina.out
2、打镜像
docker build -f Dockerfile -t xiaohe-tomcat:2.0 .
3、从镜像拉起容器
docker run --name xiaohe-tomcat -d -p 9090:8080 -v /home/tomcat-test/webapps:/usr/local/apache-tomcat-7.0.29/webapps -v /home/tomcat-test/tomcatlogs:/usr/local/apache-tomcat-7.0.29/logs xiaohe-tomcat:2.0
注意:这里 使用 -v
挂载了目录。这样,若需要发布,只需要把资源放到webapps
目录下就可;想要看 tomcat的运行日志,在宿主机也就可以看了
此时直接:curl localhost:9090
,会发现没有输出;从浏览器访问也没有展示,但注意状态码是 404 (跟Tomcat版本有关,高版本的会有Tomcat的启动页),其实Tomcat已经启动成功了。
4、发布(简单起见,直接发布个html)
在 webapps
目录下新建 test/index.html
,浏览器访问 http://192.168.*.*:9090/test/index.html
三、发布镜像到dockerhub
1、注册dockerhub
2、docker login -u UserName -p password
3、docker push ImageName
远程仓库dockerhub 网络太慢,一般很少使用
四、阿里云等镜像仓库
大厂有自己的镜像 仓库,公有云当然也有。