如何使用最佳实践创建生产就绪 Docker 图像?
How to create Production ready Docker images using best practices?
创建 Docker 图像对于测试环境来说是一项简单的任务。但是当涉及到生产实施时,我们必须遵循最佳实践来克服任何安全和工作流程问题。
创建生产就绪 docker 映像的最佳做法是什么?
如 Create Production Docker Images in 5 Steps by DevopsAnswers 中的全面描述,以下步骤将被视为创建生产就绪 Docker 图像的综合指南。
创建生产 Docker 图像时,您应该广泛了解 Docker 最佳实践。
第 1 步:使用轻量级基础 Docker 图片
使用轻量级图像比使用庞大的基础图像更好,因为生成的 Docker 图像在尺寸较小时使用起来会更方便。
如果您计划在高度关键的生产系统中使用 Docker,您无法承受几秒钟的停机时间,那么您必须首先选择一个用于您的自定义 docker 图片。
步骤 2:减少中间层
在Dockerfile
中,每条指令如FROM
、LABEL
、RUN
、CMD
、ADD
等将是向 Docker 图像添加一个新层。因此,最好的做法是多次减少相同指令的使用,因为它会给你一个稍微小一点的图像。
第 3 步:选择特定版本
在 Docker 说明中选择特定版本是一个很好的做法,因为这将使生产实施保持良好和稳定。
想象一下,如果我们使用 Ubuntu:latest
作为基础图像。它将使用当前可用的最新 Ubuntu 图像作为我们的自定义 Docker 图像。此外,我们将根据相同的 Ubuntu 版本设置所有软件组件。
当 Ubuntu 在 Docker Hub 中使用较新的基础映像更新最新标签时,您可能会在生产 Docker 映像中遇到一些包依赖性问题或不兼容问题。
此外,我们应该始终尝试安装特定的包版本,而不是安装通用包。
示例
推荐apt-get install mysql-server-5.5
不推荐apt-get install mysql-server
第 4 步:不包含敏感数据
使用数据库凭据和 API 密钥等敏感数据在 Docker 中将是一项具有挑战性的任务。
Do not hard code any login credentials within a Docker image
要克服此限制,您应该有效地使用环境变量。
例如,如果您创建一个连接到 Mysql 数据库的 Drupal 映像,我们可以将 Drupal MySQL 数据库设置留空,如下所示。
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => '',
'username' => '',
'password' => '',
'host' => '',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
现在我们可以使用 ENTRYPOINT
利用环境变量在 运行 时间内替换 Drupal MySQL 数据库凭据,如下所示。
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2.pid
# Define Drupal home file path
DRUPAL_HOME="/var/www/html"
# Define Drupal settings file path
DRUPAL_SETTINGS_FILE="${DRUPAL_HOME}/sites/default/settings.php"
# Check the avilability of environment variables
if [ -n "$DRUPAL_MYSQL_DB" ] && [ -n "$DRUPAL_MYSQL_USER" ] && [ -n "$DRUPAL_MYSQL_PASS" ] && [ -n "$DRUPAL_MYSQL_HOST" ] ; then
echo "Setting up Mysql DB in $DRUPAL_SETTINGS_FILE"
# Set Database
sed -i "s/'database' *=> *''/'database' => '"$DRUPAL_MYSQL_DB"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql username
sed -i "s/'username' *=> *''/'username' => '"$DRUPAL_MYSQL_USER"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql password
sed -i "s/'password' *=> *''/'password' => '"$DRUPAL_MYSQL_PASS"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql host
sed -i "s/'host' *=> *''/'host' => '"$DRUPAL_MYSQL_HOST"'/g" $DRUPAL_SETTINGS_FILE
fi
# Start Apache in foreground
tail -F /var/log/apache2/* &
exec /usr/sbin/apache2ctl -D FOREGROUND
最后,您可以在 Docker 运行 时间内简单地定义环境变量,如下所示。
docker run -d -t -i
-e DRUPAL_MYSQL_DB='database'
-e DRUPAL_MYSQL_USER='user'
-e DRUPAL_MYSQL_PASS='password'
-e DRUPAL_MYSQL_HOST='host'
-p 80:80
-p 443:443
--name <container name>
<custom image>
第 5 步:运行CMD/Entypoint 来自非特权用户
使用非特权用户 运行 生产系统始终是一个不错的选择,从安全角度来看也更好。
您可以简单地将 USER
条目放在 CMD
或 ENTRYPOINT
之前 Docker 文件中,如下所示。
# Set running user of ENTRYPOINT
USER www-data
# Start entrypoint
ENTRYPOINT ["entrypoint"]
创建 Docker 图像对于测试环境来说是一项简单的任务。但是当涉及到生产实施时,我们必须遵循最佳实践来克服任何安全和工作流程问题。
创建生产就绪 docker 映像的最佳做法是什么?
如 Create Production Docker Images in 5 Steps by DevopsAnswers 中的全面描述,以下步骤将被视为创建生产就绪 Docker 图像的综合指南。
创建生产 Docker 图像时,您应该广泛了解 Docker 最佳实践。
第 1 步:使用轻量级基础 Docker 图片
使用轻量级图像比使用庞大的基础图像更好,因为生成的 Docker 图像在尺寸较小时使用起来会更方便。
如果您计划在高度关键的生产系统中使用 Docker,您无法承受几秒钟的停机时间,那么您必须首先选择一个用于您的自定义 docker 图片。
步骤 2:减少中间层
在Dockerfile
中,每条指令如FROM
、LABEL
、RUN
、CMD
、ADD
等将是向 Docker 图像添加一个新层。因此,最好的做法是多次减少相同指令的使用,因为它会给你一个稍微小一点的图像。
第 3 步:选择特定版本 在 Docker 说明中选择特定版本是一个很好的做法,因为这将使生产实施保持良好和稳定。
想象一下,如果我们使用 Ubuntu:latest
作为基础图像。它将使用当前可用的最新 Ubuntu 图像作为我们的自定义 Docker 图像。此外,我们将根据相同的 Ubuntu 版本设置所有软件组件。
当 Ubuntu 在 Docker Hub 中使用较新的基础映像更新最新标签时,您可能会在生产 Docker 映像中遇到一些包依赖性问题或不兼容问题。
此外,我们应该始终尝试安装特定的包版本,而不是安装通用包。
示例
推荐apt-get install mysql-server-5.5
不推荐apt-get install mysql-server
第 4 步:不包含敏感数据
使用数据库凭据和 API 密钥等敏感数据在 Docker 中将是一项具有挑战性的任务。
Do not hard code any login credentials within a Docker image
要克服此限制,您应该有效地使用环境变量。
例如,如果您创建一个连接到 Mysql 数据库的 Drupal 映像,我们可以将 Drupal MySQL 数据库设置留空,如下所示。
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => '',
'username' => '',
'password' => '',
'host' => '',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
现在我们可以使用 ENTRYPOINT
利用环境变量在 运行 时间内替换 Drupal MySQL 数据库凭据,如下所示。
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2.pid
# Define Drupal home file path
DRUPAL_HOME="/var/www/html"
# Define Drupal settings file path
DRUPAL_SETTINGS_FILE="${DRUPAL_HOME}/sites/default/settings.php"
# Check the avilability of environment variables
if [ -n "$DRUPAL_MYSQL_DB" ] && [ -n "$DRUPAL_MYSQL_USER" ] && [ -n "$DRUPAL_MYSQL_PASS" ] && [ -n "$DRUPAL_MYSQL_HOST" ] ; then
echo "Setting up Mysql DB in $DRUPAL_SETTINGS_FILE"
# Set Database
sed -i "s/'database' *=> *''/'database' => '"$DRUPAL_MYSQL_DB"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql username
sed -i "s/'username' *=> *''/'username' => '"$DRUPAL_MYSQL_USER"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql password
sed -i "s/'password' *=> *''/'password' => '"$DRUPAL_MYSQL_PASS"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql host
sed -i "s/'host' *=> *''/'host' => '"$DRUPAL_MYSQL_HOST"'/g" $DRUPAL_SETTINGS_FILE
fi
# Start Apache in foreground
tail -F /var/log/apache2/* &
exec /usr/sbin/apache2ctl -D FOREGROUND
最后,您可以在 Docker 运行 时间内简单地定义环境变量,如下所示。
docker run -d -t -i
-e DRUPAL_MYSQL_DB='database'
-e DRUPAL_MYSQL_USER='user'
-e DRUPAL_MYSQL_PASS='password'
-e DRUPAL_MYSQL_HOST='host'
-p 80:80
-p 443:443
--name <container name>
<custom image>
第 5 步:运行CMD/Entypoint 来自非特权用户
使用非特权用户 运行 生产系统始终是一个不错的选择,从安全角度来看也更好。
您可以简单地将 USER
条目放在 CMD
或 ENTRYPOINT
之前 Docker 文件中,如下所示。
# Set running user of ENTRYPOINT
USER www-data
# Start entrypoint
ENTRYPOINT ["entrypoint"]