Docker实战(五)编写Dockerfile

一、创建Dockerfile文件

首先,需要创建一个目录来存放 Dockerfile 文件,目录名称可以任意,在目录里创建Dockerfile文件:

二、Dockerfile 基本框架

Dockerfile一般包含下面几个部分:

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

在本节实验中,我们依次先把这四项信息填入文档。Dockerfile中的#标志后面为注释,可以不用写。

打开Dockerfile,依次输入下面的基本框架内容:


01

02

03

04

05

06

07

08

09

10

11

12

13

# Version 0.1

# 基础镜像

FROM debian:latest

# 维护者信息

MAINTAINER [email protected]

# 镜像操作命令

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创建新镜像了,先构建一个版本dockertest:0.1:


1

2

# 在dockertest目录,即Dockerfile所在的目录执行

docker build -t dockertest:0.1 .

构建需要安装apache2,会花几分钟,最后查看新创建的镜像:

使用该镜像创建容器site1,将容器中的端口8888映射到本地80端口:


1

docker run -d -p 8888:80 --name site1 dockertest:0.1

使用浏览器打开localhost:8888进行测试,查看是否apache已运行:

三、Dockerfile 编写常用命令

在上述基本的架构下,我们根据需求可以增加新的内容到Dockerfile中。后续的扩展操作都需要放置在Dockerfile的镜像操作部分。

1)指定容器运行的用户

该用户将作为后续的RUN命令执行的用户。命令使用方式,例如使用nginx用户来执行后续命令:


1

USER nginx

2)指定后续命令的执行目录

由于我们需要运行的是一个静态网站,将启动后的工作目录切换到/var/www/html目录:


1

WORKDIR /var/www/html

3)对外连接端口号

由于内部服务会启动Web服务,我们需要把对应的80端口暴露出来,可以提供给容器间互联使用,可以使用EXPOSE命令。

在镜像操作部分增加下面一句:


1

EXPOSE 80

4)设置容器主机名

ENV命令能够对容器内的环境变量进行设置,我们使用该命令设置由该镜像创建的容器的主机名为dockertest,向Dockerfile中增加下面一句:


1

ENV HOSTNAME dockertest

5)向镜像中增加文件

向镜像中添加文件有两种命令:COPY 和 ADD

COPY命令可以复制本地文件夹到镜像中:


1

COPY site1 /var/www/html

ADD 命令支持添加本地的tar压缩包到容器中指定目录,压缩包会被自动解压为目录,也可以自动下载URL并拷贝到镜像,例如:


1

2

ADD html.tar /var/www

ADD http://192.168.1.200/html.tar /var/www

6)CMD 与 ENTRYPOINT

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

7)挂载数据卷

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


1

VOLUME ["/var/log/apche2"]

8)设置容器内的环境变量

使用ENV设置一些apache启动的环境变量:


1

2

3

4

5

6

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

9)使用 Supervisord

CMD如果只有一个命令,那如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过link进行连接。如果一定要在一个容器中运行多个服务可以考虑用Supervisord来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。

首先安装Supervisord,添加下面内容到Dockerfile:


1

2

RUN apt-get install -yqq supervisor

RUN mkdir -p /var/log/supervisor

拷贝配置文件到指定的目录:


1

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

其中supervisord.conf文件需要放在dockertest目录下,文件内容如下:


1

2

3

4

5

[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


1

CMD ["/usr/bin/supervisord"]

四、从 Dockerfile 创建镜像

在dockertest文件夹中有如下三个文件:

Dockerfile


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

# debian apache2 php5 ssh vim

# Version 0.2

# 基础镜像

FROM debian:latest

# 维护者信息

MAINTAINER [email protected]

# 设置debian的镜像,加快速度

RUN echo ‘deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib‘ > /etc/apt/sources.list \

&& echo ‘deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib‘ >> /etc/apt/sources.list \

&& echo ‘deb http://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib‘ >> /etc/apt/sources.list

# 镜像操作命令

RUN apt-get -yqq update \

&& apt-get install -yqq supervisor openssh-server openssh-client vim \

&& apt-get install -yqq apache2 php5 php5-mcrypt php5-mysql php5-imagick php5-json php5-curl \

&& apt-get clean

# 设置 ssh,root密码为 www.wanglu.info

RUN echo ‘root:www.wanglu.info‘ | chpasswd \

&& mkdir /var/run/sshd \

&& sed -i ‘s/PermitRootLogin without-password/PermitRootLogin yes/‘ /etc/ssh/sshd_config

# 设置 supervisor

RUN mkdir -p /var/log/supervisor

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 拷贝phpinfo.php文件到容器的 /var/www/html

COPY phpinfo.php /var/www/html

ENV HOSTNAME docker-test

ENV APACHE_RUN_USER www-data

ENV APACHE_RUN_GROUP www-data

ENV APACHE_LOG_DIR /var/log/apache2

ENV APACHE_PID_FILE /var/run/apache2.pid

ENV APACHE_RUN_DIR /var/run/apache2

ENV APACHE_LOCK_DIR /var/lock/apache2

EXPOSE 22 80

# 启动容器命令

CMD ["/usr/bin/supervisord"]

supervisord.conf


1

2

3

4

5

6

7

8

9

# supervisord configuration

[supervisord]

nodaemon=true

[program:ssh]

command=/usr/sbin/sshd -D

[program:apache]

command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2ctl -D FOREGROUND"

phpinfo.php


1

2

<?php

phpinfo();

在dockertest目录下使用 docker build 执行创建,-t参数指定镜像名称:


1

docker build -t dockertest:0.2 .

docker images 查看创建的新镜像已经出现在了镜像列表中:

由该镜像创建新的容器site2,并映射本地的8080端口到容器的80端口、8022端口到容器的22端口:


1

docker run -d -p 8080:80 -p 8022:22 --name site2 dockertest:0.2

五、运行测试

部分操作截图:

打开测试网页

原文地址:https://www.cnblogs.com/weifeng1463/p/9476768.html

时间: 2024-07-31 09:40:26

Docker实战(五)编写Dockerfile的相关文章

Docker 实战—使用 Dockerfile 构建镜像

GitHub Page:http://blog.cloudli.top/posts/Docker实战-使用-Dockerfile-构建镜像/ Dockerfile 指令详解请访问:https://www.cnblogs.com/cloudfloating/p/11737447.html 使用 Alpine Linux 作为基础镜像 Alpine 是一个非常轻量的 Linux 镜像,他只有大约 5MB 的大小,基于它构建镜像,可以大大减少镜像的体积. Alpine 的 Docker Hub 页面:

Docker学习总结(1)——Docker实战之入门以及Dockerfile(一)

一.Docker是什么? 首先Docker是软件工业上的集装箱技术 回顾,在没有集装箱出现以前,传统运输行业中,会存在这些问题: 在运输过程中,货物损坏 装卸.运输货物,效率低下 运输手续繁多及运输环节多 劳动强度大,及船舶周转慢 在集装箱出现后,完全改变了这种状况,是由于集装箱: 规则标准化,大大减少了包装费用 大大提升了货物装卸效率.及运输效率 不同种运输工具之间转换更容易 所以,集装箱出现是传统行业中的一次重大变革 传统软件行业中存在的问题 软件更新发布低效 业务无法敏捷 环境一致性,难于

编写dockerfile

参考:http://www.cnblogs.com/liuyansheng/p/6098470.html 一.dockerfile介绍: 是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命令.Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile.Docker程序将读取Dockerfile,根据指令生成定制

Docker实战总结

一.Docker简介 Docker是一个开源的应用容器引擎,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署. 简单的理解,docker就是一个软件集装箱化平台,就像船只.火车.卡车运输集装箱而不论其内部的货物一样,软件容器充当软件部署的标准单元,其中可以包含不同的代码和依赖项. 按照这种方式容器化软件,开发人员和 IT 专业人员只需进行极少修改或不修改,即可将其部署到不同的环境,如果出现的故障,也可以通过镜像,快速恢复服务. 二.Docker优势 1

docker 实战---安装一个基础镜像 (一)

泡了几天官网,对docker有了一点了解.准备着手搭建一个公司的开发测试环境,包括java.python. 环境介绍 首先说明一下我的环境 2台物理服务器(后面简称主机) 主机A的配置如下: [[email protected] ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:p

Docker | 第五章:构建自定义镜像

前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时,一般上大小都比较大.所以本章节就主要结合Dockerfile文件及commit方式,构建属于自己的镜像,同时对镜像进行压缩和优化,同时也是对Dockerfile知识的一个实践. 利用Dockerfile构建自定义镜像 选定基础镜像 准备JRE版本 编写Dockerfile 实践:运行SpringB

docker 实践六:dockerfile 详解

本篇开始来学习关于 dockerfile 的知识. 注:环境为 CentOS7,docker 19.03. dockerfile 是?个?本格式的配置?件, ?户可以使? dockerfile 来快速创建?定义的镜像. 指令系统 dockerfile 主要是通过一个指令来实现想要的功能的.dockerfile 支持的指令如下 ARG 定义创建镜像过程中使?的变量.格式为: ARG<name>[=<default value>] 在执?docker build时, 可以通过 -bui

Docker学习5-Dockerfile编写自己的镜像

前言 Dockerfile 可以自定义编写镜像,简单来说就类似写脚本,shell脚本应该接触不少了,就是一个执行后就完成了. 当然做好的镜像也可以传到镜像仓库,就好像github上面一样存储,一个命令就能照搬下来安装. 一.简介 相信不少朋友会问,为何docker run 一下python就停止了呢?(那执行完了不停止干什么?) 还有为什么我的pip安装,每次安装完成了run下一个python容器就没有已安装的库了?显然run是每次都启动一个新的容器.所以不少网友提倡用Dockerfile制作.

System center 2012 R2 实战五、SCVMM2012R2介绍及安装

大家好,今天我来分享的是微软System center组件中第一个组件,SCVMM2012R2的安装,说起SCVMM2012R2,我还想与大家聊一聊,SCVMM2012R2在微软私有云中的作用. 我们知道,微软的私有云一共分为三个层,最底层,是基础架构层,基础架构层上面是服务标准与自动化流程,最上面的是应用管理层,那么什么是基础架构层,基础架构层在微软私有云中是干什么的呢,我先来跟大家说一说我的理解. 微软私有云基础架构层,在我看来,主要作用是,通过微软的云计算,改善企业的IT环境,将企业传统的

docker实战——在测试中使用Docker

在之前几章中介绍的都是Docker的基础知识,了解什么是镜像,docker基本的启动流程,以及如何去运作一个容器等等. 接下来的几个章节将介绍如何在实际开发和测试过程中使用docker. 将Docker作为本地Web开发环境是使用Docker的一个最简单的场景.这个环境可以完全重现生产环境,保证开发环境和部署环境一致.下面从将Nginx安装到容器来架构一个简单的网站开始. 使用Docker测试静态网站 ## 创建一个sample的镜像目录并创建一个Dockerfile # mkdir sampl