Docker中Dockerfile制作镜像的方法步骤

目录
  • 1.基于容器制作
  • 2. 基于Dockerfile制作镜像
    • 2.1 Dockerfile命令
    • 2.2 简单示例

docker 镜像的制作,可以基于容器创建镜像,也可基于 dockerfile 构建镜像。但需要注意的是,我们并不是真正"创建"新镜像,而是基于一个已有的基础镜像,如 centos 或 ubuntu 等,构建新镜像而已。

1.基于容器制作

联合文件系统(UnionFS)挂载提供了容器的文件系统,任何对容器内文件系统的改动都会被写入到新的文件层中,这个文件层归创建它的容器所有。而我们就对做出改动的容器进行镜像构建。我这儿使用 busybox 作为 base image,我们可以认为 busybox 为一个精简的 linux 系统。在 busybox 上运行一个 httpd 程序,并将其制作为镜像文件。

1.拉取镜像

~]# docker image pull busybox:latest		#默认会从dockerhub上拉取
...
~]# docker image ls
	REPOSITORY    TAG       IMAGE ID        CREATED             SIZE
	busybox      latest    59788edf1f3e    2 months ago        1.15MB

2.运行镜像

~]# docker container run --name bbox -it busybox:latest		#启动镜像,并交互式登录

3.运行httpd
busybox 自带有 httpd 程序

/ # httpd -h
Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
	   httpd -d/-e/-m STRING
        -i              Inetd mode
        -f              Don't daemonize
        -v[v]           Verbose
        -p [IP:]PORT    Bind to IP:PORT (default *:80)
        -u USER[:GRP]   Set uid/gid after binding to port
        -r REALM        Authentication Realm for Basic Authentication
        -h HOME         Home directory (default .)
        -c FILE         Configuration file (default {/etc,HOME}/httpd.conf)
        -m STRING       MD5 crypt STRING
        -e STRING       HTML encode STRING
        -d STRING       URL decode STRING

/ # mkdir /data/html		#家目录
/ # echo "httpd server" >> /data/html/index.html		#测试页
/ # httpd -h /data/html		#指定家目录,启动服务

4.镜像制作
新打开一个控制台

~]# docker container commit --help
	Usage:  docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
	Options:
	  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
	  -c, --change list      Apply Dockerfile instruction to the created image
	  -m, --message string   Commit message
	  -p, --pause            Pause container during commit (default true)

~]# docker container commit -p bbox test/mybbox:v0.1		#-p制作镜像时,容器暂停运行,防止在制作镜像时有数据写入
~]# docker image ls
	test/mybbox      v0.1     e07687dd8546    1 minutes ago     1.15MB

注:若是想对版本号或者镜像名称进行修改,可使用docker tag命令,但是修改后不会覆盖原镜像,会新生成一个镜像,类似于硬链接。

5.更改启动命令
当我们运行mybbox时,会发现虽然文件都有,但是并没有运行httpd服务,这是因为每个镜像都有一个运行时启动的初始命令,我们若想镜像启动时就运行某个命令,需要我们在制作镜像时就指定。

~]# docker image inspect -f {{.Config.Cmd}} test/mybbox:v0.1
	[sh]						#可见 mybbox 镜像还是使用 busybox 的初始命令。

~]# docker container commit -a "test <test@docker.com>" -c 'CMD ["/bin/httpd,"-h /data/html"]' -p bbox test/mybbox:v0.2
~]# docker image inspect -f {{.Config.Cmd}} test/mybbox:v0.2
	[/bin/sh -c ["/bin/httpd,"-h /data/html"]]

6.推送至仓库
镜像制作完成,就可以推送至仓库,默认是推送到dockerhub,我们可以自己在 dockerhub 创建账号并创建仓库,然后本地 docker login 登录,就可以将本地镜像 push 上去。需要注意的是在 dockerhub 上创建仓库时,命名空间要为test,仓库名为 mybbox(对于本次实验),必须要严格一致。由于我这儿登不了 dockerhub,就不在演示了。

7.保存镜像至本地
当镜像制作好,可保存到本地进行分发,也就不需要上传到仓库了。

~]# docker image save -o /tmp/mybbox.gz test/mybbox:v0.2	#-o指定保存目录,也可多个镜像一起保存
~]# docker image load -i /tmp/mybbox.gz 		#使用时导入即可

2. 基于Dockerfile制作镜像

其实我们发现,基于容器构建镜像,在对配置变动频繁或需要重复构建镜像时,效率是非常低下的。所以我们就需要使用Dockerfile来实现快速构建镜像,Dockerfile是一个文件,它由构建镜像的指令组成,指令由Docker镜像构建者自上而下排列,能够被用来修改镜像的任何信息。

注意事项:

  • Dockerfile文件需放置在一个目录中,这个目录中有构建镜像的所有文件,可以创建子目录。
  • 在Dockerfile文件中,"#“号开头表示注释,每行为"INSTRUCTION arguments”,习惯大写表示关键字(但并不区分大小写),后面小写表示值。
  • 每个Dockerfile的第一行(注释行除外),必须使用"FROM"关键字。
  • 当我们在docker build构建镜像时,会将我们的指定的上下文目录(即Dockerfile所在目录)打包传递给docker 引擎,而这个上下文中并非所有文件都会在Dockerfile中使用,这样就会使传送给docker引擎的目录过大,影响构建速度,所以可以在此目录中,定义.dockerignore文件,将不使用的文件文件名写入到该文件即可,且支持通配符。
  • 最小化镜像的层数,Dockerfile中每一行命令就是一层,层数过多影响构建效率。
  • Dockerfile文件中命令从上往下逐行执行。

2.1 Dockerfile命令

1.FROM: FROM 指令是最重的一个且必须为 Dockerfile 文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在 docker 主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry 上拉取所需的镜像文件如果找不到指定的镜像文件,docker build 会返回一个错误信息。

Syntax:
	FROM <image>[:<tag>]
	FROM <image>@<digest>

	<image> :指定作为base image的名称,默认从dockerhub拉取镜像,若使用其他仓库可在镜像前指定;
	<tag>	:base image的标签,为可选项,省略时默认为latest;

eg:
	FROM busybox:latest

2.MAINTAINER: 用于让镜像制作者提供本人的详细信息,Dockerfile 并不限制 MAINTAINER 指令可在出现的位置,但推荐将其放置于 FROM 指令之后,已经被 LABEL 取代,但仍可使用。

Syntax:
	FROM <image>[:<tag>]
	FROM <image>@<digest>

	<image> :指定作为base image的名称,默认从dockerhub拉取镜像,若使用其他仓库可在镜像前指定;
	<tag>	:base image的标签,为可选项,省略时默认为latest;

eg:
	FROM busybox:latest

3.LABEL: 效果同上,指定多个元数据

Syntax:
	 LABEL <key>=<value> [<key>=<value> ...]

eg:
	LABEL name=test mail=test@163.com

4.COPY: 用于从 Docker 主机复制文件至创建的新映像文件

Syntax:
	COPY <src> ... <dest>
	COPY ["<src>",... "<dest>"] 

	<src>  :要复制的源文件或目录,支持使用通配符
	<dest> :目标路径,即正在创建的image的文件系统路径;
		    建议为<dest>使用绝对路径否则,COPY指定则以WORKDIR为其起始路径;

文件复制准则:
	1.<src>必须是build上下文中的路径,不能是其父目录中的文件
	2.如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
	3.如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
	4.如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

eg:
	COPY index.html /data/web/		#最后不加斜线会改名为web
	COPY src/ /data/web				#src/* 被拷贝到/data/web目录下
	COPY test1 test2 /data/web/		#多文件最后必须加/

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

Syntax:
	ADD <src> ... <dest>
	ADD ["<src>",... "<dest>"] 

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

eg:
	ADD http://nginx.org/download/nginx-1.14.2.tar.gz  /data/		#nginx-1.14.2.tar.gz会放在/data/目录下,不会解压
	ADD nginx-1.14.2.tar.gz	/date		#nginx-1.14.2目录会放在/data/目录下,会解压

6.WORKDIR: 用于为 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指定设定工作目录,其生效范围为本次定义workdir到下一次定义之间,且还会影响到进入容器时的目录

Syntax:
	WORKDIR <dirpath>

注:在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径另外,
WORKDIR也可调用由ENV指定定义的变量

eg:
	WORKDIR /var/log
	WORKDIR $STATEPATH

7.VOLUME: 用于在 image 中创建一个挂载点目录,以挂载 Docker host 上的卷或其它容器上的卷,但需要注意的是此选项只能创建容器管理的卷,即在宿主机上随机挂载一个目录,而不能指定目录挂载

Syntax:
	VOLUME <mountpoint>
	VOLUME ["<mountpoint>"] 

注:如果挂载点目录路径下此前有文件存在,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。

eg:
	VOLUME /data		#不能指定宿主机目录,随机挂载在 /var/lib/docker/volumes/...

8.EXPOSE: 用于为容器打开指定要监听的端口以实现与外部通信,但不能指定宿主机的端口绑定,并且即使在 Dockerfile 中定义了 EXPOSE ,也必须要在启动容器时手动加上 -P 选项才会生效。

Syntax:
	EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]
	<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

eg:
	EXPOSE 11211/udp 11211/tcp	#EXPOSE指令可一次指定多个端口

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

Syntax:
	ENV <key> <value> 或
	ENV <key>=<value> ...

注:
	1.第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;
	2.第二种格式可用一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,
	  也可通过对<value>加引号进行标识;另外,反斜线也可用于续行;
	3.定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
	4.docker run时可以使用 -e 参数指定环境变量,相同环境变量会覆盖Dockerfile中的值

eg:
	ENV name=zhang \
		age=15	\
		sex=N

10.ARG: 此参数和 ENV 有些相似,都是指定变量值,但是在使用 ENV 时,若要动态的传递变量值,只能在 docker run 时才能传递,而 ARG 可以在 docker build 过程中,通过–build-arg 来进行动态传递参数值。除此之外,ENV 的值会保留在镜像的环境变量中,但 ARG 的值不会保存。所以若想在 build 镜像的过程中修改变量的值,推荐使用 ARG

用法同上,下图说明了构建过程,RUN 与 CMD 指令见下面介绍

11.RUN: 用于指定 docker build 过程中运行的命令,其可以是基础镜像中存在的任何命令,见下图所示。

Syntax:
	RUN <command>
	RUN ["<executable>", "<param1>", "<param2>"]

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

eg:
	RUN ls /data		#将会在构建的时候执行 "ls /data"命令
	RUN ["/bin/sh","-c","mkdir -p /data/hello"]

12.CMD: 类似于RUN指令,CMD 指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同,RUN指令运行于映像文件构建过程中(docker build),而CMD指令运行于基于 Dockerfile 构建出的新映像文件启动一个容器时(docker run),CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD 指定的命令其可以被 docker run 的命令行选项所覆盖,在 Dockerfile 中可以存在多个 CMD 指令,但仅最后一个会生效。

Syntax:
	CMD <command>
	CMD ["<executable>","<param1>","<param2>"]
	CMD ["<param1>","<param2>"]

注:前两种语法格式的意义同RUN,第一种用法虽然会先起sh进程,但是执行完command后,sh进程会退出,并由command的进程替代为1号进程,第三种则用于为ENTRYPOINT指令提供默认参数。

eg:
	CMD /bin/httpd -f -h $DOC_ROOT	#如下可见在运行命令之前会预先运sh命令
	~]# docker image inspect -f {{.Config.Cmd}} test
		[/bin/sh -c /bin/httpd -f -h $DOC_ROOT]

~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash		#CMD 指定的命令可在 docker run 时指定命令修改

13.ENTRYPOINT: 类似 CMD 指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序,与 CMD 不同的是,由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定指定的程序。不过,docker run 命令的 --entrypoint 选项的参数可覆盖 ENTRYPOINT 指令指定的程序。

Syntax:
	ENTRYPOINT <command>
	ENTRYPOINT ["<executable>", "<param1>", "<param2>"]

注:
	1.docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用。
	2.Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。

eg:
	CMD ["/bin/ls","/etc"]
	ENTRYPOINT ["/bin/bash","-c"]		#会先启动sh进程,CMD指定的命令会被当做参数传给 /bin/bash -c

~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash		#使用entrypoint时,docker run时动态指定的命令将会被当做参数传递给entrypoint定义的命
~]# docker container run --name NAME -it --rm --entrypoint "/bin/bash" IMAGE_NAME	#entrypoint指定的命令可以在docker run时添加的 --entrypoint 后的命令所覆盖

14.USER: 用于指定运行image时的或运行 Dockerfile 中任何 RUN、CMD 或 ENTRYPOINT 指令指定的程序时的用户名或 UID,默认情况下,container 的运行身份为root用户。

Syntax:
	USER <UID>|<UserName>

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

15.HEALTHCHECK: 对容器进行健康状态检测。

Syntax:
	HEALTHCHECK [OPTIONS] CMD command

OPTIONS:
	--interval:多长时间检测一次,默认30s
	--timeout:超时时长,默认30s
	--start-period:容器启动后多久开始检测,默认30s
	--retries:重试次数:默认3次

响应码:
	0:success
	1:unhealthy
	2:reserved

eg:
	HEALTHECK --interval=5m --timeout=30s CMD curl -f http://localhost/ || exit 1

16.SHELL: 在使用 RUN、CMD 等命令时,有些格式在运行命令前会先启动一个sh进程,默认使用的是 /bin/sh,但在有些时候我们需要改变默认的 SHELL。

Syntax:
	SHELL ["executable","parameters"]

17.STOPSIGAL: 默认的 stop-signal 是 SIGTERM,在 docker stop 的时候会给容器内 PID 为1的进程发送这个 signal,通过 --stop-signal 可以设置自己需要的 signal,主要的目的是为了让容器内的应用程序在接收到 signal 之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s。这个命令很少用到。

18.ONBUILD: 用于在 Dockerfile 中定义一个触发器,Dockerfile 用于 build 映像文件,此映像文件亦可作为 base imag 被
另一个 Dockerfile 用作 FROM 指令的参数,并以之构建新的映像文件,在后面的这个 Dockerfile 中的 FROM 指令在 build 过程中被执行时,将会“触发”创建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定义的触发器。简单来说,就是别人基于你的镜像重新制作镜像时才会触发此命令。

Syntax:
	ONBUILD <INSTRUCTION>
注:
	1.尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
	2.使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild
	3.在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败

2.2 简单示例

容器运行nginx:

~]# mkdir myng
~]# cd myng
~]# cat Dockerfile
	#Dockerfile for my nginx

	FROM nginx:1.14-alpine

	LABEL maintainer="chuan <chuan@test.com>"

	ENV DOC_ROOT="/data/web/html/"

	#ARG参数不会写到容器的环境变量中,所以在此环境下,PORT不会传递给配置中的变量,此处应使用ENV
	#ARG PORT=80
	ENV PORT=80

	COPY entrypoint.sh /bin/
	ADD index.html $DOC_ROOT

	EXPOSE ${PORT}/tcp

	ENTRYPOINT ["/bin/entrypoint.sh"]
	CMD ["/usr/sbin/nginx","-g","daemon off;"]

	HEALTHCHECK --interval=10s --start-period=10s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/index.html

~]# cat index.html
	<h1>hello world</h1>

~]# cat entrypoint.sh 			#exec命令表示用将要执行的进程代替当前进程,否则此程序将作为sh的子进程运行
	#!/bin/sh
	#
	cat > /etc/nginx/conf.d/www.conf << EOF
	server {
	        server_name $HOSTNAME;
	        listen ${IP:-0.0.0.0}:${PORT:-8080};
	        root ${DOC_ROOT:-/usr/share/nginx/html};
	}
	EOF
	exec "$@"

~]# chmod a+x entrypoint.sh
~]# docker image build . -t 	test/myweb:v0.1		#PATH 要为Dockerfile文件的父目录

容器运行httpd:

~]# mkdir ap
~]# cd ap
~]# cat Dockerfile
	#Dockerfile for my httpd

	FROM centos:7

	LABEL maintainer="chuan <chuan@test.com>"

	ENV doc_root=/var/www/html \
        listen_port=80 \
	    server_name=localhost

	RUN yum makecache && \
	    yum install -y httpd php php-mysql && \
	    yum clean all 

	ADD phpinfo.php ${doc_root}
	ADD entrypoint.sh /bin/

	EXPOSE 80/tcp

	VOLUME ${doc_root}

	CMD ["/usr/sbin/httpd","-DFOREGROUND"]
	ENTRYPOINT ["/bin/entrypoint.sh"]

]# cat phpinfo.php
	<?php
	        phpinfo();
	?>

~]# cat entrypoint.sh
	#!/bin/bash

	LISTEN_PORT=${listen_port:-80}
	SERVER_NAME=${server_name:-localhost}
	DOC_ROOT=${doc_root:-/var/www/html}

	cat > /etc/httpd/conf.d/myweb.conf <<EOF
	Listen $LISTEN_PORT
	<VirtualHost *:$LISTEN_PORT>
	        ServerName "$SERVER_NAME"
	        DocumentRoot "$DOC_ROOT"
	        <Directory "$DOC_ROOT">
	                Options none
	                AllowOverride none
	                Require all granted
	        </Directory>
	</VirtualHost>
	EOF

	exec "$@"

~]# chmod a+x entrypoint.sh
~]# docker image build . -t 	test/myweb:v0.2

~]# docker container run --name myweb2 --rm -P test/myweb:v0.2

到此这篇关于Docker中Dockerfile制作镜像的方法步骤的文章就介绍到这了,更多相关Dockerfile制作镜像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Dockerfile制作官方Tomcat镜像及镜像使用详解

    这两天学习了Dockerfile感觉这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 官方Tomcat镜像 地址:https://hub.docker.com/_/tomcat/ 镜像的Full Description中,我们可以得到许多信息,这里简单介绍几个: 1.Supported tags and respective Dockerfile links 支持的标签,以及对应的Dockerfile链接.一个Dockerfile可以对应多个标签,我们将以8.5.16-jre8版本的

  • docker Dockerfile文件制作自己的镜像的方法

    1.创建空目录 $ cd /home/xm6f/dev $ mkdir myapp $ cd myapp/ 2.vim Dockerfile,内容如下: ## 一个基础的 python 运行环境 FROM python ## 设置工作目录 WORKDIR /app ## 将当前系统文件夹内容复制到容器的 app 目录 ADD . /app ## 安装必要的依赖包 RUN pip install -r softwares.txt ## 开放端口,供容器外访问 EXPOSE 80 EXPOSE 30

  • Docker 制作镜像Dockerfile和commit操作

    构建镜像 构建镜像主要有两种方式: 使用docker commit命令从运行中的容器提交为镜像: 使用docker build命令从 Dockerfile 构建镜像. 首先介绍下如何从运行中的容器提交为镜像.我依旧使用 busybox 镜像举例,使用以下命令创建一个名为 busybox 的容器并进入 busybox 容器. $ docker run --rm --name=busybox -it busybox sh 执行完上面的命令后,当前窗口会启动一个 busybox 容器并且进入容器中.在

  • dockerfile制作apache镜像的方法

    一.Docker镜像 1.1 docker镜像 应用的是发布的标准格式 支撑一个docker容器的运行 1.2 docker镜像的创建方法 基于已有的镜像创建 基于本地模板创建 基于Dockerfile创建 Docker镜像是分层的结构 ①Dockerfile中的每个指令都会创建一个新的镜像层 ②镜像层将被缓存和复用 ③当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效 ④某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效 ⑤镜像层是

  • 利用Dockerfile制作java运行环境的镜像的方法步骤

    当前用到的环境是: Centos 7.5 docker-ce 18.06.1-ce 1.先用centos7.5.1804的基础镜像把一些运行需要的环境装好 在/app目录下创建相对应的文件目录 [root@node2 /app/]# mkdir dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv [root@node2 /app]# cd dockerfile/system/centos/ [r

  • Docker中Dockerfile制作镜像的方法步骤

    目录 1.基于容器制作 2. 基于Dockerfile制作镜像 2.1 Dockerfile命令 2.2 简单示例 docker 镜像的制作,可以基于容器创建镜像,也可基于 dockerfile 构建镜像.但需要注意的是,我们并不是真正"创建"新镜像,而是基于一个已有的基础镜像,如 centos 或 ubuntu 等,构建新镜像而已. 1.基于容器制作 联合文件系统(UnionFS)挂载提供了容器的文件系统,任何对容器内文件系统的改动都会被写入到新的文件层中,这个文件层归创建它的容器所

  • 使用Docker将容器打成镜像的方法步骤

    目录 前言 1. 容器打成镜像 过程示例 2. 镜像打包 前言 工作中遇到三方闭源的中间件运行起来某项特性不符合需求,但是镜像提供方偏偏又没有将配置文件挂载出来以供修改,这就导致要使软件符合需求地运行只能进入到容器内部修改配置文件后重启,可谓非常之蛋疼.笔者平时对 Docker 接触不多,好在有同事提到 Docker 支持将运行中的容器重新打包为镜像,于是网上搜索资料,大致整理出以下步骤解决上面的问题,故有本文聊作记录 进入运行中的容器修改其配置文件,修改完成后重启容器 将已经修改过配置文件的容

  • docker使用Dockerfile构建镜像的方法

    构建镜像 前面我们使用各种镜像进行测试演示,很多情况下我们是需要自己的镜像,满足自己业务需要的镜像,这就需要我们能够定制自己需要的镜像,构建 Docker 镜像有以下两种方法. 使用 docker commit 命令. 使用 docker build 命令和 Dockerfile 构建文件. 现在我们不推荐使用 docker commit 命令,而应该使用更灵活.更强大的 Dockerfile 来构建 Docker 镜像. 1.使用 commit 命令构建 docker commit 命令是创建

  • 通过Dockerfile构建Docker镜像的方法步骤

    Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. Dockerfile支持Shell类的行尾添加"\"的命令换行方式,以及行首"#"进行注释的格式. 使用Dockerfile构建Docker镜像时注意事项: (1).尽量选取满足需求但较小的基础系统镜像; (2).清理编译生成文件.安装包的缓存等临时文件; (3).安装各个软件时候要指定准确的版本号,并避免引入不

  • SpringBoot创建Docker镜像的方法步骤

    随着越来越多的组织转向容器和虚拟服务器,Docker正成为软件开发工作流程中一个更重要的部分.为此,Spring Boot 2.3中最新的功能之中,提供了为Spring Boot应用程序创建 Docker 镜像的能力. 这篇文章的目的,就是为了给大家介绍如何为 Spring Boot 应用程序创建 Docker 镜像. 1. 传统Docker构建 使用Spring Boot 构建 Docker 镜像的传统方法是使用 Dockerfile .下面是一个简单的例子: FROM openjdk:8-j

  • docker官方镜像下载及使用Dockerfile创建镜像的方法

    1.登陆docker hut官方网站:https://hub.docker.com/ 2.search centos 3.docker pull centos:7.2.1511 4.创建Dockerfile文件: [root@vmhost centos7.2]# cat Dockerfile [plain] view plain copy FROM centos:7.2.1511 MAINTAINER wanghongwei(wanghongwei@4paradigm.com) RUN yum

  • 使用Docker构建企业级自定义镜像的方法

    前言 临下班前,楼主接到了一个需求,由于基础镜像标准发生变更,需要按照最新的Docker 镜像标准构建自己应用的自定义镜像.目前的标准是这样的:基础架构组只提供所有项目必须接入的3个公共镜像,这3个公共基础镜像包含了:JDK8.Skywalking.Arthas.对于各自业务组的应用如果还需要加入其它镜像,则由各个业务组自己基于基础架构组提供的公共镜像之上,再添加自定义的镜像,结构图如下: 构建步骤 编写Dockerfile 基于最新的规范来看,我们需要编写一个Dockerfile,然后引用基础

  • Docker搭建部署Node项目的方法步骤

    目录 什么是Docker 客户端Docker Docker基本操作 镜像名称 拉取镜像 其他操作 Dockerfile Docker-compose 构建nginx-node-postgres项目 前段时间做了个node全栈项目,服务端技术栈是 nginx + koa + postgresql.其中在centos上搭建环境和部署都挺费周折,部署测试服务器,接着上线的时候又部署生产环境服务器.这中间就有很多既无聊又费精力,吃力不讨好的"体力活".所以就开始思考怎么自动化这部分搭建部署的工

  • docker之创建MariaDB镜像的方法

    一.基于commit命令方式创建 docker的安装 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl enable docker [root@test01 ~]# systemctl start docker 下载本地镜像 [root@test01 ~]# docker pull centos:7.4.1708 [root@test01 ~]# docker images REPOSITORY TAG IMAGE ID

  • Docker中部署mysql服务的方法及遇到的坑

    最近一直在学习搬运工,感觉这么厉害的东西怎么以前不知道呢,把自己捣鼓的过程整理记录下来,供同学们参考 第零步:从Docker Hub拉取官方mysql镜像 docker pull mysql 然后就是进入漫长的等待,当然如果你配置了镜像加速器,速度会快那么一丢丢 第一步:使用docker images命令查看镜像 你会看到我们这里已经有了MySQL的的镜像 第二步:启动我们的mysql的镜像,创建一个MySQL的容器 使用命令:docker run -d --name mysql -p 3307

随机推荐