编写 DockerFile

编写 DockerFile

 

本节内容简介

在前面的实验中咱们屡次用到的 Dockerfile,在本实验里咱们将经过完成一个实例来学习Dockerfile的编写。html

本节中,咱们须要依次完成下面几项任务:web

  1. Dockerfile 基本框架
  2. Dockerfile 编写经常使用命令
  3. 从 Dockerfile 构建镜像

本次实验的需求是完成一个Dockerfile,经过该Dockerfile建立一个Web应用,该web应用为apache托管的一个静态页面网站,换句话说,咱们写一个Dockerfile,用来建立一个实验楼公司的网站应用,就是http://www.simplecloud.cn这个站点。这个站点是纯静态的页面,咱们也能够直接下载获得。docker

1、实验准备apache

一、建立 Dockerfile 文件ubuntu

首先,须要建立一个目录来存放 Dockerfile 文件,目录名称能够任意,在目录里建立Dockerfile文件:vim

cd /home/shiyanlou
mkdir shiyanloutest
cd shiyanloutest
touch Dockerfile

使用vim/gedit编辑Dockerfile文件,根据咱们的需求输入内容。浏览器

2、Dockerfile 基本框架bash

Dockerfile通常包含下面几个部分:架构

  1. 基础镜像:以哪一个镜像做为基础进行制做,用法是FROM 基础镜像名称
  2. 维护者信息:须要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER 名字/邮箱
  3. 镜像操做命令:对基础镜像要进行的改造命令,好比安装新的软件,进行哪些特殊配置等,常见的是RUN 命令
  4. 容器启动命令:当基于该镜像的容器启动时须要执行哪些命令,常见的是CMD 命令ENTRYPOINT

在本节实验中,咱们依次先把这四项信息填入文档。Dockerfile中的#标志后面为注释,能够不用写,另外实验楼的环境不支持中文输入,比较惋惜。app

依次输入下面的基本框架内容:

# 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,默认为latestRUN命令默认使用/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已运行:

3、Dockerfile 编写经常使用命令

在上述基本的架构下,咱们根据需求能够增长新的内容到Dockerfile中。后续的扩展操做都须要放置在Dockerfile的镜像操做部分。其中部分命令在本实验中并不会用到,但须要有所了解。

一、指定容器运行的用户

该用户将做为后续的RUN命令执行的用户。这个命令本实验不须要,但在一些须要指定用户来运行的应用部署时很是关键,好比提供hadoop服务的容器一般会使用hadoop用户来启动服务。

命令使用方式,例如使用shiyanlou用户来执行后续命令:

USER shiyanlou

二、指定后续命令的执行目录

因为咱们须要运行的是一个静态网站,将启动后的工做目录切换到/var/www/html目录:

WORKDIR /var/www/html

三、对外链接端口号

因为内部服务会启动Web服务,咱们须要把对应的80端口暴露出来,能够提供给容器间互联使用,可使用EXPOSE命令。

在镜像操做部分增长下面一句:

EXPOSE 80

四、设置容器主机名

ENV命令可以对容器内的环境变量进行设置,咱们使用该命令设置由该镜像建立的容器的主机名为shiyanloutest,向Dockerfile中增长下面一句:

ENV HOSTNAME shiyanloutest

五、向镜像中增长文件

向镜像中添加文件有两种命令: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

4、CMD 与 ENTRYPOINT

ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序同样,与CMD的区别是不能够被docker run覆盖,会把docker run后面的参数看成传递给ENTRYPOINT指令的参数。Dockerfile中只能指定一个ENTRYPOINT,若是指定了不少,只有最后一个有效。docker run命令的-entrypoint参数能够把指定的参数继续传递给ENTRYPOINT

在本实验中两种方式均可以选择。

5、挂载数据卷

将apache访问的日志数据存储到宿主机能够访问的数据卷中:

VOLUME ["/var/log/apche2"]

6、设置容器内的环境变量

使用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

7、使用 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"]

8、从 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 80

# 容器启动命令
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 80:80 --name web2 shiyanloutest:0.2

最后打开桌面上的firefox浏览器,输入本地地址访问127.0.0.1,看到咱们克隆的琛石科技的网站:

总结

  1. Dockerfile 基本框架
  2. Dockerfile 编写经常使用命令
  3. 从 Dockerfile 构建镜像

请务必保证本身可以动手完成整个实验,只看文字很简单,真正操做的时候会遇到各类各样的问题,解决问题的过程才是收获的过程。

相关文章
相关标签/搜索