Docker基础篇 - (五)DockerFile

⑥ DockerFile

6.1 DockerFile介绍

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

构建步骤

1、 编写一个dockerfile文件

2、 docker build 构建称为一个镜像

3、 docker run运行镜像

4、 docker push发布镜像(DockerHub 、阿里云仓库)


在DockerHub中找一个镜像(centos为例)

在这里插入图片描述

点击后跳到一个Dockerfile

在这里插入图片描述

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以!

6.2 DockerFile构建过程

基础知识

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序

3、#表示注释

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

在这里插入图片描述

其中可写容器层为run启动后新增的一个镜像层

6.3 DockerFile的指令

FROM              # from:基础镜像,一切从这里开始构建
MAINTAINER        # maintainer:镜像是谁写的, 姓名+邮箱
RUN               # run:镜像构建的时候需要运行的命令
ADD               # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR           # workdir:镜像的工作目录
VOLUME            # volume:挂载的目录
EXPOSE            # expose:保留端口配置
CMD               # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD           # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
COPY              # copy:类似ADD,将我们文件拷贝到镜像中
ENV               # env:构建的时候设置环境变量!

在这里插入图片描述

6.4 实战测试

由DockerHub中查看到centos的dockerfile

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200504" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]

在这里插入图片描述

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

创建一个自己的centos

原生的centos镜像好多命令都不能用,自定义一个可以用vim,ifconfig的centos

在这里插入图片描述

# 1./home下新建dockerfile目录
[root@cVzhanshi home]# mkdir dockerfile

# 2. dockerfile目录下新建mydockerfile-centos文件
[root@cVzhanshi dockerfile]# vim mydockerfile-centos

# vim的内容
FROM centos                            		# 基础镜像是官方原生的centos
MAINTAINER cvzhanshi<cvzhanshi@qq.com>      # 作者
ENV MYPATH /usr/local                		# 配置环境变量的目录 
WORKDIR $MYPATH                       	    # 将工作目录设置为 MYPATH
RUN yum -y install vim                		# 给官方原生的centos 增加 vim指令
RUN yum -y install net-tools        		# 给官方原生的centos 增加 ifconfig命令
EXPOSE 80                            		# 暴露端口号为80
CMD echo $MYPATH                    		# 输出下 MYPATH 路径
CMD echo "-----end----"                
CMD /bin/bash                        		# 启动后进入 /bin/bash

# 4.通过这个文件构建镜像
# 命令: docker build -f 文件路径 -t 镜像名:[tag] .

# 5.出现如下语句说明构建成功
Successfully built 111bd8424a21
Successfully tagged mycentos:1.0

在这里插入图片描述

# 运行测试
[root@cVzhanshi dockerfile]# docker run -it mycentos:1.0

在这里插入图片描述

我们可以列出本地进行的变更历史

[root@cVzhanshi dockerfile]# docker history 111bd8424a21

在这里插入图片描述

我们平时拿到一个镜像,可以用 “docker history 镜像id” 研究一下是什么做的

CMD 和 ENTRYPOINT区别

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

测试CMD

# 编写dockerfile文件
[root@cVzhanshi dockerfile]# vim dockerfile-test-cmd
[root@cVzhanshi dockerfile]# cat dockerfile-test-cmd 
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@cVzhanshi dockerfile]# docker build -f dockerfile-test-cmd -t cmd-test:1.0 .

# 启动镜像   由结果可得,运行后就执行了 ls -a 命令
[root@cVzhanshi dockerfile]# docker run cmd-test:1.0 

在这里插入图片描述

# 想追加一个命令  -l 成为ls -al:展示列表详细数据 
# 重新启动镜像
[root@cVzhanshi dockerfile]# docker run cmd-test:1.0 -l
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.

# cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l  不是命令所以报错

测试ENTRYPOINT

# 编写dockerfile文件
[root@cVzhanshi dockerfile]# vim dockerfile-test-entrypoint
[root@cVzhanshi dockerfile]# cat dockerfile-test-entrypoint 
FROM centos
ENTRYPOINT ["ls","-a"]
[root@cVzhanshi dockerfile]# 

# 构建镜像
[root@cVzhanshi dockerfile]# docker build -f dockerfile-test-entrypoint -t entrypoint-test:1.0 .

# 启动镜像
[root@cVzhanshi dockerfile]# docker run 7bfbded97091

# 追加命令启动镜像
[root@cVzhanshi dockerfile]# docker run 7bfbded97091 -l

在这里插入图片描述


在这里插入图片描述

6.5 实战:Tomcat镜像

准备环境

准备tomcat 和 jdk 到当前目录,编写好README

在这里插入图片描述

编写dockerfile文件

FROM centos																# 基础镜像centos
MAINTAINER cvzhanshi<cvzhanshi@qq.com>									# 作者
COPY README.txt /usr/local/README.txt									# 复制README文件

ADD jdk-8u301-linux-x64.tar.gz /usr/local/								# 添加jdk,ADD 命令会自动解压
ADD apache-tomcat-9.0.50.tar.gz /usr/local/								# 添加tomcat,ADD 命令会自动解压
RUN yum -y install vim													# 安装 vim 命令
ENV MYPATH /usr/local													# 环境变量设置 工作目录
WORKDIR $MYPATH															# 色设置工作目录

ENV JAVA_HOME /usr/local/jdk1.8.0_301									# 环境变量: JAVA_HOME环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.50						 # 环境变量: tomcat环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.50

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin      # 设置环境变量 分隔符是:

EXPOSE 8080																 # 设置暴露的端口

CMD /usr/local/apache-tomcat-9.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/logs/catalina.out													# 设置默认命令

构建镜像

# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
[root@cVzhanshi tomcat-diy]#  docker build -t mytomcat:1.0 .

Successfully built 4636ac252f82
Successfully tagged mytomcat:1.0

启动镜像

[root@cVzhanshi tomcat-diy]# docker run -d -p 9090:8080 --name cvzhanshitomact -v /home/cvzhanshi/build/tomcat-diy/test:/usr/local/apache-tomcat-9.0.50/webapps/test -v /home/cvzhanshi/build/tomcat-diy/tomcatlogs:/usr/local/apache-tomcat-9.0.50/logs mytomcat:1.0

# 命令解释 
-d            # 后台运行
-p 9090:8080  # 把8080对外暴露成9090
--name        # cvzhanshitomcat 设置名字
-v /home/cvzhanshi/build/tomcat-diy/test:/usr/local/apache-tomcat-9.0.50/webapps/test  # 挂载目录
-v /home/cvzhanshi/build/tomcat-diy/tomcatlogs:/usr/local/apache-tomcat-9.0.50/logs    # 挂载目录

在这里插入图片描述

  • 在主机上查看挂在目录
    在这里插入图片描述

  • 测试tomcat

[root@cVzhanshi tomcat-diy]# curl localhost:9090

在这里插入图片描述

  • 在外面访问

在这里插入图片描述

在tomcat发布Hello world项目

由于做了卷挂载,我们直接在本地编写项目就可以发布

  • 直接在挂载的test文件夹下面创建index.html

内容如下

<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
    <body>
        Hello World!
    </body>
</html>

在这里插入图片描述

我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

6.6 发布自己的镜像

发布到Docker Hub

  • 地址 https://hub.docker.com/ ,进入创建账号
  • 确定这个账号可以登录
  • 登录 -> 发布
[root@cVzhanshi tomcat-diy]# 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@cVzhanshi tomcat-diy]# docker login -u cvzhanshi
Password: 
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
  • 发布

在这里插入图片描述

# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library
# 解决方法:
# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了
[root@cVzhanshi tomcat-diy]# docker build -t cvzhanshi/mytomcat:0.1 .
# 第二种 使用docker tag #然后再次push
[root@cVzhanshi tomcat-diy]# docker tag 容器id cvzhanshi/mytomcat:1.0 #然后再次push
[root@cVzhanshi tomcat-diy]# docker push cvzhanshi/diytomcat:1.0

在这里插入图片描述

发布到阿里云镜像上

  • 登录aliyun
  • 找到容器镜像服务
  • 创建命名空间

在这里插入图片描述

  • 创建容器镜像
    在这里插入图片描述

  • 点进镜像中会有详细的教程

在这里插入图片描述

  • 进行推送

在这里插入图片描述

  • 上传成功后查看阿里云的镜像层,发现,每一个镜像层就是我们的一条命令

在这里插入图片描述

6.7 小结

在这里插入图片描述

其中save和load是备份的命令,把镜像打包成tar

[root@cVzhanshi test]# docker save --help
Usage:  docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
  -o, --output string   Write to a file, instead of STDOUT # 打包存储的路径
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值