初试dockerfile

docker的commit镜像中我使用了方式一,现在使用dockerfile来构建docker镜像的构建文件!通过命令脚本!

  • 方式二:通过命令脚本 ```shell

    创建一个dockerfile文件,命名为dockerfile01

脚本内容

FROM centos

VOLUME [“volume01”,”volume02”]

CMD echo “——-end——-“

CMD /bin/bash

测试

[root@izbp1g2kp3kgefvmrhy0moz docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile01 -t wangzheng/centos:1.0 .

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21739648/1629429173836-a5593b06-e191-4d8c-8712-2acda2aa3ef9.png#align=left&display=inline&height=641&margin=%5Bobject%20Object%5D&name=image.png&originHeight=641&originWidth=1694&size=108969&status=done&style=none&width=1694)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21739648/1629429305397-e4d6f727-30c4-4dab-b188-7b71f40da1b7.png#align=left&display=inline&height=81&margin=%5Bobject%20Object%5D&name=image.png&originHeight=81&originWidth=1521&size=17414&status=done&style=none&width=1521)<br />查看挂载卷位置:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21739648/1629429676480-3d3cdfe4-418f-4d12-b622-fd4927ad0c10.png#align=left&display=inline&height=554&margin=%5Bobject%20Object%5D&name=image.png&originHeight=554&originWidth=1294&size=60835&status=done&style=none&width=1294)<br />我们 通常需要用这种方式来构建自己的解析,。。注意:如果用带有挂载盘的镜像,开启两个容器,两个挂在盘的位置不是同一个文件<br />如果构建镜像的时候没有挂载卷。我需要手动挂载 -v 卷名:容器内路径!!
  2. <a name="VZhvD"></a>
  3. ## 学习dockerfile
  4. dockerfile是用来构建docker镜像的文件!这一过程通过命令参数脚本来实现,<br />构建步骤:<br />1、编写dockerfile文件<br />2docker build 构建一个镜像<br />3docker run 运行镜像<br />4docker push 发布镜像(dockerhub、阿里云镜像仓库)
  5. <a name="8i1Rx"></a>
  6. ### dockerfile的构建过程
  7. - **基础知识**
  8. 1、每个指令必须大写<br />2、从上到下依次执行<br />3、# 表示注释<br />4、每个指令都会创建一个新的镜像层。
  9. - **步骤**
  10. 1dockerfile 构建文件,源代码<br />2dockerimage 最终的镜像文件、<br />3docker容器,可运行的docker容器
  11. <a name="Q7jgY"></a>
  12. ### docker指令
  13. ```shell
  14. FROM # 基础镜像
  15. MAINTALNER # 指明作者:名字+邮箱
  16. RUN # 镜像构建的时候需要运行的命令
  17. ADD # 步骤:Tomcat镜像 ,添加Tomcat这个压缩包
  18. COPY # 类似ADD,将我们的文件拷贝到构建的镜像中
  19. WORKDIR # 镜像工作目录
  20. VOLUME # 挂载目录
  21. EXPOSE # 暴露的端口
  22. CMD # 指定容器运行时,执行的指令,,,,注:只有最后一个才生效,可被代替
  23. ENTRYPOINT # 指定容器运行时,执行的指令,,,,可追加命令
  24. ONBUILD # 当构建一个被继承 dockerfile 这个时候会运行ONBUILD 指令,触发指令
  25. ENV # 构建时设置环境变量

image.png
拓展:
CMD和ENTRYPOINT的区别:
CMD:

  1. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# vi dockerfile-cmd
  2. # dockerfile内容
  3. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# cat dockerfile-cmd
  4. FROM centos
  5. CMD ["ls","-a"]
  6. # 构建镜像
  7. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker build -f dockerfile-cmd -t mycentos:0.1 .
  8. Sending build context to Docker daemon 2.048kB
  9. Step 1/2 : FROM centos
  10. ---> 300e315adb2f
  11. Step 2/2 : CMD ["ls","-a"]
  12. ---> Running in b59ef77d6e78
  13. Removing intermediate container b59ef77d6e78
  14. ---> c55ecb39944b
  15. Successfully built c55ecb39944b
  16. Successfully tagged mycentos:0.1
  17. # 运行镜像,执行cmd
  18. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker run -it c55ecb39944b
  19. . .dockerenv dev home lib64 media opt root sbin sys usr
  20. .. bin etc lib lost+found mnt proc run srv tmp var
  21. # 追加参数,报错
  22. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker run -it c55ecb39944b -l
  23. 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.
  24. # 追加命令。。原cmd失效
  25. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker run -it c55ecb39944b ls -l
  26. total 48
  27. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  28. drwxr-xr-x 5 root root 360 Aug 20 05:12 dev
  29. drwxr-xr-x 1 root root 4096 Aug 20 05:12 etc
  30. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  31. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  32. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  33. drwx------ 2 root root 4096 Dec 4 2020 lost+found
  34. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  35. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  36. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  37. dr-xr-xr-x 121 root root 0 Aug 20 05:12 proc
  38. dr-xr-x--- 2 root root 4096 Dec 4 2020 root
  39. drwxr-xr-x 11 root root 4096 Dec 4 2020 run
  40. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  41. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  42. dr-xr-xr-x 13 root root 0 Aug 20 05:12 sys
  43. drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
  44. drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
  45. drwxr-xr-x 20 root root 4096 Dec 4 2020 var

ENTERYPOINT:

  1. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# vi docker-enterypoint
  2. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# cat docker-enterypoint
  3. FROM centos
  4. ENTRYPOINT ["ls","-a"]
  5. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker build -f docker-enterypoint -t mycentos:0.1 .
  6. Sending build context to Docker daemon 3.072kB
  7. Step 1/2 : FROM centos
  8. ---> 300e315adb2f
  9. Step 2/2 : ENTRYPOINT ["ls","-a"]
  10. ---> Running in 1e268259b3da
  11. Removing intermediate container 1e268259b3da
  12. ---> c1164bcef3f5
  13. Successfully built c1164bcef3f5
  14. Successfully tagged mycentos:0.1
  15. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker run -it c1164bcef3f5
  16. . .dockerenv dev home lib64 media opt root sbin sys usr
  17. .. bin etc lib lost+found mnt proc run srv tmp var
  18. # 发现命令可以追加
  19. [root@izbp1g2kp3kgefvmrhy0moz mystudy]# docker run -it c1164bcef3f5 -l
  20. total 56
  21. drwxr-xr-x 1 root root 4096 Aug 20 05:23 .
  22. drwxr-xr-x 1 root root 4096 Aug 20 05:23 ..
  23. -rwxr-xr-x 1 root root 0 Aug 20 05:23 .dockerenv
  24. lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
  25. drwxr-xr-x 5 root root 360 Aug 20 05:23 dev
  26. drwxr-xr-x 1 root root 4096 Aug 20 05:23 etc
  27. drwxr-xr-x 2 root root 4096 Nov 3 2020 home
  28. lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
  29. lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
  30. drwx------ 2 root root 4096 Dec 4 2020 lost+found
  31. drwxr-xr-x 2 root root 4096 Nov 3 2020 media
  32. drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
  33. drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
  34. dr-xr-xr-x 121 root root 0 Aug 20 05:23 proc
  35. dr-xr-x--- 2 root root 4096 Dec 4 2020 root
  36. drwxr-xr-x 11 root root 4096 Dec 4 2020 run
  37. lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
  38. drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
  39. dr-xr-xr-x 13 root root 0 Aug 20 05:23 sys
  40. drwxrwxrwt 7 root root 4096 Dec 4 2020 tmp
  41. drwxr-xr-x 12 root root 4096 Dec 4 2020 usr
  42. drwxr-xr-x 20 root root 4096 Dec 4 2020 var

实战测试:自己创建Tomcat镜像

1、准备镜像文件 Tomcat 压缩包,jdk的压缩包
下载好的两个压缩包

2、编写dockerfile 文件,官方命名:Dockerfile,build会自动寻找这个文件,不需要-f 指定

  1. FROM centos
  2. MAINTAINER wanghzeng<2021698104@qq.com>
  3. COPY readme.txt /usr/local/readme.txt
  4. ADD jdk.. /usr/local
  5. ADD tomcat... /usr/local
  6. # 下载vim
  7. RUN yum -y install vim
  8. ENV MYPATH /usr/local
  9. WORKDIR $MYPATH
  10. # 配置环境变量
  11. ENV JAVA_HOME /usr/local/jdk
  12. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:JAAVA_HOME/lib/tools.jar
  13. ENV CATALINA_HOME /usr/local/tomcat
  14. ENV CATALINA_BASH /usr/local/tomcat
  15. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin
  16. # 暴露端口
  17. EXPOSE 8080
  18. # 运行Tomcat 并打印日志
  19. CMD /usr/local/tomcat/bin/staeruo.sh && tail -F /usr/local/tomcat/bin/logs/catalina.out

3、构建镜像

  1. docker build -t mytomcat

4、启动镜像

  1. docker run -it --name tomcat01 -p 8080:8080 -v /home/wangzheng/build/tomcat/test:/usr/local/tomcat/webapps/test -v /home/wangzheng/build/tomcat/tomcatlogs/:/usr/local/tomcat/logs mytomcat

5、测试访问
6、发布项目

发布镜像

Docker Hub

  1. 1、登录
  2. docker login -u 账号 -p 密码
  3. 2、提交镜像
  4. docker push wangzheng/镜像名
  5. # 可能出现的问题
  6. 尽量带上版本号

发阿里云镜像服务上

  1. 1. 登录阿里云Docker Registry
  2. $ docker login --username=tpt11fb registry.cn-hangzhou.aliyuncs.com
  3. 2. Registry中拉取镜像
  4. $ docker pull registry.cn-hangzhou.aliyuncs.com/wangzheng-study/test:[镜像版本号]
  5. 3. 将镜像推送到Registry
  6. $ docker push registry.cn-hangzhou.aliyuncs.com/wangzheng-study/test:[镜像版本号]

image.png