侧边栏壁纸
博主头像
zyixin

当你觉得为时已晚的时候,恰恰是最早的时候

  • 累计撰写 64 篇文章
  • 累计创建 0 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Dockerfile

zyixin
2022-04-07 / 0 评论 / 0 点赞 / 1,820 阅读 / 4,996 字
温馨提示:
本文最后更新于 2022-04-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Dockerfile构建镜像

通过Dockerfile创建镜像
虽然可以自己操作,rootfs(见’容器文件系统那些事儿’),但Docker提供了一种更便捷的方式,叫作Dockerfile

docker build命令用于根据给定的Dockerfile和上下文以构建Docker镜像

docker build语法:
# docker build [OPTIONS] < PATH | URL | ->

1. 常用选项说明
–build-arg,设置构建时的变量
–no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
–pull,默认false。设置该选项,总是尝试pull镜像的最新版本
–compress,默认false。设置该选项,将使用gzip压缩构建的上下文
–disable-content-truse,默认true。设置该选项,将对镜像进行验证
–file,-f,Dockerfile的完整路径,默认值为’PATH/Dockerfile’
–isolation,默认–isolation=“default”,即Linux命令空间;其他还有process或hyperv
–label,为生成的镜像设置metadata
–squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image
–tag,-t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
–network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
–quiet,-q,默认dalse。设置该选项,Suppress the build output and print image ID on seccess
–force-rm,默认false。设置该选项,总是删除掉中间环节的容器
–rm,默认–rm=true,即整个构建过程成功后删除中间环节的容器

2. PATH | URL | -说明
给出命令执行的上下文
上下文可以是构建执行所在的本地路径,也可以是远程URL,如Git库、tarball或文本文件等
如果是Git库,如https://github.cmo/docker/rootfs.git#container:docker,则隐含先执行git clone --depth 1 --recursive,到本地临时目录;然后再将该临时目录发生给构建进程
构建镜像的进程中,可以通过ADD命令将上下文中的任何文件(注意文件必须在上下文中)加入到镜像中
-表示通过STDIN给出Dockerfile或上下文
示例:

	docker build - <  Dockerfile

说明:该构建过程中只有Dockerfile,没有上下文

	docker build - < context.tar.gz

说明:其中Dockerfile位于context.tar.gz的根路径

	docker build -t champagne/bbauto:latest -t champagne/bbauto:v2.1 .
	docker build -f dockerfile/Dockerfile.debug -t myapp_debug .

2.1 创建镜像所在的文件夹和Dockerfile文件
命令:

	1、mkdir sinatra
	2、cd sinatra
	3、touch Dockerfile

2.2 在Dockerfile文件中写入指令,每一条指令都会更新镜像的信息,例如:

	# This is a comment
	FROM daocloud.io/library/ubuntu:14.04
	MAINTAINER tiger tiger@localhost.localdomain
	RUN apt-get update && apt-get install -y ruby ruby-dev
	RUN gem install sinatra

格式说明:
每行命令都是以 INSTRUCTION statement 形式,就是命令 + 清单的模式,命令要大写,"#"是注解。
FROM 命令是告诉docker 我们的镜像是什么
MAINTAINER 是描述镜像的创始人
RUN 命令是在镜像内部执行,就是说他后面的命令应该是针对镜像可以运行的命令

**2.3 创建镜像 **
命令:

	docker build -t tiger/sinatra:v2

docker build 是docker创建镜像的命令
-t 是标识新建的镜像属于ouruser的
sinstra是仓库的名称
:v2 是tag

详细执行过程:

[root@docker nz1902]# docker build -t tiger/nz1902:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM daocloud.io/library/ubuntu:14.04
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete 
30bb187ac3fc: Pull complete 
b7a5bcc4a58a: Pull complete 
Digest: sha256:bd0223687054d0f8884fc9e872392c6385a3195d612400495962e270b572ed06
Status: Downloaded newer image for daocloud.io/library/ubuntu:14.04
 ---> 6e4f1fe62ff1
Step 2/4 : MAINTAINER tiger tiger@localhost.localdomain
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in e41339f3bece
Removing intermediate container e41339f3bece
 ---> 2c74b8207eb9
Step 3/4 : RUN apt-get update && apt-get install -y ruby ruby-dev
  ···
Step 4/4 : RUN gem install sinatra
 ---> Running in 262d5f96b949

2.4 创建完成后,从镜像创建容器

# docker run -it tiger/sinatra:v2 /bin/bash

Dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动指令。即FROM、MAINTAINER、RUN、CMD四个部分。

常用指令说明

FROM			指定所创建镜像的基础镜像
MAINTAINER		指定维护者信息
RUN				运行命令
CMD				容器启动是默认执行的命令
LABEL			指定生成镜像的元数据标签信息
EXPOSE			声明镜像内服务所监听的端口
ENV				指定环境变量
ADD				复制指定src路径的内容到容器的dest路径下,如果src为tar文件,则自动解压到dest路径下
copy			复制指定src路径的内容到镜像的dest路径下
ENTERPOINT		指定镜像的默认入口
VOLUME			创建数据卷挂载点
USER			指定运行容器时的用户名和UID
WORKDIR			配置工作目录
ARG				指定镜像内使用的参数
ONBUTLD			配置当所创建的镜像作为其他镜像的基础镜像时,所执行创建操作指令
STOPSIGAL		容器退出信号值
HEALTHCHECK		如何进行健康检查
SHELL			指定使用shell的默认shell类型

nginx-dockerfile示例

[root@docker nz1902]# vim Dockerfile
FROM daocloud.io/library/centos:7

ENV TZ=Asia/Shanghai

RUN yum -y install epel-release --nogpgcheck \
        yum -y install gcc openssl openssl-devel pcre-devel zlib-devel

ADD nginx-1.14.0.tar.gz /opt/

WORKDIR /opt/nginx-1.14.0

RUN ./configure --prefix=/opt/nginx --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/ --http-proxy-temp-path=/opt/nginx/proxy --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www

RUN make && make install
RUN groupadd www && useradd -g www www
WORKDIR /opt/nginx
RUN rm -fr /opt/nginx-1.14.0

ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

[root@docker nz1902]# docker build -t tiger/mynginx:v1 .

需要先下载nginx-1.14.0.tar.gz软件包在Dockerfile同级目录下

为解决nginx容器启动时,nginx无法自启动
方案一:
在CMD上添加 RUN nginx
启动命令为 docker run -itd --name container_name image_name:tag, 即可解决该问题
方案二:
替换最后一条
CMD /bin/sh -c ‘“nginx -g daemon off;”’
启动命令为:docker run -itd --name container_name image_name:tag

tomcat-Dockerfile示例

FROM daocloud.io/library/centos:7

ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.88.tar.gz /usr/local/

WORKDIR /usr/local/

RUN mv jdk1.8.0_171 jdk && mv apache-tomcat-7.0.88 tomcat

ENV JAVA_HOME=/usr/local/jdk
ENV CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CATALINA_HOME /usr/local/tomcat

EXPOSE 8080

CMD /usr/local/tomcat/bin/catalina.sh run

需要先下载jdk和tomcat在dockerfile的同级目录下
如果无法自启动,修改CMD为ENTRYPOINT
ENTRYPOINT [“/usr/local/tomcat/bin/catalina.sh”,“run”]

使用.dockerignore文件

可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径的目录和文件。例如:

# commit
  */temp*
  */*/tmp*
  tmp?
  ~*

怎么减少镜像的大小?

  1. 减少镜像层级
  2. 及时清理缓存
  3. 不添加多余文件
  4. 尽可能选用较小的基础镜像

Dockerfile网站示例

网址:https://github.com/docker-library/docs

0

评论区