Docker基础(三) DockerFile、发布镜像

一、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 网络太慢,一般很少使用

四、阿里云等镜像仓库

大厂有自己的镜像 仓库,公有云当然也有。

五、小结

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值