docker03(dockerfile镜像制作)

2023-05-16

文章目录

  • docker03(dockerfile镜像定制)
    • 一.引子
    • 二.dockerfile制作镜像步骤(镜像最多128层)
      • (一).dockerfile实例
      • (二).dockerfile实例配置文件详解及拓展

docker03(dockerfile镜像定制)

一.引子

在上一篇的基础命令之后,相信大家应该对docker容器的管理有了一定的了解。上一篇涉及了很多关于docker镜像的制作命令,大家可以再去回顾一下,今天我们要学习的内容是根据dockerfile文件来制作我们的镜像,可以多样化定制我们的镜像。dockerfile就是我们创建的一个文件,里面有一条条关于镜像制作的指令和说明,并不是什么复杂的操作。就跟我们改网络服务的配置文件一样去对待就行了。

二.dockerfile制作镜像步骤(镜像最多128层)

(一).dockerfile实例

( 创建好的镜像内会有/usr/share/nginx/html/index.html文件)
1.创建dockerfile文件

[root@localhost ~]# mkdir dockerfile
[root@localhost ~]# cd dockerfile/
[root@localhost dockerfile]# vim dockerfile
[root@localhost dockerfile]# cat dockerfile 
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

2.构建镜像

[root@localhost dockerfile]# docker build -t nginx:v3 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> f35646e83998
Step 2/2 : RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
 ---> Running in 2a2e92124b68
Removing intermediate container 2a2e92124b68
 ---> 093db9fd201c
Successfully built 093db9fd201c
Successfully tagged nginx:v3

#上一节中,有提到指令最后一个 . 是上下文路径,那么什么是上下文路径呢?
$ docker build -t nginx:v3 .
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

(二).dockerfile实例配置文件详解及拓展

1、FROM(指定基础 image):
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库

example:
	FROM centos:7.2
	FROM centos

2、MAINTAINER(用来指定镜像创建者信息):
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。

example:
	MAINTAINER  hlqlinux

3、RUN(安装软件用):
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件管理部分只能使用Centos 的包管理命令

example:	
	RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz 
	RUN ["/bin/bash", "-c", "echo hello"]

4、CMD(设置container启动时执行的操作):
设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条

example:
	CMD echo “Hello, World!

5、ENTRYPOINT(设置container启动时执行的操作):
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。

example:
	ENTRYPOINT ls -l 
	
#该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
	# CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
	CMD echo “Hello, World!” 
	ENTRYPOINT ls -l  

#另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数

FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]

6、USER(设置container容器的用户):
设置指令,设置启动容器的用户,默认是root用户

example:
	USER daemon  =  ENTRYPOINT ["memcached", "-u", "daemon"]  

7、EXPOSE(指定容器需要映射到宿主机器的端口):设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

example:
	映射一个端口  
	EXPOSE 22
	相应的运行容器使用的命令  
	docker run -p port1 image  
  
	映射多个端口  
	EXPOSE port1 port2 port3  
	相应的运行容器使用的命令  
	docker run -p port1 -p port2 -p port3 image  
	还可以指定需要映射到宿主机器上的某个端口号  
	docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  

8、ENV(用于设置环境变量):构建指令,在image中设置一个环境变量

example:
	设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
	ENV JAVA_HOME /path/to/java/dirent
	

9、ADD(从src复制文件到container的dest路径)

example:	
	ADD <src> <dest>  
		<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
		<dest> 是container中的绝对路径

10、COPY (从src复制文件到container的dest路径)

example:	
	COPY <src> <dest> 

10、VOLUME(指定挂载点):
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令

examp:	
	FROM base  
	VOLUME ["/tmp/data"]  

11、WORKDIR(切换目录):设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

example:
	WORKDIR /p1 WORKDIR p2 RUN vim a.txt  

12、ONBUILD(在子镜像中执行):ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

example:	
	ONBUILD ADD . /app/src
	ONBUILD RUN /usr/local/bin/python-build --dir /app/src

以上就是关于dockerfile制作镜像的全部内容啦,除了配置文件命令,构建过程相信还是很简单的。干中练,干中学,干中教。技术之路不进则退。感谢大家阅读。下一篇docker-compose,多容器编排工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker03(dockerfile镜像制作) 的相关文章

  • 使用 Java 和 Node.js 创建 Docker 容器

    我不知道为什么我期望它能起作用 Dockerfile FROM node 6 FROM java 8 但它并没有真正起作用 看起来第一个命令被忽略 第二个命令起作用 有没有一种简单的方法可以在 Docker 容器中安装 Node js 和
  • 在docker中安装.net框架4.7.2

    我是 Net 环境的新手 我正在尝试为我的公司实施 docker 他们之前使用的是 4 5 所以我在 dockerfile 中使用了以下语句 RUN Install WindowsFeature NET Framework 45 ASPNE
  • Docker 中的非 root 用户

    我有一个基本的 Dockerfile FROM ubuntu xenial USER test ENTRYPOINT bin bash 对于这个 Dockerfile 我希望能够创建一个没有密码的用户 并且当 Docker 容器运行时 我希
  • 尝试在 Windows 2016 Core 容器中创建计划任务时出错

    我正在尝试构建一个包含自定义计划任务的容器 这是我的 dockerfile FROM microsoft windowsservercore RUN schtasks create tn hello sc daily st 00 00 tr
  • 如何查看docker镜像的日志?

    在docker世界中 我们可以很容易地看到docker容器 即正在运行的镜像 的日志 但在图像创建过程中 通常会发出多个命令 例如 节点项目中的 npm install 命令 查看这些命令的日志也会很有帮助 我快速地从文档中搜索 但没有找到
  • Dockerfile 命令“Volume”的用途是什么?

    当 Dockerfile 包含 VOLUME 指令时 例如 VOLUME opt apache2 www 希望这个路径在实际安装中存在 这意味着这个路径将被安装到某个东西上 对吗 此 VOLUME 指令适用于图像 而不是针对图像的一个实例
  • 调用CreateStack操作时发生错误(AccessDenied):

    An error occurred AccessDenied when calling the CreateStack operation User arn aws iam 812520856627 user dimitris is not
  • Docker build ARG 始终为空字符串

    我这里有一个 dockerfile FROM golang 1 13 alpine as build ARG DIR somevalue RUN echo DIR 输出是 Sending build context to Docker da
  • minikube docker-env 是什么意思?

    在 Kubernetes 中minikube 教程 https kubernetes io docs tutorials hello minikube create your node js application有这个命令可以使用 Min
  • Dockerfile - 中间容器到底在做什么?

    我有我的 Dockerfile 如下所示 FROM confluentinc cp kafka connect 4 0 0 ARG VERSION 0 0 2 15 RUN curl Ls https github com jcustenb
  • 如何创建 AngularJS 应用程序的 Docker 容器?

    我有一个具有以下结构的 AngularJS 应用程序 app controllers mainController js otherController js directives mainDirective js otherDirecti
  • 将变量从 Github Action 传递到 Docker 镜像构建

    我一直致力于设置 Github Actions 工作流程来构建 docker 映像 我需要将环境变量传递到图像中 以便我的 Django 项目能够正确运行 不幸的是 当我构建图像时 它没有收到变量的值 我的工作流程文件的相关部分 name
  • 运行 Docker 映像时传递可选参数

    我有一个基于 windowsservercore 的 Docker 文件 我正在托管一个 ASP net Core Web 应用程序 docker 文件中的片段 ENTRYPOINT my exe ENV ASPNETCORE URLS h
  • Dockerfile“RUN chmod”未生效

    其他一切都生效 但权限没有改变 我错过了什么吗 FROM joomla 3 9 php7 2 apache RUN apt get update apt get install y apt utils vim curl COPY jooml
  • Docker:入口点的覆盖涉及CMD规范?

    这是我纯粹好奇的问题 我必须个性化 Docker 映像 特别是这是我的 dockerfile 的摘录 ARG DEFAULT PHP VERSION FROM php DEFAULT PHP VERSION DEFAULT PHP VERS
  • docker 容器内的 Spring Boot 实时重新加载不起作用

    我们有一个在 docker 容器内运行的 Spring boot gradle 项目 该容器使用 docker 卷 Spring devtools 实时重新加载功能与以下属性一起使用 spring devtools restart enab
  • 如何在 docker 容器中仅设置 python 2.7?

    我有节点应用程序 在一个用例中 我使用以下命令从节点调用 python 脚本python shell https www npmjs com package python shell 我正在尝试在 docker 上设置这个应用程序 我的 D
  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • Docker EXPOSE 使用运行时环境变量

    我的 Dockerfile 设置了一些环境变量的默认值 然后公开了两个应该是提供的环境变量的端口 FROM python 3 6 5 stretch ENV MY SERVICE PORT 8080 ENV MY SERVICE PORT
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My

随机推荐