八、【Docker笔记】使用Dockerfile创建镜像
在前面我们讲解了基于已有的镜像容器创建和基于本地模板导入两种方式来创建镜像,在这里我们就来说说第三种创建镜像的方式。Dockerfile是一个文本格式的配置文件,我们可以通过Dockerfile快速创建自定义的镜像。
一、基本结构
Dockerfile是由多行命令语句组成的,并且在文件中支持以 # 开始的注释行。我们一般将Dockerfile文件分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。其中,第一行(不包含注释行)必须指定基于的基础镜像,例如:FROM ubuntu。之后可以是维护者信息,如:MAINTAINER gongziqi 14155830994@qq.com。再往后可以是镜像的操作指令,如:
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
最后可以是容器启动时执行指令,如:CMD /usr/sbin/nginx。
# 0. 在ubuntu镜像的基础上,安装inotify-tools/nginx/apache2/openssh-server等,创建新的Nginx镜像
# Nginx
# VERSION 1.0
FROM ubuntu
MAINTAINER gongziqi 1415583094@qq.com
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# 1. 在ubuntu镜像基础上,安装firefox/vnc。启动后,用户可通过5900端口通过vnc方式使用firefox
# FireFox over VNC
# VERSION 1.0
FROM ubuntu
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ./.vnc
RUN x11vnc -storepasswd 123456 ~/.vnc/passwd
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc","-forever","usepw","-create"]
二、指令
1、FROM
语法为:FROM 或 FROM :。若在同一个Dockerfile中创建多个镜像,可以使用多个FROM即每个镜像一个。
2、MAINTAINER
语法:MAINTAINER ,用来指定维护者信息。
3、RUN
语法:RUN 或 RUN ["executable","param1","param2"]。第一个将在shell终端中运行命令,即 /bin/bash -c;第二个则使用 exec 执行。每条RUN指令将在当前镜像基础上执行指定指令,并提交为新的镜像。若命令行太长可以使用 \ 来换行书写。
4、CMD
支持三种方式:
CMD ["executable", "param1", "param2"],使用 exec执行,推荐方式。
CMD command param1 param2,在 /bin/sh 中执行,提供给需要交互的应用。
CMD ["param1","param2"],提供给 ENTRYPOINT的默认参数。
指定启动容器时执行的命令,每个Dockerfile只能由一条 CMD命令。若指定多条,则只有最后一条有效。若在启动容器时,指定了运行的命令,则CMD命令将会被覆盖。
5、EXPOSE
语法:EXPOSE [ ...],如:EXPOSE 22 80 8443,即告诉Docker服务器容器暴露的端口,这些端口可供互联使用。此时在容器启动中,可使用 -P 来随机指定一个端口,也可使用 -p 来指定具体的端口映射。
6、ENV
语法:ENV 。指定一个环境变量,会被后面的RUN指令使用,并在容器运行时保持。如:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
7、ADD
语法:ADD 。将复制指定的src到容器中的desc。其中,src 可以是Dockerfile所在目录的一个相对路径(文件/目录);也可为一个URL;还可为一个tar文件。
8、COPY
语法:COPY 。复制本地主机的src(Dockerfile所在目录的相对路径)到容器中的desc。当目标路径不存在时,将自动创建。当使用本地目录为源目录时,推荐使用COPY,不推荐ADD。
9、ENTRYPOINT
语法:ENTRYPOINT ["executable","param1","param2"] 或 ENTRYPOINT command param1 param2(shell中执行)。配置容器启动后执行的命令,并且不可被docker run 提供的参数覆盖。每个Dockerfile只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
10、VOLUME
语法:VOLUME ["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
11、USER
语法:USER daemon。指定运行容器时的用户名或UID,后续的RUN指令也会使用指定用户。当服务不需要管理员权限时,可通过该命令指定运行用户,并且可以在之前创建所需要的用户。如:RUN groupadd -r postgres && useradd -r -g postgres postgres。若此时需要临时获取管理员权限,则可使用gosu,不推荐使用sudo。
12、WORKDIR
语法:WORKDIR /path/to/workdir。为后续的 RUN、CMD、ENTRYPOINT指令配置工作目录。可使用多个WORKDIR,若后面的WORKDIR指定的是相对路径,则是基于前一个WORKDIR指定的路径。如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 结果为:/a/b/c
13、ONBUILD
语法:ONBUILD [INSTRUCTION]。配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。如:Dockerfile使用如下的内容创建了镜像 image-A。
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
若基于image-A创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,即等价于在 FROM指令后添加了以上的两条指令。在使用ONBUILD指令的镜像,我们推荐在标签中注明,如:ruby:1.9-onbuild。
三、创建镜像
在编写完Dockerfile之后,可以通过 Docker build 命令来创建镜像。语法为:docker build [选项] 路径,即读取指定路径下的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此我们建议放置Dockerfile的目录为空目录。若为非空目录,希望忽略路径下的某些目录或文件,可通过 .dockerignore文件来配置。
# 指定Dockerfile路径所在路径为 /tmp/docker_builder/,希望生成镜像标签为 build_repo/first_image, # 在标签命名时需要注意,所有字母必须为小写
$ sudo docker build -t build_repo/first_image /tmp/docker_builder/
四、一个实例
根据以上信息,我们来自己创建一个Nginx镜像。
# 0. 创建Dockerfile所在目录
$ sudo mkdir /opt/tmp_dockerbuilder
# 1. 创建Dockerfile文件并编写内容
$ sudo vim Dockerfile
# Nginx
# VERSION 1.0
FROM ubuntu
MAINTAINER gongziqi 1415583094@qq.com
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# 2. 查看当前本地镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 3. build Dockerfile文件,创建镜像
$ sudo docker build -t nginx/mynginx /opt/tmp_dockerbuilder/Dockerfile
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu
---> 4e5021d210f6
Step 2/3 : MAINTAINER gongziqi 1415583094@qq.com
---> Running in 8dc5269da475
Removing intermediate container 8dc5269da475
---> e27af3f3a447
Step 3/3 : RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
---> Running in 2ec0f5b9fc81
........
........
........
Successfully built d27de6c7896d
Successfully tagged nginx/mynginx:latest
# 4. 再次查看本地镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx/mynginx latest d27de6c7896d 6 minutes ago 275MB
# 5. 以当前创建的镜像运行容器
$ sudo docker run -ti d27de6c7896d /bin/bash
root@a505965d1b84:/#
# 6. 查看当前的容器中是否有我们刚才需要安装的相关软件
root@a505965d1b84:/# find / -name apache2
/etc/cron.daily/apache2
/etc/init.d/apache2
/etc/logrotate.d/apache2
/etc/apache2
/etc/ufw/applications.d/apache2
find: '/proc/1/map_files': Operation not permitted
find: '/proc/12/map_files': Operation not permitted
/usr/lib/apache2
/usr/sbin/apache2
/usr/share/bug/apache2
/usr/share/doc/apache2
/usr/share/lintian/overrides/apache2
/usr/share/apache2
/var/cache/apache2
/var/lib/apache2
/var/log/apache2
# 7. 查看ubuntu镜像运行的容器中是否有apache2
$ sudo docker run -tid ubuntu /bin/bash
$ sudo docker exec -ti 6df8ff14f57f /bin/bash
root@6df8ff14f57f:/# find / -name apache2
find: '/proc/1/map_files': Operation not permitted
find: '/proc/10/map_files': Operation not permitted
find: '/proc/19/map_files': Operation not permitted
root@6df8ff14f57f:/#
# 说明:我们会发现刚才的配置的 apache2 软件已被安装,而基于的 ubuntu镜像本身是没有apache2的
八、【Docker笔记】使用Dockerfile创建镜像的更多相关文章
- [转]Docker基础-使用Dockerfile创建镜像
本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # T ...
- Docker基础-使用Dockerfile创建镜像
1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - ED ...
- docker——Dockerfile创建镜像
写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境 ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
- Docker实战(六)之使用Dockerfile创建镜像
Dockervile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义镜像. 1.基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行. 一般而言,Do ...
- docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...
- 使用Dockerfile创建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像. 一.基本结构 Dockerfile由一行行命令语句组成,并且支持以#开头的注释行. 一般而言,D ...
- centos7下安装docker(3.2创建镜像build)
通过Dockerfile创建镜像 注:这个Dockerfile一开始真的不知道是在哪来的,还以为是在官网下载下来得(当然网上也有很多dockerfile的模板,参考:https://hub.docke ...
- Dockerfile创建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像. Dockerfile由一行行命令语句组成,并且支持易#开头的注释行. 一般而言Dockerfil ...
随机推荐
- CyclicBarrier源码探究 (JDK 1.8)
CyclicBarrier也叫回环栅栏,能够实现让一组线程运行到栅栏处并阻塞,等到所有线程都到达栅栏时再一起执行的功能."回环"意味着CyclicBarrier可以多次重复使用,相 ...
- 第一个爬虫经历----豆瓣电影top250(经典案例)
因为要学习数据分析,需要从网上爬取数据,所以开始学习爬虫,使用python进行爬虫,有好几种模拟发送请求的方法,最基础的是使用urllib.request模块(python自带,无需再下载),第二是r ...
- django中ORM中锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- 原生ajax动态添加数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Nginx配置Web项目(多页面应用,单页面应用)
目前前端项目 可分两种: 多页面应用,单页面应用. 单页面应用 入口是一个html文件,页面路由由js控制,动态往html页面插入DOM. 多页面应用 是由多个html文件组成,浏览器访问的是对应服务 ...
- Java多线程详解(转载)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用 ...
- redis 持久化RDB、AOF
1.redis持久化简介 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合 ...
- 039.集群网络-Pod和SVC网络实践
一 Pod和SVC网络 1.1 实践准备及原理 Docker实现了不同的网络模式,Kubernetes也以一种不同的方式来解决这些网络模式的挑战.本完整实验深入剖析Kubernetes在网络层是如何实 ...
- 【简说Python WEB】flask-mail电子邮件异步Asynchronous
系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 flask-mail电子邮件异步Asynchronou ...
- iOS包重签名工具,ipa文件重签名,快速签名,SignTool签名工具,好用的签名工具,App重签名
新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 QQ交流群:811715780 进入 Proje ...