GVKun编程网logo

【Application】Docker DockerFile解析(五)(dockerfile详解)

26

本文将为您提供关于【Application】DockerDockerFile解析的详细介绍,我们还将为您解释五的相关知识,同时,我们还将为您提供关于DockerCLI实战指南:从基础命令到Docker

本文将为您提供关于【Application】Docker DockerFile解析的详细介绍,我们还将为您解释的相关知识,同时,我们还将为您提供关于Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、docker daemon 端口冲Failed to start Docker Application Container Engine. -- Subject: Unit docker.servic、docker 入门到实战(六)dockerFile解析、Dockerfile 说明 (Dockerfile Instructions)的实用信息。

本文目录一览:

【Application】Docker DockerFile解析(五)(dockerfile详解)

【Application】Docker DockerFile解析(五)(dockerfile详解)

DockerFile介绍

  DockerFile是用来构建Docker镜像文件,是由一系列命令和参数构成的脚步

  在docker hub 上搜索并查看centos的DockerFile如下:

    

  DockerFile基础知识

  1、每条保留字指令都必须为大写字幕且后面要跟随至少一个参数  

  2、指令按照从上到下,顺序执行

  3、#表示注释

  4、每条指令都会创建一个新的镜像层,并对镜像进行提交

  DockerFile构建过程

  1、docker从基础镜像运行一个容器

  2、执行一条指令并对容器作出修改

  3、执行类似docker commit的操作提交一个新的镜像层

  4、docker再基于刚提交的镜像运行一个新容器

  5、执行dockerfile中的下一条指令直到所有指令都执行完成

  案例:

    可以参考【Application】Docker 容器数据卷(四)中,添加容器数据卷的方式二:使用DockerFile添加,此过程对比DockerFIle的构建过程

DockerFile保留字

  1、FROM

    基础镜像,当前新镜像是基于那个镜像的

  2、MAINTAINER

    镜像维护者的姓名和邮箱地址

  3、RUN

    容器构建时需要运行的命令

  4、EXPOSE

    当前容器对外暴露一个端口

  5、WORKDIR

    指定再创建容器后,终端默认登录进来的工作目录

  6、ENV

    用来在构建镜像过程中设置环境变量

  7、ADD

    将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

  8、COPY

    类似ADD,拷贝文件的目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

    用法一:COPY src dest

    用法二:COPY ["src", "dest"]

  9、VOLUME

    容器数据卷,用于数据保存和持久化工作

  10、CMD

    指定一个容器启动时要运行的命令

    Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

  11、ENTRYPOINT

    指定一个容器启动时要运行的命令

    ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

  12、ONBUILD

    当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

  A案例-Base镜像(scratch)

    Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

1 FROM scratch

  B案例-自定义镜像mycentos

    1、编写DockerFile文件

 1 # 基础镜像 centos镜像
 2 FROM centos
 3 
 4 # 镜像维护者的姓名和邮箱地址
 5 MAINTAINER H__D<H__D@163.com>
 6 
 7 # 环境变量
 8 ENV MYPATH /usr/local
 9 
10 # 工作目录
11 WORKDIR $MYPATH
12 
13 # 构建时运行安装vim命令
14 RUN yum -y install vim
15 
16 # 构建时运行安装net-tools
17 RUN yum -y install net-tools
18 
19 # 当前容器对外暴露一个端口
20 EXPOSE 80
21 
22 # 启动时运行命令
23 CMD echo $MYPATH
24 
25 CMD echo "build success .............."
26 
27 CMD /bin/bash 

    2、构建

      命令格式:docker build -t 新镜像名字:TAG .

      命令:docker build -f dockerfile2 -t test/mycentos:1.2 .

      

      

    3、运行

      命令格式:docker run -it 新镜像名字:TAG

      命令:docker run -it test/mycentos:1.2

      

    4、列出镜像的变更历史

      命令格式:docker history 镜像名:TAG

      命令:docker history test/mycentos:1.2

      

  C案例-CMD/ENTRYPOINT镜像案例

    都是指定一个容器启动时要运行的命令

    1、CMD:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

      1)新建一个dockerfile4,内容如下:

1 # 基础镜像 centos镜像
2 FROM centos
3 
4 # 启动时运行命令 
5 CMD ["/bin/echo", "Hello"]
View Code

      2)通过dockerfile4,构建test/mycmd镜像

        命令:docker build -f dockerfile4 -t test/mycmd .

      3)测试

        命令:docker run -it test/mycmd

        命令:docker run -it test/mycmd /bin/echo "ABC"

        

    2、ENTRYPOINT:可以追加参数

      1)新建一个dockerfile3,内容如下:

 1 # 基础镜像 centos镜像
 2 FROM centos
 3 
 4 # 启动时运行命令 
 5 ENTRYPOINT ["/bin/echo", "Hello"]  
 6 
 7 # docker run -it [image] 运行后输出 
 8 # hello world
 9 # docker run -it [image] "命令行" 运行后输出
10 # hello 命令行
View Code

      2)通过dockerfile3,构建test/myentrypoint镜像

        命令:docker build -f dockerfile3 -t test/myentrypoint .

      3)测试

        命令:docker run -it test/myentrypoint

        命令:docker run -it test/myentrypoint "ABC"

        

  D案例-ONBUILD

    ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

    1、新建一个dockerfile5文件,内容如下:

1 # 基础镜像 centos镜像
2 FROM centos
3 
4 # 被子镜像触发
5 ONBUILD RUN echo "now, build action is ok .............."
6 
7 # 启动时运行命令
8 CMD ["/bin/bash"]

    2、通过dockerfile5构建test/mycentos:1.5镜像

      命令:docker build -f dockerfile5 -t test/mycentos:1.5 .

    3、新建一个dockerfile6文件,基础镜像是test/mycentos:1.5,内容如下:

1 # 基础镜像 centos镜像
2 FROM test/mycentos:1.5
3 
4 # 启动时运行命令
5 CMD ["/bin/bash"] 

    4、通过dockerfile6构建test/mycentos:1.6镜像

      命令:docker build -f dockerfile6 -t test/mycentos:1.6 .

    

    通过观察,可以看到ONBUILD命令的作用

  E案例-自定义镜像Tomcat9

    1、新建一个dockerfile9文件,内容如下:

 1 # 基础镜像 centos镜像
 2 FROM test/mycentos:1.5
 3 
 4 # 被子镜像触发
 5 ONBUILD RUN echo "now, build action is ok .............."
 6 
 7 # 启动时运行命令
 8 CMD ["/bin/bash"]
 9 
10 
11 # 基础镜像 centos镜像
12 FROM centos
13 
14 # 启动时运行命令 
15 ENTRYPOINT ["/bin/echo", "Hello"]  
16 CMD ["world"]
17 
18 #  docker run -it [image] 运行后输出 
19 # hello world
20 # docker run -it [image] "命令行" 运行后输出
21 # hello 命令行
22 
23 
24 # 基础镜像 centos镜像
25 FROM centos
26 
27 # 镜像维护者的姓名和邮箱地址
28 MAINTAINER H__D<H__D@163.com>
29 
30 # 把宿主机当前上下文中的c.txt拷贝到容器/usr/local/路径下
31 COPY c.txt /usr/local/container.txt
32 
33 # 把java与tomcat添加到容器中
34 ADD jdk-8u181-linux-x64.tar.gz /usr/local/
35 ADD apache-tomcat-9.0.12.tar.gz /usr/local/
36 
37 # 配置java与tomcat环境变量
38 ENV JAVA_HOME /usr/local/jdk1.8.0_181
39 ENV JRE_HOME $JAVA_HOME/jre 
40 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib 
41 ENV PATH $JAVA_HOME/bin:$PATH
42 
43 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.12
44 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.12
45 ENV PATH $CATALINA_HOME/bin:$PATH
46 
47 # 环境变量
48 ENV MYPATH /usr/local
49 
50 # 工作目录
51 WORKDIR $MYPATH
52 
53 # 构建时运行安装vim命令
54 RUN yum -y install vim
55 
56 # 构建时运行安装net-tools
57 RUN yum -y install net-tools
58 
59 # 当前容器对外暴露一个端口
60 EXPOSE 8080
61 
62 # 启动时运行命令
63 # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.12/bin/startup.sh"]
64 # CMD ["/usr/local/apache-tomcat-9.0.12/bin/catalina.sh", "run"]
65 CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out
View Code

    2、通过dockerfile9构建test/mytomcat:2.0镜像

      命令:docker build -f dockerfile9 -t test/mytomcat:2.0 .

    3、测试,启动镜像:

      命令:docker run -it -p 8080:8080 test/mytomcat:2.0

  

Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

Docker 学习路线 11:Docker命令行

Docker CLI (命令行界面) 是一个强大的工具,可让您与 Docker 容器、映像、卷和网络进行交互和管理。它为用户提供了广泛的命令,用于在其开发和生产工作流中创建、运行和管理 Docker 容器和其他 Docker 资源。

安装

要开始使用 Docker CLI,您需要在计算机上安装 Docker。您可以从 Docker 文档的官方安装指南中按照您所使用的操作系统进行安装。

基本命令

以下是一些基本的 Docker CLI 命令,供您熟悉:

  • docker run:从 Docker 映像创建并启动容器
  • docker container:列出正在运行的容器
  • docker image:列出系统中所有可用的映像
  • docker pull:从 Docker Hub 或其他注册表拉取映像
  • docker push:将映像推送到 Docker Hub 或其他注册表
  • docker build:从 Dockerfile 构建映像
  • docker exec:在正在运行的容器中运行命令
  • docker logs:显示容器的日志

Docker Run 选项

docker run 是 Docker CLI 中最重要的命令之一。您可以使用各种选项自定义容器的行为,例如:

  • d, --detach:在后台运行容器
  • e, --env:为容器设置环境变量
  • v, --volume:绑定挂载卷
  • p, --publish:将容器的端口发布到主机
  • name:为容器指定名称
  • restart:指定容器的重启策略
  • rm:容器退出时自动删除容器

Dockerfile

Dockerfile 是一个包含构建 Docker 映像的指令的脚本。您可以使用 Docker CLI 使用 Dockerfile 构建、更新和管理 Docker 映像。

以下是 Dockerfile 的一个简单示例:

# Set the base image to use
FROM alpine:3.7
# Update the system and install packages
RUN apk update && apk add curl
# Set the working directory
WORKDIR /app
# Copy the application file
COPY app.sh .
# Set the entry point
ENTRYPOINT ["./app.sh"]

要构建映像,请使用以下命令:

docker build -t my-image .

Docker Compose

Docker Compose 是一个 CLI 工具,用于使用 YAML 文件定义和管理多容器 Docker 应用程序。它与 Docker CLI 协作,提供了一种一致的方式来管理多个容器及其依赖项。

使用官方的安装指南安装 Docker Compose,然后您可以创建一个 docker-compose.yml 文件来定义和运行多容器应用程序:

version: ''3''
services:  
web:    
image: webapp-image    
ports:      - "80:80"  
database:    
image: mysql    
environment:      - MYSQL_ROOT_PASSWORD=my-secret-pw

使用以下命令运行应用程序:

docker-compose up

总之,Docker CLI 是管理 Docker 容器和资源的强大而多才多艺的工具。一旦熟悉其命令和功能,您将能够轻松开发、维护和部署使用 Docker 的应用程序。

Docker镜像

Docker镜像是一种轻量级、独立、可执行的软件包,其包含了运行应用程序所需的所有组件。这些组件包括:依赖项、库、运行时、系统工具和代码等,以确保应用程序在不同的环境中可以保持一致地运行。

Docker镜像是使用Dockerfile进行构建和管理的。Dockerfile是一个包含了创建Docker镜像所需指令的脚本,提供了一个逐步设置应用程序环境的指南。

使用Docker镜像

Docker CLI提供了多个命令来管理和使用Docker镜像。其中一些重要的命令包括:

  • docker image ls:列出本地系统上所有可用的镜像。
  • docker build:从Dockerfile构建镜像。
  • docker image rm:删除一个或多个镜像。
  • docker pull:从注册表(如Docker Hub)将镜像拉到本地系统。
  • docker push:将镜像推送到仓库。

例如,要从Docker Hub拉取官方的Ubuntu镜像,可以运行以下命令:

docker pull ubuntu:latest

拉取镜像后,可以使用docker run命令创建和运行一个使用该镜像的容器:

docker run -it ubuntu:latest /bin/bash

这个命令将创建一个新的容器,并使用**/bin/bash** shell在容器内启动一个交互式会话。

共享镜像

Docker镜像可以使用容器注册表(如Docker Hub、Google Container Registry或Amazon Elastic Container Registry(ECR))共享和分发。一旦将您的镜像推送到注册表中,其他人就可以轻松地访问和使用它们。

要共享您的镜像,您首先需要使用适当的命名格式对其进行标记:

docker tag <image-id> <username>/<repository>:<tag>

然后,您可以使用以下命令将标记的镜像推送到注册表中:

docker push <username>/<repository>:<tag>

总之,Docker镜像是Docker生态系统中不可或缺的一部分,允许开发人员打包其应用程序、轻松地共享它们,并在不同的环境中确保一致性。通过理解Docker镜像和管理它们的命令,您可以利用容器化的力量,增强您的开发工作流程。在您的开发过程中使用Docker镜像可以大大提高开发效率,减少开发过程中的问题,让您能够更好地专注于应用程序的核心开发。

容器

容器可以被视为轻量级的、独立的可执行软件包,包括运行所需的所有东西,包括代码、运行时、库、环境变量和配置文件。容器将软件与其环境隔离开来,确保其在不同环境下工作一致。

为什么使用容器?

  • 可移植性:容器确保应用程序在不同平台上一致工作,无论是开发人员的笔记本电脑还是生产服务器。这消除了“它在我的机器上运行”的问题。
  • 效率:容器很轻量级,因为它们使用共享资源,没有完整操作系统的开销。这使得启动时间更快,减少资源使用。
  • 可扩展性:容器可以根据工作量轻松地进行缩放,因此非常适合分布式应用程序和微服务。
  • 一致性:容器使得开发人员、QA 和运维团队在整个应用程序生命周期中拥有一致的环境,从而加快了部署流程。
  • 安全性:容器提供了一定程度的隔离,使其与其他容器和底层主机系统隔离开来,有助于维护应用程序的安全性。

使用 Docker CLI 工作

Docker CLI 提供了多个命令,可帮助您创建、管理和与容器交互。一些常用命令包括:

  • docker run:用于创建和启动新容器。
  • docker container ls:列出运行中的容器。
  • docker container stop:停止运行中的容器。
  • docker container rm:删除已停止的容器。
  • docker exec:在运行中的容器中执行命令。
  • docker logs:获取容器的日志,有助于调试问题。

Docker卷

Docker卷是一种用于存储Docker容器生成和使用的数据的机制。它们允许您将数据与容器本身分开,从而轻松备份、迁移和管理持久性数据。

卷的重要性

Docker容器本质上是暂时的,这意味着它们可以轻松地停止、删除或替换。尽管这对应用程序开发和部署非常有利,但处理持久性数据时会带来挑战。这就是卷的作用。它们提供了一种将数据存储和管理与容器的生命周期分开的方法。

卷的类型

Docker中有三种类型的卷:

  • 主机卷:它们存储在主机机器的文件系统中,通常位于/var/lib/docker/volumes目录中。这些可以很容易地访问,但可能会带来可移植性或文件系统兼容性问题。
  • 匿名卷:这些是在运行容器时没有指定卷时自动生成的。它们的ID由Docker生成,也存储在主机机器的文件系统中。
  • 命名卷:与匿名卷类似,命名卷也存储在主机机器的文件系统中。但是,您可以提供自定义名称,这样在其他容器中引用或备份时更容易。

使用Docker CLI管理卷

Docker CLI提供了各种命令来管理卷:

  • docker volume create: 使用给定的名称创建新卷。
  • docker volume ls: 列出系统中的所有卷。
  • docker volume inspect: 提供有关特定卷的详细信息。
  • docker volume rm: 删除卷。
  • docker volume prune: 删除所有未使用的卷。

要在容器中使用卷,可以在docker run命令期间使用-v--volume标志。例如:

docker run -d --name my-container -v my-named-volume:/var/lib/data my-image

此命令使用“my-image”映像创建一个名为“my-container”的新容器,并在容器内部将“my-named-volume”卷挂载到/var/lib/data路径。

Docker 网络

Docker 网络提供了管理容器通信的重要方法。它允许容器使用各种网络驱动程序相互通信并与主机机器通信。通过理解和利用不同类型的网络驱动程序,您可以设计容器网络以适应特定的场景或应用程序需求。

网络驱动程序

Docker 中有几个可用的网络驱动程序。这里,我们将介绍四个最常见的驱动程序:

  • bridge:容器的默认网络驱动程序。它创建了一个私有网络,容器可以相互通信并与主机机器通信。在此网络上的容器可以通过主机网络访问外部资源。
  • host:该驱动程序取消了网络隔离并允许容器共享主机的网络。在网络性能至关重要的情况下,它非常有用,因为它最小化了容器网络的开销。
  • none:该网络驱动程序禁用容器网络。使用此驱动程序的容器在没有任何网络访问的隔离环境下运行。
  • overlay:该网络驱动程序使部署在不同主机上的容器能够相互通信。它专为 Docker Swarm 设计,并且非常适合多主机或基于集群的容器部署。

管理 Docker 网络

Docker CLI 提供了各种命令来管理网络。以下是一些有用的命令:

  • 列出所有网络:docker network ls
  • 检查网络:docker network inspect <network_name>
  • 创建新网络:docker network create --driver <driver_type> <network_name>
  • 将容器连接到网络:docker network connect <network_name> <container_name>
  • 将容器与网络断开连接:docker network disconnect <network_name> <container_name>
  • 删除网络:docker network rm <network_name>

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

docker daemon 端口冲Failed to start Docker Application Container Engine. -- Subject: Unit docker.servic

docker daemon 端口冲Failed to start Docker Application Container Engine. -- Subject: Unit docker.servic

Failed to start Docker Application Container Engine.
– Subject: Unit docker.service has Failed
– Defined-By: systemd
– Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

– Unit docker.service has Failed.

– The result is Failed.


原因有很多
我的是这样的:
我stop 了其它的容器,新建了一个容器,用了一端口,而没注意到这个端口与其它容器端口是一样的,

后来,我要修改端口映射,去container目录下改hostconfig 之前 ,停止了docker 服务。

改了之后,启动服务。
由于之前的容器,是restart=always 。所以启动的时候,那两个冲突容器也启动了。所以失败。

解决:
备份,》删除 。
logs没有什么信息systemctl status docker journalctl -xe也没有什么信息

docker ps 卡住,???好像是启动了,但。。。
使用dockerd

Failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid

有进程了?》删除 kill -9 pid
再dockerd
Error (Unable to complete atomic operation, key modified) deleting object [endpoint d14ea1a4
无法原子操作。
docker ps有东西了。
start 冲突的容器。出现了bind: address already in use。。结下来,要么删除容器,要么,再去改hostconifg来一遍。

docker 入门到实战(六)dockerFile解析

docker 入门到实战(六)dockerFile解析

本篇来自于尚硅谷周阳老师 https://www.bilibili.com/vide...
上一篇:docker 入门到实战(五)docker容器数据卷

六:dockerFile解析

下载3.png

6.1 dockerFile是什么

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

6.1.1 cenos7 Dockerfile文件

image.png

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="20191001"
CMD ["bin/bash"]

6.1.2 构建步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run

6.2 dockerFile构建过程解析

6.2.1 Dockerfile内容基础知识
  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
6.2.2 Docker执行Dockerfile的大致流程
  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成
6.2.3 小总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  •  Dockerfile是软件的原材料
  •  Docker镜像是软件的交付品
  •  Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

 

  1. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

 

  1. Docker容器,容器是直接提供服务的。

6.3 DockerFile体系结构(保留字指令)

保留字 描述
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量 (k,v)形式
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 (k,v)形式和json格式都可以
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令(Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换)
ENTRYPOINT 指定一个容器启动时要运行的命令 (ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数)
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

下载.png

6.4 案例

6.4.1 base镜像(scratch)

几乎99%的镜像都来自于这个基础的镜像

image.png

6.4.2 自定义镜像
6.4.2.1 编写

默认centos只有很基础的命令 vim , ip addr都没有
编写一个基于centos的镜像 并且有编辑和查看ip的功能

FROM centos
MAINTAINER rem
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vin
RUN yum -y install net-tools

EXPOSE 80

CMD echo "finished,---successfully"
CMD /bin/bash
6.4.2.2 构建
docker build [OPTIONS] PATH | URL | -

[OPTIONS] 选项

-f :指定要使用的Dockerfile路径;
--tag, -t:镜像的名字及标签
. :表示当前文件夹

Dockerfile文件

FROM centos
MAINTAINER rem
ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD echo "finished,---successfully"
CMD /bin/bash

image.png

6.4.2.3 运行

可以看到 vi命令和 ip addr命令可以使用了
image.png

6.4.3 查看镜像
docker history [OPTIONS] IMAGE

image.png

6.4.4 自定义tomcat9镜像
6.4.4.1 准备环境

新建一个目录dockerfile
再在下面建一个测试文件
拷贝jdk和tomcat到目录中

image.png

新建挂载目录
image.png

Dockerfile文件

FROM centos
MAINTAINER  rem
#把宿主机当前上下文的test.txt拷贝到容器/usr/local/路径下
COPY test.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.33.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.33/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.33/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tom
6.4.4.2 构建镜像

image.png

6.4.4.3 发布容器

image.png

docker run -di -p 9090:8080 --name mytomcat9 -v /root/dockerfile/test:/usr/local/apache-tomcat-9.0.33/webapps/test  -v /root/dockerfile/logs:/usr/local/apache-tomcat-9.0.33/logs rem/tomcat9
6.4.4.4 验证

image.png

Dockerfile上复制的文件
image.png

6.4.4.5 容器卷验证

image.png

a.jsp

<%@ 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">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    -----------welcome------------
    <%="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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\_2\_5.xsd"
  id="WebApp\_ID" version="2.5">
  <display-name>test</display-name>
</web-app>

image.png

日志

image.png

下一篇:
docker 入门到实战(七)docker常用安装

Dockerfile 说明 (Dockerfile Instructions)

Dockerfile 说明 (Dockerfile Instructions)

FROM 选取基础镜像

  • FROM  <repository>:<tag>
  • FROM  <repository>@HASDID    #更安全

MAINTANIER  作者信息;建议使用 LABEL

  • MAINTANIER  <author details>

LABEL  元数据

  • LABEL <key>=<value> ...

COPY 复制 docker 主机上的文件到创建的新映像文件

  • COPY <src> ... <dest>
  • COPY ["<src>" ... "<dest>"]    #路径中有空格使用

文本复制准则:

  • <src> 必须是 build 上下文中的路径,不能是其父目录中的文件
  • 如果 <src> 是目录,则其内部的文件和目录都会被递归复制,但是 < src > 本身是不会被复制的
  • 如果指定了多个 <src> 或者 < src > 中使用了通配符,则 < dest > 必须是一个目录,必须以 / 结尾
  • 如果 <dest> 事先不存在,将会被自动创建,这包括其父目录路径
  • <dest> 建议使用绝对路径,COPY 指定时以 WORKDIR 为起始路径

ADD 类似于 COPY 指令,ADD 支持使用 TAR 文件和 URL 路径

  • ADD <src> ... <dest>
  • ADD ["<src>" ... "<dest>"] 

操作准则:

  • 同 COPY
  • 如果 <src> 为 URL 且 < dest > 不以 / 结尾,则 < src > 指定的文件将被下载并直接创建为 < dest>; 如果 < dest > 以 / 结尾,则文件名 URL 指定的文件将被直接下载并保存为 < dest>/<filename>
  • 如果 <src> 是一个本地系统上的压缩格式的 tar 文件,它将被展开为一个目录,其行为类似于 “tar -x” 命令;然而,通过 URL 上获取到的 tar 文件将不会被自动展开
  • 如果 <src> 有多个,或其间接或者直接使用了通配符,则 < dest > 必须是一个以 / 结尾的目录路径;如果 < dest > 不以 / 结尾,则其被视作为一个普通文件,<src > 内容将会被直接写入到 < dest>

WORKDIR  用于为 Dockerfile 中所有的 RUN CMD ENTRYPOINT COPY 和 ADD 指定工作目录

  • WORKDIR <dirpath>
  • 在 Dockerfile 中 WORKDIR 指令可出现多次,其路径也可以为相对路径, 不过,其是相对于前一个 WORKDIR 指令的路径
  • 另外 WORKDIR 也可以调用由 ENV 指定定义的变量

VOLUME 用于在 image 中创建一个挂载点目录,以挂载 Docker host 上的卷或者其他容器上的卷

  • VOLUME <mountpoint>
  • VOLUME ["<mountpoint>"]
  • 如果挂载点目录路径下此前在文件存在,docker run 命令会在挂载完成后将此前的所有文件复制到新挂载的卷中

EXPOSE 用于为容器打开指定要监听的端口以实现与外部通信(并没有真实的暴露到外部网络,而是待暴露的端口,最终还是需要 docker run  -P  来对外暴露)

  • EXPOSE <port>[/<protocol>]  [<port>[/<protocol>] ...]                 # <protocol > 用于指定传输层协议,可为 udp 或 tcp 二者之一,默认为 TCP 协议
  • EXPOSE 指令可一次指定多个端口,例如:
      • EXPOSE 11211/udp  11221/tcp

ENV 用于为镜像定义所需的环境变量,并可被 Dockerfile 文件中位于其后的其他指令(如 ENV ADD COPY 等)所调用,调用格式为 $variable_name 或 ${variable_name}

  • ENV  <key> <value>
  • ENV  <key>=<value> ...
  • 第一种格式中,<key> 之后的所有内容均会被是做 < value > 的组成部分,因此,一次只能设置一个变量
  • 第二种格式可以一次设置多个变量,每个变量为一个 “<key>=<value>” 的键值对,如果 < value > 中包含空格,可以用反斜线 \ 进行转义,也可通过对 < value > 加引号进行标识;另外反斜线也可用于续行
  • 定义多个变量建议选第二种方式,以便在同一层中完成所有功能
  • 这些 ENV 变量在 ducker run 调用镜像的时候也可以被调用,并且被赋值修改

 RUN  用于指定 docker build 过程中运行的命令,其可以任何命令

  • RUN  <command>
  • RUN  ["<executable>","<param1>","<param2>"]
  • 第一种格式中,<command> 通常是一个 shell 命令,且以 “/bin/sh -c” 来运行它,这意味着此进程在容器中的 PID 不为 1,不能接收 Unix 信号,因此,当使用 docker stop <container> 命令停止容器时,此进程收不到 SIGTERM 信号
  • 第二种格式中的参数时一个 JSON 格式的数组,<executable> 为要运行的命令,后面的 < paramN > 为传递给命令的选项或参数;然而,此种格式的命令不会以 “/bin/sh -c” 来发起,因此常见的 shell 操作如:变量替换以及通配符替换将不会进行;不过,如果要运行的命令依赖于此 shell 特性的话,可以将其替换为类似下面的格式
      • RUN  ["/bin/bash","-c","<executable>","<param1>" ]        # 执行的命令后的多个参数需要全部写在 param1 中并且使用引号引起来作为一个参数

CMD  类似于 RUN 命令,不过二者运行时间点不同,docker run 时执行

  RUN 指令运行于映像文件构建过程中,而 CMD 命令运行于 Dockerfile 构建出镜像文件启动一个容器

  CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,并且其运行结束后,容器将终止;不过 CMD 指定的命令可以被 docker run 命令行选项覆盖

  在 Dockerfile 中方可以存在多个 CMD 命令,但仅最后一个会生效

  • CMD  <command>
  • CMD  ["<executable>","<param1>","<param2>"]
  • CMD  ["<param1>","<param2>"]
  • 前两种语法格式的意义同 RUN
  • 第三种语法用于给 ENTRYPOINT 指令提供默认参数

ENTRYPOINT 指定镜像默认入口命令

   类似 CMD 指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序

  与 CMD 不同的是,由于 ENTRYPOINT 启动的程序不会被 docker run 命令执行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序

    --- 不过,docker run 命令的 --entrypoint 选项的参数可覆盖 ENTRYPOINT 指令指定的程序

  • ENTRYPOINT <command>
  • ENTRYPOINT ["<executable>","<param1>","<param2>"]
  • docker run 命令传入的命令参数会覆盖 CMD 指令的内容并且附加到 ENTRYPOINT 命令最后作为其参数使用
  • Dockerfile 文件中也可以存在多个 ENTRYPOINT,但仅有最后一个会生效

USER 用于指定运行 image 时的或运行 Dockerfile 中任何 RUN、CMD 或 ENTRYPOINT 指令指定的程序时的用户名或 UID

  默认情况下,container 的运行身份为 root 用户

  • USER  <UID>|<UserName>
  • 需要注意的是,<UID> 可以为任意数字,但实践中其必须为 /etc/passwd 中某用户的有效 UID,否则,docker run 命令将运行失败

HEALTHCHECK 配置所启动容器如何进行健康检查

  • HEALTHCHECK  [options] CMD command  根据所执行命令返回值是否为 0 来判断(0 - 成功;1 - 失败;2 - 无意义);CMD 是固定格式,command 才是需要执行的检查命令
      • options 支持的参数:
        • --interval=DURATION    (default:30s)   过多久检查一次
        • --timeout=DURATION  (default:30s)  每次检查等待结果的超时时间
        • --start-period=DURATION  (default:0s)  docker run 命令执行成功等待多久时间开始健康检查
        • --retries=N   (default:3s)   如果失败了,重复几次失败才最终确定结果
  • HEALTHCHECK NONE 禁止基础镜像中的健康检查

SHELL 指定其他命令使用 shell 时的默认 shell 类型

  • SHELL  ["executable","parameters"]
  • 默认值为 [“/bin/sh”,"-c"]

ARG  定义创建镜像过程中使用的变量

  • ARG <name>[=<default value>]
  • 在执行 docker build 时,可以通过 - build-arg <varname>=<value> 来为变量赋值
  • 当镜像编译成功后,ARG 指定的变量将不再存在; ENV 指定的变量将在镜像中保留
  • Docker 内置了一些镜像创建变量,用户无需声明可直接使用,包括(不区分大小写)HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY

ONBUILD 在 Dockerfile 中定义一个触发器,指定当基于所生成镜像创建子镜像时,自动执行的操作命令

  •  ONBUILD  [INSTRUCTION]

  例如: ONBUILD  ADD  . /app/src

  • ONBUILD 指令是隐式执行的,代码会在父镜像创建中注册完成,子镜像在基于父镜像(FROM xxx)创建新镜像的时候会自动触发执行
  • 尽管任何指令都能被注册成为触发器,但 ONBUILD 不能自我嵌套,并且不会触发 FROM 和 MAINTAINER 指令
  • 包含 ONBUILD 指令的 Dockerfile 创建的镜像应该使用特殊标签,例如 nginx2.0-onbuild
  • 使用 ONBUILD  ADD/COPY 等命令的时候需要考虑子镜像创建过程中对应的文件是否存在

STOPSIGNAL 指定所创建镜像启动的容器接收退出的信号值

  • STOPSIGNAL signal

我们今天的关于【Application】Docker DockerFile解析的分享已经告一段落,感谢您的关注,如果您想了解更多关于Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、docker daemon 端口冲Failed to start Docker Application Container Engine. -- Subject: Unit docker.servic、docker 入门到实战(六)dockerFile解析、Dockerfile 说明 (Dockerfile Instructions)的相关信息,请在本站查询。

本文标签: