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