dockerfile构建镜像常用命令
一、什么是dockerfile
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
# 例如:
docker build -f /path/to/a/Dockerfile
Dcokerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,'#' 为 Dockerfile 中的注释。
二、dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
# 基础镜像:centos后可加版本:centos:7
FROM centos:7
#维护者信息注释(选写)
MAINTAINER xx xx@xx.com # 安装基础软件:尽可能少RUN,可以使用&& 链接
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm && yum install nginx -y # add 将本地文件扔到容器里
ADD index1.html /usr/share/nginx/html/index.html # 开放端口
EXPOSE 80
# ADD run.sh /run.sh
# RUN chmod 755 /run.sh
# 启动执行
CMD ["nginx"]
# 创建新镜像 : .为Dockerfile所在目录,在创建镜像的目录执行下面命令,ADD里的东西也放在同一个目录
docker build -t nginx:centos . # 启动镜像,去访问index.html
docker run -d -P nginx:centos
[root@ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx centos 578353538643 5 minutes ago 420MB # 登录
docker run -it -P nginx:centos bash [root@ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8de513a57286 nginx:centos "bash" 17 seconds ago Up 16 seconds 0.0.0.0:49174->80/tcp, :::49174->80/tcp, 0.0.0.0:49173->443/tcp, :::49173->443/tcp sharp_sammet
常用参数:FROM: 指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息 ADD
#构建镜像时执行的命令,将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源
格式:ADD <src>... <dest> COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,拷贝文件或目录至容器中,单纯复制文件推荐使用 EXPOSE 指定容器与宿主机交互端口 RUN
# 构建镜像时执行的命令,重复执行这个dockerfile时不会再执行
# linux
RUN shell命令
# windows
RUN ["executable", "param1", "param2"]
"""
注1:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache 注2:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
""" CMD
构建容器后调用,也就是在容器启动时才进行调用
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。 ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
ENTRYPOINT ["executable","param1","param2"]
示例:ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]
示例2:搭配CMD使用:一般变参才会使用CMD,这里的CMD等于在给ENTRYPOINT传参
ENTRYPOINT ["nginx","-c"] #定参
CMD ["/etc/nginx/nginx.conf"] #变参
不传参,容器内默认运行:nginx -c /etc/nginx/nginx.conf
传参,覆盖掉CMD里的指定文件: # docker run nginx:centos -c /etc/nginx/new.conf
ENV 设置环境变量,以便之后引用
# 语法有两种
1. ENV <key> <value>
2. ENV <key>=<value> ...
# 两者的区别就是第一种是一次设置一个,第二种是一次设置多个
例如: ENV VERSION 6.6.6
RUN curl -SLO "https://xxx/$VERSION/XX.tar.gz" VOLUME 可实现挂载功能,可以将本地文件夹或者其他容器中的文件夹挂在到这个容器种
用途:避免重要数据因容器重启而丢失,避免容器不断变大
# 语法为,可以时多个值:
VOLUME ["/data"]
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db# docker容器的数据管理
from centos
VOLUME ["/datavolume3","/datavolume6"]
CMD /bin/bash # 构建命令
docker build -t="volume" .
# 启动容器后会发现2个目录
/datavolume3和/datavolume6 # docker的数据卷容器
数据卷容器:命名的容器挂载数据卷,其它容器通过挂载这个容器实现数据共享,挂载数据卷的容器就叫做数据卷容器
挂载方法:
docker run --volumes-from [container name]
示例:
(1) 创建第一个容器
docker run --name data-volume -dit volume 在/datavolume3中创建一个文件xc.txt
(2)创建第二个容器
docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
登录到data-volume2中就会发现对应目录也有/datavolume3和/datavolume6,并且/datavolume3目录中有xc.txt文件
# docker数据卷的备份和还原,容器与容器之间的数据备份还原
数据备份方法:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]
示例:将容器data-volume2中/datavolume卷进行备份到/root/backup/目录中
备份:docker run --volumes-from data-volume2 -v /root/backup:/backup --name datavolume-copy centos tar czvf /backup/datavolume.tar.gz /datavolume
还原:docker run --volumes-from data-volume2 -v /root/backup:/backup centos tar czvf /backup/datavolume.tar.gz -C /
USER 设置启动容器的用户和用户组
USER daemo
注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行
格式:USER user:group WORKDIR
# 语法,类似cd功能:
WORKDIR /path/to/workdir
# 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。 ARG:用于指定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
ONBUILD 用于延迟构建命令的执行,Dockerfile里使用ONBUILD指定的命令,在本次构建镜像过程中不执行,当有新的dockerfile使用了之前构建的镜像作为基础镜像,这是执行新镜像的dockerfile构建时候,会执行ONBUILD指定的命令
例如:自己制作了一个centos基础镜像,制作的时候有一条ONBUILD命令,当使用这个镜像作为nginx镜像时就会执行onbuild命令
LABLE 指令给镜像添加元数据
HEALTHCHECK 用于指定某个程序或指令来监控docker容器服务的运行状态
格式:HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽其监控检查指令
ARG 构建参数与ENV作用一致,但作用域不同,ARG设置的环境变量仅对dockerfile内有效,只在docker build过程中有效,构建好的镜像内不存在此环境变量
格式: ARG 参数名=默认值

# tomcat 安装
# cat tomcat.yaml
FROM centos:8
MAINTAINER xiong
RUN yum install wget
ADD jdk-8u281-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.5.50.tar.gz /usr/local/
RUN cd /usr/local && rpm -ivh jdk-8u281-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.5.50.tar.gz /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out #构建tomcat
docker build -t="tomcat8:v1" tomcat.yaml
dockerfile构建镜像常用命令的更多相关文章
- docker-管理镜像常用命令
1. docker管理镜像常用命令 指令 说明 docker run [容器 CONTAINER ID] 创建一个新的容器并运行一个命令 docker start [容器 CONT ...
- 03--Docker 容器和镜像常用命令
一.帮助命令 docker version docker info docker --help =====================镜像命令=========================== ...
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
1.理解Dockerfile语法 语法命令 命令功能 举例 FROM 所有的dockerfile都必须以FROM命令指定镜像基于哪个基础镜像来制作 FROM ubuntu:14:04 MAINTAIN ...
- Docker容器学习梳理 - Dockerfile构建镜像
在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...
- 013、Dockerfile构建镜像(2019-01-02 周三)
参考https://www.cnblogs.com/CloudMan6/p/6830067.html Dockerfile构建镜像过程分析 root@docker-lab:~/111# ls ...
- Dockerfile构建镜像
Dockerfile构建镜像的步骤: 从基础镜像运行一个容器 执行一条指令,对容器做出修改 执行类似docker commit的操作,提交一个新的镜像层 再基于刚提交的镜像运行一个新的容器 执行Doc ...
- Dockerfile 构建镜像
一.使用dockerfile构建镜像 基本结构: a.设置基础镜像 当前镜像继承于的基础镜像 FROM centos:latest b.设置维护者信息 没有固定格式 c.设置需要添加到容器中的文件 ...
- Dockerfile构建镜像实战
目录 一.常见Dockerfile指令 二.编写Centos Dockerfile 2.1.编写Dockerfile 2.2.构建 2.3.查看Docker镜像 2.4.运行镜像 三.CMD和ENTR ...
- 使用Dockerfile构建镜像命令自己的理解
1.FROM 基于那个基础命令开始构建镜像,我的理解就是选择一个操作系统 2.CMD 里面放的是指定一个容器启动时要运行的命令 3.ENTRYPOINT 类似于CDM命令,不过 docker run ...
- docker:(2)通过Dockerfile构建镜像并发布web项目
上一篇讲解了docker的基本使用 http://www.cnblogs.com/xiaochangwei/p/8204511.html 虽然通过修改获取到的镜像可以达到使用目的,但是多操作几次就会发 ...
随机推荐
- FFmpeg开发笔记(三)FFmpeg的可执行程序介绍
外界对于FFmpeg主要有两种使用途径,一种是在命令行运行FFmpeg的可执行程序,该方式适合没什么特殊要求的普通场景:另一种是通过代码调用FFmpeg的动态链接库,由于开发者可以在C代码中编排个性 ...
- GO 协程【VS】C# 多线程【Go-C# Round 1】
〇.前言 最近接触到 Go 语言相关的内容,由于之前都是用的 C# 语言,然后就萌生了对这两种语言进行多方面比较. 本文将在 Go 的优势项目协程,来与 C# 的多线程操作进行比较,看下差距有多大. ...
- 使用Dockerfile部署springboot打包jar包
1.docker下载JDK1.8镜像 docker pull java:8 2.进行需要编译的镜像文件目录编写Dockerfile文件 #依赖的父镜像FROM java:8#作者MAINTAINER ...
- 【已解决】ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes
export HDFS_NAMENODE_USER=rootexport HDFS_DATANODE_USER=rootexport HDFS_SECONDARYNAMENODE_USER=roote ...
- 【已解决】(MySQL)SQL注入绕过登陆验证直接登陆---用户名输入框注释sql密码语句段
今天学习了一种sql注入方法,通过注释密码验证部分的sql语句. 这是登陆界面 在用户名如果输入 15284206891' and 1=1 # 密码可以随意输入即可登陆成功 原理如下: 在sql可视化 ...
- C++设计模式 - 享元模式(Flyweight)
对象性能模式 面向对象很好地解决了"抽象"的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. ...
- OpenHarmony创新赛|赋能直播第四期
开放原子开源大赛OpenHarmony创新赛进入了中期评审环节,为了解决开发者痛点,本期以三方库移植.MQTT移植案例.开发工具介绍的3节系列技术课程,帮助开发者提升开发效率,为作品的创新能力奠定坚 ...
- Git 教程:解密 .gitignore 文件、合并分支、解决冲突、及 Git 帮助
Git 帮助 如果你忘记了命令或命令的选项,你可以使用 Git 帮助. 在命令行中,有几种不同的使用帮助命令的方式: git command -help - 查看特定命令的所有可用选项 git hel ...
- 使用PTK卸载数据库时删除用户失败怎么办?
使用 PTK 卸载数据库时删除用户失败怎么办? 背景介绍: PTK (Provisioning Toolkit)是一款针对 MogDB 数据库开发的软件安装和运维工具,旨在帮助用户更便捷地安装部署 M ...
- 在python中通过面向对象方式,实现烤地瓜案例
例子:烤地瓜,不同时间,反馈不同状态,并给不同状态地瓜加入不同味道 烤地瓜时间 0-3分钟,生的 4-7分钟,半生不熟的 8-12分钟,熟了 12分钟以上,已烤熟,糊了 用户可以按自己的意思添加调料 ...