12 创建应用程序映像 #
适合在容器内部运行的应用程序包括守护程序、Web 服务器以及公开 IP 通讯端口的应用程序。您可以使用 Podman 通过在容器内部执行构建过程、构建映像,然后部署基于映像的容器来自动完成构建和部署过程。
在容器内部运行应用程序具有以下优势:
包含应用程序的映像可在运行不同 Linux 主机发行套件和版本的服务器之间移植。
可以使用储存库来共享应用程序的映像。
可以在容器和主机系统中使用不同的软件版本,而不会造成依赖关系方面的问题。
可以运行同一应用程序多个彼此独立的实例。
使用 Podman 构建应用程序可获得以下优势:
可以准备整个构建环境的映像。
应用程序可以在构建它的同一个环境中运行。
开发人员可以在同一环境中测试其代码,就如同在生产环境中使用时一样。
下一节提供了有关为应用程序创建容器映像的示例和建议。在继续操作之前,请确保已按照第 11.1 节 “提取基本 SLES 映像”中所述激活 SUSE Linux Enterprise Server 基本映像。
12.1 运行采用特定软件包版本的应用程序 #
如果您的应用程序所需的软件包版本不同于系统上安装的软件包版本,您可以创建一个包含应用程序所需软件包版本的容器映像。下面的示例 Dockerfile
允许使用较旧的 example
软件包版本构建基于最新 SUSE Linux Enterprise Server 版本的映像:
FROM registry.suse.com/suse/sle15 LABEL maintainer=EXAMPLEUSER_PLAIN RUN zypper ref && zypper in -f example-1.0.0-0 COPY application.rpm /tmp/ RUN zypper --non-interactive in /tmp/application.rpm ENTRYPOINT ["/etc/bin/application"] CMD ["-i"]
通过在 Dockerfile
所在的目录中运行以下命令来构建映像:
> podman build --tag tux_application:latest .
上面显示的 Dockerfile
示例会在 podman build
运行期间执行以下操作:
更新 SUSE Linux Enterprise Server 储存库。
安装所需的
example
软件包版本。将应用程序软件包复制到映像。必须在构建环境中放置二进制 RPM。
将应用程序解包。
最后两个步骤会在容器启动后运行应用程序。
成功构建 tux_application
映像后,可使用以下命令启动基于新映像的容器:
> podman run -it --name application_instance tux_application:latest
请记住,关闭应用程序后,容器也会退出。
12.2 运行采用特定配置的应用程序 #
要运行使用不同配置的实例,请创建派生映像并在其中包含附加配置。以下示例使用文件 /etc/example/configuration_example
配置名为 example 的应用程序:
FROM registry.suse.com/suse/sle15 1 RUN zypper ref && zypper --non-interactive in example 2 ENV BACKUP=/backup 3 RUN mkdir -p $BACKUP 4 COPY configuration_example /etc/example/ 5 ENTRYPOINT ["/etc/bin/example"] 6
以上示例 Dockerfile
执行以下操作:
12.3 在应用程序与主机系统之间共享数据 #
Podman 允许使用卷在主机和容器之间共享数据。您可以直接在 Dockerfile
中指定挂载点。但是,不能在 Dockerfile
中指定主机系统上的目录,因为该目录在构建时可能无法访问。在主机系统上的 /var/lib/docker/volumes/
下找到挂载的目录。
使用 VOLUME
指令指定挂载点后,将会丢弃使用 RUN
指令对目录所做的所有更改。指定挂载点后,该卷将成为临时容器的一部分,而成功构建后会去除该临时容器。这表示要使某些操作生效,必须在指定挂载点之前执行这些操作。例如,如果您需要更改权限,请先进行更改,然后再在 Dockerfile
中将目录指定为挂载点。
运行容器时,使用 -v
选项指定主机系统上的特定挂载点:
> podman run -it --name testing -v /home/tux/data:/data sles12sp4:latest /bin/bash
如果您在容器中指定相同的挂载点,-v
选项会重写 VOLUME
指令。
以下 Dockerfile
示例将构建一个映像,其中包含一个从主机文件系统读取 Web 内容的 Web 服务器。
FROM registry.suse.com/suse/sles12sp4 RUN zypper ref && zypper --non-interactive in apache2 COPY apache2 /etc/sysconfig/ RUN chown -R admin /data EXPOSE 80 VOLUME /data ENTRYPOINT ["apache2ctl"]
上面的示例将 Apache Web 服务器安装到映像,并将整个配置复制到该映像。data
目录由 admin 用户拥有,用作存储网页的挂载点。
12.4 在后台运行的应用程序 #
如果您的应用程序需要作为守护程序在后台运行,或者作为公开通讯端口的应用程序运行,您可以在后台运行容器。
公开端口的应用程序的示例 Dockerfile
如下所示:
FROM registry.suse.com/suse/sle15 1 LABEL maintainer=EXAMPLEUSER_PLAIN 2 ADD etc/ /etc/zypp/ 3 RUN zypper refs && zypper refresh 4 RUN zypper --non-interactive in apache2 5 RUN echo "The Web server is running" > /srv/www/htdocs/test.html 6 # COPY data/* /srv/www/htdocs/ 7 EXPOSE 80 8 ENTRYPOINT ["/usr/sbin/httpd"] CMD ["-D", "FOREGROUND"]
按第 11.1 节 “提取基本 SLES 映像”中所述提取基本映像。 | |
映像的维护者(可选)。 | |
要复制到 | |
用于刷新储存库和服务的命令。 | |
用于安装 Apache2 的命令。 | |
用于调试的测试代码行。如果一切符合预期,则可以删除此行。 | |
| |
Apache Web 服务器的公开端口。 |
要使用端口 80,请确保主机中没有任何其他服务器软件在此端口上运行。
要使用容器,请执行以下操作:
准备好用于执行构建过程的主机系统。
确保主机系统已订阅 SUSE Linux Enterprise Server 的 Server Applications 模块。要查看已安装的模块或安装其他模块,请打开 YaST 并选择“添加系统扩展或模块”。
确保已按照第 11.1 节 “提取基本 SLES 映像”中所述安装了 SUSE 注册表中的 SLE 映像。
将
Dockerfile
保存到docker
目录中。在容器中,您需要访问已在主机上注册的储存库和服务。要使这些储存库和服务可用,请将主机中其对应的文件复制到
docker/etc
目录:> cd docker > mkdir etc > sudo cp -a /etc/zypp/{repos.d,services.d} etc/
您也可以不复制所有储存库和服务文件,只复制容器所需的一部分文件。
将网站数据(例如 HTML 文件)添加到
docker/data
目录中。此目录的内容将复制到容器映像,从而由 Web 服务器发布。
构建容器。使用
-t
选项为映像设置标签(在下面的命令中,标签为EXAMPLEUSER_PLAIN/apache2
):> docker build -t EXAMPLEUSER_PLAIN/apache2 .
Docker 开源引擎会执行
Dockerfile
中提供的指令:提取基本映像、复制内容、刷新储存库、安装 Apache2 等从上一步中创建的映像启动容器实例:
> docker run --detach --interactive --tty EXAMPLEUSER_PLAIN/apache2
Docker 开源引擎将返回容器 ID,例如:
7bd674eb196d330d50f8a3cfc2bc61a243a4a535390767250b11a7886134ab93
在浏览器中指向 http://localhost:80/test.html。您应该会看到消息 Web 服务器正在运行。
要查看正在运行的容器的概览,请运行
docker ps --latest
命令:> docker ps --latest CONTAINER ID IMAGE COMMAND [...] 7bd674eb196d tux/apache2 "/usr/sbin/httpd -..." [...]
要停止并删除容器,请运行以下命令:
> docker rm --force 7bd674eb196d
您可以执行以下步骤来使用生成的容器通过 Apache2 Web 服务器提供数据:
在
Dockerfile
中:在示例
Dockerfile
中,注释掉以RUN echo
开头的行,方法是在此行的开头添加#
字符。在示例
Dockerfile
中,取消注释以COPY
开头的行,方法是去除前导#
字符。
重构建映像。
在分离模式下运行映像:
> docker run --detach --interactive --tty EXAMPLEUSER_PLAIN/apache2
Docker 开源引擎将返回容器 ID,例如:
e43fff4ae9832ecdb7677c058a73039d7610c32145a1d9b6ad0a4ed52b5c4dc7
要查看已发布的数据,请在浏览器中指向 http://localhost:80/test.html。
为了避免将网站数据复制到容器中,请与容器共享主机的某个目录。有关详细信息,请参见 https://docs.docker.com/storage/volumes/。