Dockerfile实战

Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件,在持续集成和持续部署时,需要使用Dockerfile生成相关应用程序的镜像。

Dockerfile常用命令

  • FROM:继承基础镜像
  • MAINTAINER:镜像制作作者的信息,已弃用,使用LABEL替代
  • LABEL:k=v形式,将一些元数据添加至镜像
  • RUN:用来执行shell命令
  • EXPOSE:暴露端口号
  • CMD:启动容器默认执行的命令,会被覆盖
  • ENTRYPOINT:启动容器真正执行的命令,不会被覆盖
  • VOLUME:创建挂载点
  • ENV:配置环境变量
  • ADD:复制文件到容器,一般复制文件,压缩包自动解压
  • COPY:复制文件到容器,一般复制目录
  • WORKDIR:设置容器的工作目录
  • USER:容器使用的用户
  • ARG:设置编译镜像时传入的参数

Dockerfile样例

复制代码
FROM {image_name}:{image_tag}  # 指定基础镜像
# MAINTAINER  {userinfo}  # 维护人信息
LABEL {key}  {value}  # 比如设置为 maintainer  author
USER {username}  # 指定 RUN、CMD 或 ENTRYPOINT 运行时使用的用户
WORKDIR {workdir}  # 为后续 RUN、CMD 或 ENTRYPOINT 运行指定工作目录
ENV {key} {value}  # 为后续的 RUN 指令提供一个环境变量
RUN {bash command}  # 要执行的命令,RUN 一次镜像叠加一次(大小),多个命令可以用 && 连接,以免镜像太大

ADD {local_file|dir} {container_dir}  # 将本地文件/目录拷贝到容器的某个目录里,local_file|dir 可以是本地文件,也可以是一个 URL
COPY {local_file} {container_file}  # 将本地文件拷贝到容器,不支持 URL

EXPOSE {ports}  # 指定要映射的端口,可以写多个。需配合 -P 参数使用,即启动容器时加上 -P 参数,如果想知道你个具体的映射端口,可以用 -p 指定
VOLUME ["{local_dir}"]  # 创建一个可以从本机或其他容器挂载的挂载点

CMD ["command", "param1", "param2"]  # 指定容器启动时用到的命令,只能有一条!
ENTRYPOINT ["command", "param1", "param2"]  # 指定容器启动时用到的命令,类似 CMD,只能写一条,不同的是:CMD 可以被 docker run 指令覆盖,而 ENTRYPOINT 不可以被覆盖

Dockerfile 实践

复制代码
# vim dockerfile

## 设置基础镜像为CentOS
FROM centos:7
# 设置作者
LABEL user yeweijie
# 安装必要工具
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# 安装Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN tar -xf nginx-1.8.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
RUN rm -fv /usr/local/nginx/conf/nginx.conf
ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
# 映射端口
EXPOSE 80
# 设置挂载点
VOLUME ["/usr/local/nginx/html"]
# 设置容器启动时要执行的指令
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/nginx_error.log

docker build命令样例

复制代码
docker build -f /path/to/Dockerfile -t {iamge_name}:{image_tag}  {workdir}  
# -f:指定要使用的 Dockerfile 文件路径
# -t 设置镜像tag
# workdir:指定当前命令运行的工作目录
构建镜像
复制代码
 docker build --f dockerfile -t centos7_nginx:test  .
使用刚打包的镜像运行一个docker
复制代码
docker run -d --name  nginx_img -p 36128:80  centos7_nginx:test bash
查看镜像细节
复制代码
docker inspect  centos7_nginx:test
Docker Build Cache 缓存清理

Docker 18.09 引入了 BuildKit ,提升了构建过程的性能、安全、存储管理等能力。

docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况:

  • Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的
  • Containers:运行的容器占用的空间,表示每个容器的读写层的空间
  • Local Volumes:容器挂载本地数据卷的空间
  • Build Cache :镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)

最后 RECLAIMABLE这列表示可回收的大小。

一键清理 Build Cache 缓存命令:

复制代码
docker builder prune

如果想要重新构建镜像,需要用上面的命令做清理镜像缓存。

相关推荐
小马哥编程25 分钟前
如何在路由器上配置DHCP服务器?
服务器·网络·智能路由器
爱隐身的官人44 分钟前
新后端漏洞(上)- Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)
网络·安全·web安全·spel表达式注入命令执行
星马梦缘1 小时前
计算机网络7 第七章 网络安全
网络·计算机网络·安全·web安全·非对称加密·对称加密
2401_888423091 小时前
51单片机-串口通信
网络·嵌入式硬件·51单片机
ggaofeng1 小时前
k8s网络原理
网络·容器·kubernetes
wangjialelele1 小时前
Linux匿名管道和命名管道以及共享内存
linux·运维·网络
qinyia2 小时前
解锁服务器网络配置新姿势:Wisdom SSH 助力之旅
服务器·网络·ssh
我登哥MVP2 小时前
Java 网络编程学习笔记
java·网络·学习
名誉寒冰3 小时前
TCP, 三次握手, 四次挥手, 滑动窗口, 快速重传, 拥塞控制, 半连接队列, RST, SYN, ACK
网络·tcp/ip·php
塵觴葉3 小时前
Linux内核网络的连接跟踪conntrack简单分析
linux·网络·conntrack