dockerfile 介绍


dockerfile是用来构建docker镜像的文件!命令参数脚本
构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(Docker hub 、阿里云镜像仓库)

dockerfile 构建过程


基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交!

image.png
Dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件
Docker镜像 逐渐成为企业交付的标准,必须要掌握!

步骤:开发、部署、运维。。。缺一不可!**
DockerFile:构建文件,定义了一切的步骤,类似于源代码
DockerImages:通过Dockerfile构建生成的镜像,就是我们最终发布运行的产品
Docker容器:容器就是镜像运行起来提供服务

Dockerfile 的指令

DockerFile - 图2

  1. FROM # 基础镜像,一切从这开始构建
  2. MAINTAINER # 镜像是谁写的,姓名+邮箱
  3. RUN # 镜像构建的时候需要运行的命令
  4. ADD # 假设构建tomcat镜像,这个tomcat压缩包,必须要添加进去吧. 用ADD添加的文件会自动解压
  5. WORKDIR # 镜像的工作目录
  6. VOLUME # 挂载的目录
  7. EXPOSE # 指定暴露端口
  8. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  9. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
  10. ONBUILD # 当构建一个被继承的 dockerfile , 这个时候就会运行ONBUILD的指令,触发指令
  11. COPY # 类似ADD,将我们的文件拷贝到镜像中
  12. ENV # 构建的时候设置环境变量

实战测试: 创建一个centos


Docker hub中 99% 的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
image.png

  1. 编写自己的dockerfile文件 ```shell root@kylin:/home/dockerfile# cat mydockerfile-centos FROM centos MAINTAINER kylinvipvip@qq.com

ENV MYPATH /usr/local WORKDIR $MYPATH

RUN yum -y install vim RUM yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH

CMD echo “————end—————“

CMD /bin/bash

  1. 2. 通过文件构建镜像
  2. ```shell
  3. 命令: docker build -f dockerfile路径 -t 镜像名:[TAG] . //最后有个点
  4. docker build -f mydockerfile-centos -t mycentos:0.1 .
  5. #结果:
  6. Successfully built cf79dd40a41e
  7. Successfully tagged mycentos:0.1
  1. 运行 ```shell

    运行:

    root@kylin:/home/dockerfile# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 cf79dd40a41e 6 minutes ago 295MB

root@kylin:/home/dockerfile# docker run -it mycentos:0.1

  1. 4. 对比:
  2. 之前的centos
  3. ```shell
  4. [root@2a9e7735a29c /]# pwd
  5. /
  6. [root@2a9e7735a29c /]# vim
  7. bash: vim: command not found
  8. [root@2a9e7735a29c /]# ifconfig
  9. bash: ifconfig: command not found

我们增加之后的mycentos:

  1. [root@b8cc3e67320b local]# pwd
  2. /usr/local
  3. [root@b8cc3e67320b local]# ifconfig
  4. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  5. inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
  6. ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
  7. RX packets 9 bytes 766 (766.0 B)
  8. RX errors 0 dropped 0 overruns 0 frame 0
  9. TX packets 0 bytes 0 (0.0 B)
  10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  11. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  12. inet 127.0.0.1 netmask 255.0.0.0
  13. loop txqueuelen 1000 (Local Loopback)
  14. RX packets 0 bytes 0 (0.0 B)
  15. RX errors 0 dropped 0 overruns 0 frame 0
  16. TX packets 0 bytes 0 (0.0 B)
  17. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  1. 我们可以列出本地的镜像变更历史 docker history 镜像id
    1. root@kylin:~# docker history mycentos:0.1
    2. IMAGE CREATED CREATED BY SIZE COMMENT
    3. cf79dd40a41e 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
    4. f6d1c2d2eec1 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    5. 2f9fc8597688 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    6. ec4844fcdccf 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
    7. fddbeba135c5 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
    8. e716a472c60f 12 minutes ago /bin/sh -c yum -y install vim 57.2MB
    9. e716a248cc9c 12 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
    10. fd9dccef6ad3 12 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
    11. 40450b32cb73 12 minutes ago /bin/sh -c #(nop) MAINTAINER kylin<vipvip@q… 0B
    12. 831691599b88 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
    13. <missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
    14. <missing> 7 weeks ago /bin/sh -c #(nop) ADD file:84700c11fcc969ac0… 215MB
    通过docker history 这个命令可以查看其它官方镜像的构建过程

CMD 和 ENTRYPOINT 的区别

  1. CMD # 指定这个容器启动的时候要运行的命令可以追加命令,只有最后一个会生效,可被替代
  2. ENTRYPOINT # 指定这个容器启动的时候要运行的命令可以追加命令

测试cmd命令

  1. #1.编写 dockerfile 文件
  2. root@kylin:/home/dockerfile# vim dockerfile-cmd-test
  3. FROM centos
  4. CMD ["ls","-a"]
  5. #2. build 构建镜像
  6. root@kylin:/home/dockerfile# docker build -f dockerfile-cmd-test -t cmd-test .
  7. #3. run 运行,发现我们的ls -a 命令生效
  8. root@kylin:/home/dockerfile# docker run cmd-test
  9. .
  10. ..
  11. .dockerenv
  12. bin
  13. dev
  14. etc
  15. home
  16. ...
  17. #4. 想追加一个命令-l ,理想情况是 ls -al,但是却报错了
  18. root@kylin:/home/dockerfile# docker run cmd-test -l
  19. docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
  20. ERRO[0000] error waiting for container: context canceled
  21. #cmd 的清理下 -l 替换了 ["ls","-a"]命令,因为-l 不是命令,所以报错
  22. #如果不用-l,而是换成pwd或者 ls -al其他命令,那么就直接执行pwd或者其他命令.(["ls","-a"]被替换了,不会执行)

测试 ENTRYPOINT

  1. # 1. 编写dockerfile文件
  2. root@kylin:/home/dockerfile# vim dockerfile-entrypoint
  3. FROM centos
  4. ENTRYPOINT ["ls","-a"]
  5. # 2. build生成镜像
  6. root@kylin:/home/dockerfile# docker build -f dockerfile-entrypoint -t entrypoint .
  7. # 3. run 运行镜像
  8. root@kylin:/home/dockerfile# docker run entrypoint
  9. .
  10. ..
  11. .dockerenv
  12. bin
  13. dev
  14. etc
  15. home
  16. # 4. 追加一个命令-l ,理想情况是 ls -al,结果与理想情况一样,追加命令是直接拼接在命令后面的
  17. root@kylin:/home/dockerfile# docker run entrypoint -l
  18. total 56
  19. drwxr-xr-x 1 root root 4096 Aug 8 09:38 .
  20. drwxr-xr-x 1 root root 4096 Aug 8 09:38 ..
  21. -rwxr-xr-x 1 root root 0 Aug 8 09:38 .dockerenv
  22. lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
  23. drwxr-xr-x 5 root root 340 Aug 8 09:38 dev
  24. drwxr-xr-x 1 root root 4096 Aug 8 09:38 etc
  25. drwxr-xr-x 2 root root 4096 May 11 2019 home

dockerfile中很多命令都十分相似,我们需要了解他们的区别,最好的学习方式就是对比他们,然后测试效果。

实战测试: Tomcat镜像

  1. 准备镜像文件: Tomcat压缩包 jdk的压缩包!

image.png

  1. 编写 dockerfile 文件,官方命名 Dockerfile ,build 会自动寻找这个文件,就不需要 -f 指定了 ```shell FROM centos MAINTAINER kylin1770824244@qq.com

COPY readme.txt /usr/local/readme.txt

ADD apache-tomcat-9.0.37.tar.gz /usr/local/ ADD jdk-8u261-linux-x64.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/log s/catalina.out

  1. 3. 构建镜像
  2. ```shell
  3. #docker build -t diytomcat .
  1. 启动镜像

    1. docker run -d -p 9090:8080 --name kylin_tomcat01 -v /home/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/logs/:/usr/local/apache-tomcat-9.0.37/logs diytomcat
  2. 测试

    1. curl localhost:9090 #成功执行
  3. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发不了)( 使用jsp+web.xml 测试) ```html <%@ page language=”java” contentType=”text/html; charset=utf-8” pageEncoding=”utf-8”%> <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd">

    1. ```xml
    2. <?xml version="1.0" encoding="UTF-8"?>
    3. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    4. <display-name>FirstWebFontEnd</display-name>
    5. <welcome-file-list>
    6. <welcome-file>index.html</welcome-file>
    7. <welcome-file>index.htm</welcome-file>
    8. <welcome-file>index.jsp</welcome-file>
    9. <welcome-file>default.html</welcome-file>
    10. <welcome-file>default.htm</welcome-file>
    11. <welcome-file>default.jsp</welcome-file>
    12. </welcome-file-list>
    13. </web-app>

    项目部署成功,可以直接访问
    我们以后开发的步骤,需要掌握dockerfile的编写,我们之后发布的一切都是使用docker镜像来发布运行

    发布镜像

    发布到 docker hub

    1. https://hub.docker.com 注册自己的账号
    2. 确定这个账号可以登录
    3. 在我们服务器上提交自己的镜像(先使用docker login登录) ```shell root@kylin:~# docker login —help

    Usage: docker login [OPTIONS] [SERVER]

    Log in to a Docker registry. If no server is specified, the default is defined by the daemon.

    Options: -p, —password string Password —password-stdin Take the password from stdin -u, —username string Username

    root@kylin:~# docker login -u 用户名 -p 密码 WARNING! Using —password via the CLI is insecure. Use —password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store

    Login Succeeded

    1. 4. **登录完毕之后就可以提交镜像了,docker push**
    2. ```shell
    3. docker push kylin177/mycentos:1.0
    4. #注意:我的dockerhub用户名的kylin177(我只对这个kylin177有权限),所有我构建的镜像名字应该是以kylin177开头的
    5. 自己发布的镜像一定要带上版本号,很重要

    解决没有TAG的方法:

    1. docker tag 镜像id kylin177/mycentos:2.0

    发布到阿里云

    1. 登录阿里云
    2. 找到容器镜像服务
    3. 创建命名空间(一个账号只能创建三个命名空间)

    image.png

    1. 创建一个仓库(默认私有)

    image.png
    选择本地仓库

    image.png

    1. 看着阿里云给的官方教程(每个人的都不一样),上传自己的镜像

    image.png

    小节

    docker-flowchart.png
    不仅可以把镜像发布到云端,还可以把docker镜像打包发给别人

    1. 打包:
    2. docker save 镜像id -o xxxx.tar
    3. 加载:
    4. docker load -i xxx.tar