本教程将集中介绍如何基于Ubuntu构建一个安装了Apache服务的自定义Docker镜像。整个过程将使用Dockerfile自动完成。
Docker镜像可以从名为Dockerfiles的文本文件中自动构建。一个Docker文件包含了用于创建和配置Docker镜像的一步步有序的说明或命令。
基本上,一个Docker文件包含各种指令,以便根据你的需求构建和配置特定的容器。以下指令是最常用的,其中一些是强制性的。
FROM = 作为Docker文件的第一条指令,是必须的。指示Docker拉取你要构建新镜像的基础镜像。使用一个标签来指定你要构建的确切镜像。
例如:FROM ubuntu:20.04
MAINTAINER = 构建镜像的作者。
RUN = 这条指令可以在多行中使用,并在创建Docker镜像后运行任何命令。
CMD = 在启动Docker镜像时运行任何命令。在一个Docker文件中只能使用一条CMD指令。
ENTRYPOINT = 与CMD相同,但作为镜像的主命令使用。
EXPOSE = 指示容器在运行时监听网络端口。默认情况下,容器的端口无法从主机到达。
ENV = 设置容器环境变量。
ADD = 复制资源(文件、目录或 URL 中的文件)。
一、创建或编写Dockerfile Repository。
1、首先,让我们创建某种Dockerfile存储库,以便将来重用文件来创建其他镜像。在/var分区的某个地方建立一个空目录,我们将在那里创建一个文件,其中包含将用于构建新的Docker镜像的说明。

# mkdir -p /var/docker/ubuntu/apache
# touch /var/docker/ubuntu/apache/Dockerfile

2、接下来,开始按以下说明编辑文件。

# vi /var/docker/ubuntu/apache/Dockerfile

Dokerfile介绍:

dockerrocketmq 自动创建主题 自动生成dockerfile_docker

现在,我们来看看文件说明。
第一行:我们正在从Ubuntu镜像中构建。如果没有提交标签,比如说14:10,就会使用Docker Hub的最新镜像。
第二行:我们已经添加了镜像创建者的名字和电子邮件。
第三四两行:RUN将在构建镜像时在容器中执行,并将安装Apache daemon,并将一些文本呼应到默认的apache网页中。
EXPOSE行:将指示Docker容器监听80端口,但该端口将不对外界开放。
最后一行:指示容器启动后在前台运行Apache服务。
3、 最后我们需要做的是开始创建镜像,发出下面的命令,将根据之前创建的Dockerfile在本地创建一个名为ubuntu-apache的新Docker镜像,如下所示。

# docker build -t ubuntu-apache /var/docker/ubuntu/apache/

dockerrocketmq 自动创建主题 自动生成dockerfile_apache_02

4、在Docker创建镜像后,你可以通过发出以下命令来列出所有可用的镜像并识别你的镜像。

# docker image

dockerrocketmq 自动创建主题 自动生成dockerfile_apache_03

二、运行容器并从局域网访问Apache。
5、为了连续(在后台)运行容器并从主机或局域网中的其他远程机器访问容器暴露的服务(端口),请在主机终端提示符上运行以下命令:

# docker run -d -p 81:80 ubuntu-apache

dockerrocketmq 自动创建主题 自动生成dockerfile_apache_04

其中,-d是在后台运行ubuntu-apache容器(作为一个守护进程),-p是将容器的端口80映射到你的localhost端口81。局域网外访问Apache服务只能通过81端口。
Netstat命令可以让你了解主机监听的端口。
容器启动后,你也可以运行docker ps命令查看运行容器的状态。
6、可以使用curl实用程序从命令行在主机上将网页显示在主机IP地址,端口81上的localhost或docker net接口上。使用IP命令行显示网络接口IP地址。

# ip addr               [List nework interfaces]
# curl ip-address:81    [System Docker IP Address]
# curl localhost:81     [Localhost]

dockerrocketmq 自动创建主题 自动生成dockerfile_apache_05

7、要从网络上访问容器网页,在远程打开浏览器,使用HTTP协议,容器运行的机器的IP地址,后面是81端口,如下所示:
http://ip-address:81dockerrocketmq 自动创建主题 自动生成dockerfile_Docker_06

8、要了解容器内有哪些进程在运行,请发出以下命令:

# docker ps
# docker top <name or ID of the container>

dockerrocketmq 自动创建主题 自动生成dockerfile_docker_07

9、要停止容器,请发出docker stop命令,后面跟上容器ID或名称。

# docker stop <name or ID of the container>
# docker ps

10、如果您想为容器指定一个描述性的名称,请使用–name选项,如下例所示。

# docker run --name my-www -d -p 81:80 ubuntu-apache
# docker ps

dockerrocketmq 自动创建主题 自动生成dockerfile_apache_08

现在你可以只通过使用分配的名称来引用容器进行操作(开始、停止、顶部、统计等)。

# docker stats my-www

dockerrocketmq 自动创建主题 自动生成dockerfile_Docker_09

三、为Docker容器创建一个全系统的配置文件。
11、 在CentOS/RHEL上,你可以创建一个systemd配置文件,像管理其他本地服务一样管理容器。
例如,使用以下命令创建一个新的systemd文件,比如说,apache-docker.service。

# vi /etc/systemd/system/apache-docker.service

apache-docker.service摘要:

[Unit]
Description=apache container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a my-www
ExecStop=/usr/bin/docker stop -t 2 my-www

[Install]
WantedBy=local.target

12.、完成文件编辑后,关闭文件,重新加载 systemd 守护进程以反映更改,并通过执行以下命令启动容器。

# systemctl daemon-reload
# systemctl start apache-docker.service
# systemctl status apache-docker.service

这只是一个简单的示例,说明使用简单的Dockerfile可以实现什么功能,但是您可以预先构建一些非常复杂的应用程序,只需几秒钟就可以启动这些应用程序,而所需的资源和工作量却非常小。