如何使用 Dockerfile 自动构建和配置自定义 Docker 镜像 - 第 3 部分
本教程将集中介绍如何基于Ubuntu构建自定义 Docker 镜像并安装Apache服务。整个过程将使用Dockerfile自动完成。
Docker 镜像可以从名为Dockerfiles的文本文件自动构建。Docker 文件包含用于创建和配置 Docker 镜像的分步有序说明或命令。
要求
基本上,Docker 文件包含各种指令,以便根据您的要求构建和配置特定容器。以下指令是最常用的,其中一些是强制性的:
FROM
= 作为 Docker 文件中的第一条指令是必需的。指示 Docker 拉取您要从中构建新映像的基础映像。使用标签指定您要从中构建的确切映像:
Ex: FROM ubuntu:20.04
MAINTAINER
= 构建图像的作者RUN
= 该指令可以在多行中使用,并在创建 Docker 镜像后运行任何命令。CMD
= 在 Docker 镜像启动时运行任意命令。Dockerfile 中只能使用一个 CMD 指令。ENTRYPOINT
= 与 CMD 相同,但用作图像的主命令。EXPOSE
= 指示容器在运行时监听网络端口。默认情况下,容器端口无法从主机访问。ENV
= 设置容器环境变量。ADD
= 复制资源(文件、目录或来自 URL 的文件)。
步骤 1:创建或编写 Dockerfile 存储库
1.首先,让我们创建某种Dockerfile存储库,以便将来重用这些文件来创建其他映像。在/var
分区中的某个地方创建一个空目录,我们将在其中创建文件,其中包含用于构建新 Docker 映像的指令。
# mkdir -p /var/docker/ubuntu/apache # touch /var/docker/ubuntu/apache/Dockerfile
2.接下来,按照以下说明开始编辑文件:
# vi /var/docker/ubuntu/apache/Dockerfile
Dokerfile 摘录:
FROM ubuntu MAINTAINER your_name <user@domain.tld> RUN apt-get -y install apache2 RUN echo “Hello Apache server on Ubuntu Docker” > /var/www/html/index.html EXPOSE 80 CMD /usr/sbin/apache2ctl -D FOREGROUND
现在,让我们看一下文件说明:
第一行告诉我们,我们正在从Ubuntu镜像构建。如果没有提交标签,例如14:10 ,则使用Docker Hub中的最新镜像。
在第二行,我们添加了镜像创建者的姓名和电子邮件。接下来的两行RUN将在构建镜像时在容器中执行,并将安装Apache守护程序并将一些文本回显到默认的 apache 网页中。
EXPOSE行将指示Docker容器监听端口80,但该端口对外不可用。最后一行指示容器启动后在前台运行 Apache 服务。
3.我们需要做的最后一件事是通过发出以下命令开始创建映像,该命令将根据ubuntu-apache
之前创建的 Dockerfile 在本地创建一个新的 Docker 映像,如本例所示:
# docker build -t ubuntu-apache /var/docker/ubuntu/apache/
4. Docker创建映像后,您可以列出所有可用映像,并通过发出以下命令来识别您的映像:
# docker images
步骤 2:运行容器并从 LAN 访问 Apache
5.为了持续运行容器(在后台)并从主机或 LAN 中的其他远程机器访问容器公开的服务(端口),请在主机终端提示符下运行以下命令:
# docker run -d -p 81:80 ubuntu-apache
此处,-d
选项在后台运行ubuntu-apache
容器(作为守护进程),并将-p
容器端口80映射到本地主机端口81 。外部 LAN 对 Apache 服务的访问只能通过端口81进行。
Netstat 命令将让您了解主机正在监听哪些端口。
容器启动完成后,还可以通过运行docker ps
命令来查看容器的运行状态。
6.您可以使用curl实用程序从命令行针对您的机器 IP 地址、localhost 或端口 81 上的 docker 网络接口显示网页。使用IP 命令行显示网络接口 IP 地址。
# ip addr [List nework interfaces] # curl ip-address:81 [System Docker IP Address] # curl localhost:81 [Localhost]
7.要从您的网络访问容器网页,请在远程位置打开浏览器并使用 HTTP 协议、运行容器的机器的 IP 地址以及端口 81,如下图所示。
http://ip-address:81
8.要了解容器内正在运行的进程,请发出以下命令:
# docker ps # docker top <name or ID of the container>
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
现在,您可以仅使用指定的名称来引用容器进行操作(开始、停止、顶部、统计等)。
# docker stats my-www
步骤3:为Docker容器创建系统范围的配置文件
11.在CentOS/RHEL上,您可以创建一个systemd配置文件并像管理任何其他本地服务一样管理容器。
例如,apache-docker.service
使用以下命令创建一个名为的新 systemd 文件:
# 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可以做什么,但您可以预先构建一些非常复杂的应用程序,只需几秒钟即可以最少的资源和精力启动它们。
进一步阅读: