如何使用最佳实践创build生产准备好的Docker镜像?

创buildDocker镜像对于testing环境来说是一个简单的任务。 但是当涉及到生产实施时,我们必须遵循最佳实践来克服任何安全性和工作stream程问题。

创build生产准备好的docker图像的最佳实践是什么?

正如DevopsAnswers在5个步骤中创build生产Docker镜像中所做的全面描述,以下步骤将被视为创build生产准备好的Docker镜像的综合指南。

在创build生产Docker镜像时,您应该对Docker最佳实践有深入的了解。

第1步:使用轻量级基础Docker镜像

使用轻量级的图像比使用庞大的基础图像更好,因为使用Docker图像会更方便。

如果您打算在非常关键的生产系统中使用Docker,而在这种生产系统中,您无法承受几秒钟的停机时间,那么您首先必须select一个轻量级的基础映像,用于自定义泊坞窗映像。

第2步:减less中间层

Dockerfile ,每个指令如FROMLABELRUNCMDADD等都将添加一个新的图层到Docker镜像。 因此,多次减less相同指令的使用将是一个最佳实践,因为它会给你一个稍小的图像。

第3步:select特定版本在Docker指令中select特定的版本是一个很好的做法,因为它可以使生产实现保持良好稳定的状态。

想象一下,如果我们使用Ubuntu:latest作为基本映像。 它将使用当前可用的最新Ubuntu镜像来定制Docker镜像。 另外,我们将基于相同的Ubuntu版本来设置所有的软件组件。 当Ubuntu在Docker Hub中使用更新的基础镜像更新最新的标签时,可能会遇到一些软件包依赖问题或生产Docker镜像中的不兼容问题。

另外,我们应该总是试着安装特定的软件包版本,而不是安装一般的软件包。

build议apt-get install mysql-server-5.5

不build议apt-get install mysql-server

步骤4:不要包含敏感数据

使用敏感数据(如数据库凭证和API密钥)在Docker中将是一项具有挑战性的任务。

不要在Docker镜像中硬编码任何login凭证

为了克服这个限制,你应该有效地使用环境variables。

例如,如果您创build连接到Mysql数据库的Drupal图像,我们可以将Drupal MySQL数据库设置保留为空,如下所示。

 $databases = array ( 'default' => array ( 'default' => array ( 'database' => '', 'username' => '', 'password' => '', 'host' => '', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), ); 

现在我们可以使用ENTRYPOINT来利用环境variables来replace运行时的Drupal MySQL DB凭证,如下所示。

 #!/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运行时期间定义环境variables,如下所示。

 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

使用非特权用户来运行生产系统总是一个不错的select,从安全angular度来看也是一样。

你可以简单地把USERinput放在ENTRYPOINT中的CMDENTRYPOINT之前,如下所示。

 # Set running user of ENTRYPOINT USER www-data # Start entrypoint ENTRYPOINT ["entrypoint"]