DockerFile

DockerFile 介绍

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

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

DockerFile

DockerFile

很多官方镜像都是基础包,很多功能都没有,我们需要自己构建自己的镜像。

DockerFile 构建过程

  • 基础知识
1.每个保留关键字(指令)必须是大写字母
2.执行从上到下
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层,并提交!

DockerFile

DockerFile是面向开发的,我们以后要发布项目,做镜像都需要编写dockerfile文件,这个文件十分简单!
Docker 镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维。。。缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码

DockerImage:通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar war

Docker容器:容器就是镜像运行起来,提供服务

DockerFile 的指令

以前是使用别人的,现在我们知道这些指令之后,可以自己构建镜像。

FROM          # 基础镜像,一切从这里开始构建
MAINTAINER    # 镜像是谁写的,姓名+邮箱
RUN           # 镜像构建的时候需要运行的命令
ADD           # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR       # 镜像的工作目录(目录是否存在都行,会自动创建,绝对相对路径都行)
VOLUME        # 挂载目录
EXPOSE        # 保留端口配置(只是给使用者看,不会影响 docker -p)
CMD           # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代,一般用来给 entrypoint 传递参数
ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令,一般写一个容器固定的指令,cmd 和 entrypoint 配合使用的时候必须使用 json 数组的语法,多个 entrypoint 只有最后一个会生效
ONBUILD       # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,出发指令。
COPY          # 类似ADD,将我们的文件拷贝到镜像中。但是COPY不会自动解压
ENV           # 构建的时候设置环境变量

DockerFile

Dockerfile 示例

FROM centos:latest
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum clean all && yum makecache
RUN yum update -y
RUN yum -y install vim
#RUN ["yum","-y","install","vim"]
# 这个命令仅仅是声明当前容器中的服务端口
EXPOSE 8081
# 不止可以指定进入容器的默认路径,还可以为 RUNCMDENTRYPOINTCOPYADD指定设置工作目录,不存在的目录会被1创建
ENV BASE_PATH=/apps/data
WORKDIR $BASE_PATH
# 将宿主机中上下文中的test.txt文件拷贝到 /apps/data 目录下
# ADD test.txt .
# ADDCOPY 区别在于,除了将文件拷贝到容器内部的功能,ADD还能处理url以及解压tar包
ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.63/bin/apache-tomcat-9.0.63.tar.gz .
RUN tar -zxvf apache-tomcat-9.0.63.tar.gz -C .
RUN rm -f apache-tomcat-9.0.63.tar.gz
COPY test.txt .
# 这里仅仅是一个声明,告诉使用者容器中可以挂在这个目录到宿主机中
VOLUME $BASE_PATH
# json 数组支持传参,即在启动容器时 docker run 镜像:版本号 覆盖自定义的命令
# CMD ["ls",$BASE_PATH]
# entrypoint 覆盖命令为 docker run --entrypoint=覆盖的指令 镜像:版本号 传递的参数
# docker run --entrypoint=sh mycentos:1.0 -c "ls /"
# ENTRYPOINT ls $BASE_PATH
# ENTRYPOINT ["sh","-c","ls $BASE_PATH"]
# 一般ENTRYPOINTCMD 配合使用
ENTRYPOINT ["ls"]
CMD ["/apps/data"]

实战测试

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

DockerFile

创建一个自己的 CentOS

  • 1.编写Dockerfile文件
FROM centos
MAINTAINER hudu<2591786734@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash

DockerFile

  • 2.通过这个文件构建镜像
# docker bulid  -f dockerfile文件路径 -t 镜像名:[tag]
$ docker build -f ~/File/dockerfile/mydockerfile -t mycentos:1.0 .

DockerFile

DockerFile

  • 3.测试运行

DockerFile

对比:之前的原生的 CentOS

DockerFile

我们可以列出本地镜像的变更历史

$ docker history 镜像id

DockerFile

我们平时拿到一个镜像,可以了解一下它是怎么做的

CMD 和 ENTRYPOINT 的区别

CMD           # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代
ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令
  • 1.测试 CMD 编写一个dockerfile文件
FROM centos
CMD ["ls","-a"]
  • 2.编译镜像
$ docker build -f ~/File/dockerfile/dockerfile-cmd-test -t cmdtest .

# 运行容器测试
$ docker run cmdtest

DockerFile

# 想追加命令,形成 ls -al,发现报错
$ docker run cmdtest -l

DockerFile

解释:cmd的情况下-l替换了 CMD ["ls","-a"]命令,-l不是命令,所以报错!

# 所以使用
$ docker run cmdtest ls -al

DockerFile

  • 测试 ENTRYPOINT
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker build -f dockerfile文件 -t 构建镜像文件名 目标目录

我们的追加命令是直接拼接在原来的命令之后的。
DockerFile

实战:Tomcat 镜像

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

DockerFile

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

FROM centos
MAINTAINER hudu<2591786734@qq.com>

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

ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.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_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

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

3.构建镜像

$ docker build -t diytomcat:1.0 .

DockerFile

DockerFile

4.启动容器

$ docker run -d -p 9090:8080 --name hudutomcat -v ~/File/build/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v ~/File/build/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs diytomcat:1.0

DockerFile

5.访问测试

DockerFile

6.发布项目

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

目录结构

DockerFile

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">

  </web-app>

index.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
System.out.println("---my test web logs---");
%>
</body>
</html>

最终发布效果

DockerFile

查看一下日志文件,看到日志打印

DockerFile

发现项目部署成功,开发步骤,需要掌握Dockerfile的编写,我们之后的一切都是使用docker镜像来运行发布的。

发布自己的镜像

DockerHub

1、地址 hub.docker.com/ 注册自己的账号
2、在我们服务器上提交自己的镜像

$ 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
$ docker login -u 用户名

DockerFile

3、登陆完毕之后就可以提交镜像了,就是一步docker push

$ docker push hudu/diytomcat[:tag]

常见问题:

The push refers to repository [docker.io/hudu/diytomcat]
An image does not exist locally with the tag: hudu/diytomcat

DockerFile
解决办法:给镜像增加tag

# docker tag 镜像id 镜像名:...
$ docker tag 226dd335e7db sakuraso/tomcat:1.0

这里要注意,镜像前面要和自己的账号名保持一致。

DockerFile

发现可以上传了,提交的时候也是按照镜像的层级来提交的。

DockerFile

发布到阿里云镜像服务上

1、登陆阿里云
2、找到容器镜像服务
3、创建命名空间

DockerFile

4、创建容器镜像

DockerFile

DockerFile

DockerFile

登陆

$ docker login --username=樱花庄rwby registry.cn-shanghai.aliyuncs.com

DockerFile

$ docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/sakuraso/hudu-test:[镜像版本号]

$ docker push registry.cn-shanghai.aliyuncs.com/sakuraso/hudu-test:[镜像版本号]

DockerFile

DockerFile

DockerFile

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
247
粉丝
18
喜欢
217
收藏
62
排名:731
访问:9753
私信
所有博文
社区赞助商