编写 DockerFile
编写 DockerFile
本节内容简介
在前面的实验中我们多次用到的 Dockerfile,在本实验里我们将通过完成一个实例来学习Dockerfile的编写。
本节中,我们需要依次完成下面几项任务:
- Dockerfile 基本框架
- Dockerfile 编写常用命令
- 从 Dockerfile 构建镜像
本次实验的需求是完成一个Dockerfile,通过该Dockerfile创建一个Web应用,该web应用为apache托管的一个静态页面网站,换句话说,我们写一个Dockerfile,用来创建一个实验楼公司的网站应用,就是http://www.simplecloud.cn这个站点。这个站点是纯静态的页面,我们也可以直接下载得到。
一、实验准备
1、创建 Dockerfile 文件
首先,需要创建一个目录来存放 Dockerfile 文件,目录名称可以任意,在目录里创建Dockerfile文件:
cd /home/shiyanlou
mkdir shiyanloutest
cd shiyanloutest
touch Dockerfile
使用vim/gedit编辑Dockerfile文件,根据我们的需求输入内容。
二、Dockerfile 基本框架
Dockerfile一般包含下面几个部分:
- 基础镜像:以哪个镜像作为基础进行制作,用法是
FROM 基础镜像名称
- 维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是
MANITAINER 名字/邮箱
- 镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是
RUN 命令
- 容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是
CMD 命令
或ENTRYPOINT
在本节实验中,我们依次先把这四项信息填入文档。Dockerfile中的#
标志后面为注释,可以不用写,另外实验楼的环境不支持中文输入,比较可惜。
依次输入下面的基本框架内容:
# Version 0.1 # 基础镜像
FROM ubuntu:latest # 维护者信息
MAINTAINER shiyanlou@shiyanlou.com # 镜像操作命令
RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean # 容器启动命令
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
上面的Dockerfile非常简单,创建了一个apache的镜像。包含了最基本的四项信息。
其中FROM
指定基础镜像,如果镜像名称中没有制定TAG,默认为latest
。RUN
命令默认使用/bin/sh
Shell执行,默认为root权限。如果命令过长需要换行,需要在行末尾加\
。CMD
命令也是默认在/bin/sh
中执行,并且默认只能有一条,如果是多条CMD
命令则只有最后一条执行。用户也可以在docker run
命令创建容器时指定新的CMD
命令来覆盖Dockerfile里的CMD
。
这个Dockerfile已经可以使用docker build
创建新镜像了,先构建一个版本shiyanloutest:0.1:
cd /home/shiyanlou/shiyanloutest
docker build -t shiyanloutest:0.1 .
构建需要安装apache2,会花几分钟,最后查看新创建的镜像:
使用该镜像创建容器web1,将容器中的端口80映射到本地80端口:
使用实验环境桌面上的firefox浏览器打开localhost
进行测试,查看是否apache已运行:
三、Dockerfile 编写常用命令
在上述基本的架构下,我们根据需求可以增加新的内容到Dockerfile中。后续的扩展操作都需要放置在Dockerfile的镜像操作部分。其中部分命令在本实验中并不会用到,但需要有所了解。
1、指定容器运行的用户
该用户将作为后续的RUN命令执行的用户。这个命令本实验不需要,但在一些需要指定用户来运行的应用部署时非常关键,比如提供hadoop服务的容器通常会使用hadoop
用户来启动服务。
命令使用方式,例如使用shiyanlou用户来执行后续命令:
USER shiyanlou
2、指定后续命令的执行目录
由于我们需要运行的是一个静态网站,将启动后的工作目录切换到/var/www/html
目录:
WORKDIR /var/www/html
3、对外连接端口号
由于内部服务会启动Web服务,我们需要把对应的80端口暴露出来,可以提供给容器间互联使用,可以使用EXPOSE
命令。
在镜像操作部分增加下面一句:
EXPOSE
4、设置容器主机名
ENV
命令能够对容器内的环境变量进行设置,我们使用该命令设置由该镜像创建的容器的主机名为shiyanloutest
,向Dockerfile中增加下面一句:
ENV HOSTNAME shiyanloutest
5、向镜像中增加文件
向镜像中添加文件有两种命令:COPY
和ADD
。
COPY simplecloudsite /var/www/html
ADD
命令支持添加本地的tar压缩包到容器中指定目录,压缩包会被自动解压为目录,也可以自动下载URL并拷贝到镜像,例如:
ADD html.tar /var/www
ADD http://www.shiyanlou.com/html.tar /var/www
根据实验需求,我们把需要的一个网站放到镜像里,需要把一个tar
包添加到apache的/var/www
目录下,因此选择使用 ADD
命令:
ADD html.tar /var/www
四、CMD 与 ENTRYPOINT
ENTRYPOINT
容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD
的区别是不可以被docker run
覆盖,会把docker run
后面的参数当作传递给ENTRYPOINT
指令的参数。Dockerfile中只能指定一个ENTRYPOINT
,如果指定了很多,只有最后一个有效。docker run
命令的-entrypoint
参数可以把指定的参数继续传递给ENTRYPOINT
。
在本实验中两种方式都可以选择。
五、挂载数据卷
将apache访问的日志数据存储到宿主机可以访问的数据卷中:
VOLUME ["/var/log/apche2"]
六、设置容器内的环境变量
使用ENV
设置一些apache启动的环境变量:
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apche2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apche2
七、使用 Supervisord
CMD如果只有一个命令,那如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过link进行连接,比如先前实验中用到的web,app,db容器。如果一定要在一个容器中运行多个服务可以考虑用Supervisord
来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。
首先安装Supervisord
,添加下面内容到Dockerfile:
RUN apt-get install -yqq supervisor
RUN mkdir -p /var/log/supervisor
拷贝配置文件到指定的目录:
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
其中supervisord.conf
文件需要放在/home/shiyanlou/shiyanloutest
下,文件内容如下:
[supervisord]
nodaemon=true [program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2ctl -D FOREGROUND"
如果有多个服务需要启动可以在文件后继续添加[program:xxx]
,比如如果有ssh服务,可以增加[program:ssh]
。
修改CMD
命令,启动Supervisord
:
CMD ["/usr/bin/supervisord"]
八、从 Dockerfile 创建镜像
将上述内容完成后放入到/home/shiyanlou/shiyanloutest/Dockerfile
文件中,最终得到的Dockerfile文件如下:
# Version 0.2 # 基础镜像
FROM ubuntu:latest # 维护者信息
MAINTAINER shiyanlou@shiyanlou.com # 镜像操作命令
RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean
RUN apt-get install -yqq supervisor
RUN mkdir -p /var/log/supervisor VOLUME ["/var/log/apche2"] ADD html.tar /var/www
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf WORKDIR /var/www/html ENV HOSTNAME shiyanloutest
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apche2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apche2 EXPOSE # 容器启动命令
CMD ["/usr/bin/supervisord"]
同时在/home/shiyanlou/shiyanloutest
目录下,添加supervisord.conf
文件:
[supervisord]
nodaemon=true [program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2ctl -D FOREGROUND"
并下载静态页面文件压缩包:
cd /home/shiyanlou/shiyanloutest
wget http://labfile.oss.aliyuncs.com/courses/498/html.tar
将http://simplecloud.cn
网站的页面tar包下载到/home/shiyanlou/shiyanloutest
目录:
docker build
执行创建,-t
参数指定镜像名称:
docker build -t shiyanloutest:0.2 /home/shiyanlou/shiyanloutest/
docker images
查看创建的新镜像已经出现在了镜像列表中:
docker inspect shiyanloutest:0.2
查看该镜像的详细信息:
由该镜像创建新的容器web2,并映射本地的80端口到容器的80端口:
docker run -d -p : --name web2 shiyanloutest:0.2
最后打开桌面上的firefox浏览器,输入本地地址访问127.0.0.1
,看到我们克隆的琛石科技的网站:
总结
- Dockerfile 基本框架
- Dockerfile 编写常用命令
- 从 Dockerfile 构建镜像
请务必保证自己能够动手完成整个实验,只看文字很简单,真正操作的时候会遇到各种各样的问题,解决问题的过程才是收获的过程。
编写 DockerFile的更多相关文章
- 实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署
最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7 ...
- 编写Dockerfile自定义镜像
要求 编写一个Dockerfile自定义centos镜像,要求在容器内部可以使用vim和ifconfig命令,并且登入落脚点为/usr/local 编写Dockerfile FROM centos M ...
- 编写 Dockerfile 生成自定义镜像
一般情况下我们可以从公共渠道诸如 DockerHub 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dock ...
- Docker实战(五)编写Dockerfile
一.创建Dockerfile文件 首先,需要创建一个目录来存放 Dockerfile 文件,目录名称可以任意,在目录里创建Dockerfile文件: 二.Dockerfile 基本框架 Dockerf ...
- (转)编写 DockerFile
这几天在研究怎样制作docker image. 其中使用dockerfile是一种可记录制作image的过程的并且是容易重复使用的一种方式.在园子里看到了一篇好文,于是分享到这里~~ 原文链接: ht ...
- 编写dockerfile
参考:http://www.cnblogs.com/liuyansheng/p/6098470.html 一.dockerfile介绍: 是一种被Docker程序解释的脚本,Dockerfile由一条 ...
- 编写 Dockerfile 最佳实践
官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了. Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文 ...
- 学习编写Dockerfile
前言 我们学习docker的话,其主要目的还是要用来改变我们部署应用程序的传统习惯,达到解放生产力,解放人力的目的.这篇则自己来熟悉一下dockerfile常用命令.并且尝试改变下生产环境手动部署应用 ...
- Docker实战-编写Dockerfile
一.编译镜像 1. 编译镜像 Dockerfile类似于Makfile,用户使用docker build就可以编译镜像,使用该命令可以设置编译镜像时使用的CPU数量.内存大小.文件路径等 语法:doc ...
随机推荐
- Linux命令行编辑常见的快捷键(有用, 通用)
本文讲述了Linux命令行编辑常见的快捷键,希望对您有所帮助. Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 ...
- ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)
1.题目描写叙述:点击打开链接 2.解题思路:本题是四色定理的模板题.只是有几种情况要提前特判一下:n==1直接输出,1<n<5时候无解,n==6时候套用模板会出现同样的块.因此要特判一下 ...
- c语言-递推算法1
递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从 ...
- remote connect openshift mysql
再虚拟机内 rhc port-forward <app-name> 此时,可以在本机 访问 127.0.0.1:8080 登陆 网页, 3306连接sql https://unix.st ...
- android mvp高速开发框架介绍(dileber的简单介绍)
今天我为大家介绍一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 我个人qq:2971 ...
- 【BZOJ2795】[Poi2012]A Horrible Poem hash
[BZOJ2795][Poi2012]A Horrible Poem Description 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串 ...
- Grid++Report设置显示固定行数
一.要实现的功能打印的报表显示固定的行数,并且设置字段的文字可以自动换行二.设置步骤1.鼠标左键单击“明细网格”栏,在右侧属性窗口中设置“追加空白行”属性值为:是:“追加空白行在后”属性值为:是.2. ...
- arm处理器的历史及现状
1 arm处理器的发展历史 arm1 arm2 arm3 arm6 arm7 arm9 arm11 arm cortex 2 arm处理器现状 arm cortex A a即application,即 ...
- eclipse中怎么删除重复的console
eclipse中不同的应用会开启不同的console,所以并不是重复. 如图: Terminate标志/操作按钮,可以停止当前的执行,以及标志此Console是Terminated状态: Remove ...
- mongodb学习之:副本集
前面一张介绍了主从模式,现在mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式.副本集不能在一台电脑上操作.需要准备3台电脑进行搭建.副本集就是mongoDB副本所组成的一个集群. ...