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

  • 编写一个dockerfile文件
  • docker build 构建成为一个镜像
  • docker run 运行一个jingxaing
  • docker push 发布镜像(dockerHub 阿里云镜像仓库)

基础知识

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

  • 每一个指令都回创建提交一个 新的镜像层,并提交

dockerfile是面向开发的,我们以后要发布项目,做镜像,需要些dockerfile文件,十分简单
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockerimages:通过Dockerfile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来提供服务的

Dockerfile指令

  1. FROM # 基础镜像,一切从这里构建
  2. MAINTAINER #镜像是谁写的,姓名+邮箱
  3. RUN # 镜像构建的时候需要运行的命令
  4. ADD #步骤 :tomcat镜像 添加
  5. WORKDIR #镜像的工作目录
  6. VOLUNE # 挂载的目录
  7. EXPOSE #暴露端口
  8. RUN # 运行
  9. CMD #指定这个容器启动的时候要运行的命令
  10. ENTRYPOINT #指定这个容器的启动的时候要运行的命令,可以追加命令
  11. ONBUILD # 当构建一个被继承Dockerfile 就会运行onbuild 触发指定
  12. COPY # 类似add
  13. ENV #构建的时候设置环境变量

docker hub中 99% 镜像都是从这个基础镜像开始的
image.png
实战测试

  1. 编写dockerfile文件
  2. [root@iZbp1d0213clo5fn6z0fsfZ dockerfile]# cat mydockerfile
  3. FROM centos
  4. MAINTAINER yangsen<838725628@qq.com>
  5. ENV MYPATH /usr/local
  6. WORKDIR $MYPATH
  7. RUN yum -y install vim
  8. RUN yum -y install net-tools
  9. EXPOSE 80
  10. CMD echo $MYPATH
  11. CMD echo "----end----"
  12. CMD /bin/bash
  13. # 通过文件构建镜像
  14. dockers build -f dockerifle文件路径 -t 镜像名:[tag] .
  15. [root@iZbp1d0213clo5fn6z0fsfZ dockerfile]# docker build
  16. -f mydockerfile -t mycentos:0.1 .
  17. 返回
  18. Successfully built a72be511a71a
  19. Successfully tagged mycentos:0.1

测试
image.png
可以列出本地镜像变更历史
docker history
image.png
测试cmd

  1. vim cmd-test
  2. FROM centos
  3. CMD ["ls","-a"]
  4. [root@iZbp1d0213clo5fn6z0fsfZ dockerfile]# docker build
  5. -f dockerfile-cmd-test/cmd-test -t cmdtest .
  6. # run运行 命令生效
  7. [root@iZbp1d0213clo5fn6z0fsfZ dockerfile]# docker run bb3593814fbe
  8. .
  9. ..
  10. .dockerenv
  11. bin
  12. dev
  13. etc
  14. home
  15. lib
  16. lib64
  17. lost+found
  18. media
  19. mnt
  20. opt
  21. proc
  22. root
  23. run
  24. sbin
  25. srv
  26. sys
  27. tmp
  28. usr
  29. var
  30. [root@iZbp1d0213clo5fn6z0fsfZ dockerfile]#

实战tomcat镜像

  1. 准备镜像文件 tomcat压缩包 jdk压缩包

image.png
编写dockerfile文件
官方命名Dockerfile build的时候就不需要 -f 指令

  1. MAINTAINER yangsen<838725628@qq.com>
  2. COPY readme.txt /usr/local/readme.txt
  3. ADD jdk-8u291-linux-x64.tar.gz /usr/local/
  4. ADD apache-tomcat-9.0.46.tar.gz /usr/local/
  5. RUN yum -y install vim
  6. ENV MYPATH /usr/local
  7. WORK $MYPATH
  8. ENV JAVA_HOME /usr/local/jdk1.8.291
  9. ENV CALSSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  10. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46
  11. ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.46
  12. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  13. EXPOSE 8080
  14. CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.46/bin/logs/catalina.out

构建镜像
docker build -t diytomcat .
启动
[root@iZbp1d0213clo5fn6z0fsfZ yangsen]# docker run -d -p 3344:8080 --name yangtomcat -v /home/yangsen/tomcat/test:/usr/local/apache-tomcat-9.0.46/webapps/test -v //home/yangsen/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.46/logs diytomcat

发布镜像

  1. 登录
  2. [root@iZbp1d0213clo5fn6z0fsfZ /]# docker login --help
  3. Usage: docker login [OPTIONS] [SERVER]
  4. Log in to a Docker registry.
  5. If no server is specified, the default is defined by the daemon.
  6. Options:
  7. -p, --password string Password
  8. --password-stdin Take the password from stdin
  9. -u, --username string Username
  10. [root@iZbp1d0213clo5fn6z0fsfZ /]#

提交镜像

  1. [root@iZbp1d0213clo5fn6z0fsfZ /]# docker push yangsen/diytomcat:1.0

[root@iZbp1d0213clo5fn6z0fsfZ /]# docker tag 1cd48e02549a yangsen/tomcat:1.0

构建参数和环境变量

区别
image.png
arg只存在于镜像构建,构建完成之后不会保存在镜像,无法使用比那辆
docker image build -f arg-demo -t arg-3.0 —build-arg VERSION=2.0.0.2
—build-arg 会替换file里面的arg变量的内容
env 构建可以使用,作为环境变量永久保存在容器里面

ENV

ARG

容器启动命令

设置容器启动时的默认会执行的命令

  1. docker system prune -f 删除所有已经退出停止的容器
  2. docker image prune -a 删除没有使用的镜像

区别

  1. cmd设置的命令,可以在run时候传入其他命令,覆盖掉cmd命令,但是entrypoint所设置的命令一定会执行
  2. 可以联合使用,entrypoint设置执行的命令,cmd设置参数
    CMD
    ENTRYPOINT

使用技巧

使用缓存

把不经常改变的放在前面,经常改动的放在后面

dockerignore