我是Docker的新手。我已使用以下Dockerfile成功创建了一个Docker image :
From alpine:3.4
MAINTAINER SomeName - domain.tld
# Timezone
ENV TIMEZONE Asia/Kolkata
# RUN sed -i 's#dl-cdn\.alpinelinux\.org#mirrors\.aliyun\.com#' /etc/apk/repositories
# install mysql, apache and php and php extensions, tzdata, wget
RUN echo "@community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
apk add --update \
mysql mysql-client \
apache2 \
curl wget \
tzdata \
php5-apache2 \
php5-cli \
php5-phar \
php5-zlib \
php5-zip \
php5-bz2 \
php5-ctype \
php5-mysqli \
php5-mysql \
php5-pdo_mysql \
php5-opcache \
php5-pdo \
php5-json \
php5-curl \
php5-gd \
php5-gmp \
php5-mcrypt \
php5-openssl \
php5-dom \
php5-xml \
php5-iconv \
php5-xdebug@community
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/bin --filename=composer
# configure timezone, mysql, apache
RUN cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \
echo "${TIMEZONE}" > /etc/timezone && \
mkdir -p /run/mysqld && chown -R mysql:mysql /run/mysqld /var/lib/mysql && \
mysql_install_db --user=mysql --verbose=1 --basedir=/usr --datadir=/var/lib/mysql --rpm > /dev/null && \
mkdir -p /run/apache2 && chown -R apache:apache /run/apache2 && chown -R apache:apache /var/www/localhost/htdocs/ && \
sed -i 's#AllowOverride none#AllowOverride All#' /etc/apache2/httpd.conf && \
sed -i 's#ServerName www.example.com:80#\nServerName localhost:80#' /etc/apache2/httpd.conf && \
sed -i '/skip-external-locking/a log_error = \/var\/lib\/mysql\/error.log' /etc/mysql/my.cnf && \
sed -i '/skip-external-locking/a general_log = ON' /etc/mysql/my.cnf && \
sed -i '/skip-external-locking/a general_log_file = \/var\/lib\/mysql\/query.log' /etc/mysql/my.cnf
# Configure xdebug
RUN echo "zend_extension=xdebug.so" > /etc/php5/conf.d/xdebug.ini && \
echo -e "\n[XDEBUG]" >> /etc/php5/conf.d/xdebug.ini && \
echo "xdebug.remote_enable=1" >> /etc/php5/conf.d/xdebug.ini && \
echo "xdebug.remote_connect_back=1" >> /etc/php5/conf.d/xdebug.ini && \
echo "xdebug.idekey=PHPSTORM" >> /etc/php5/conf.d/xdebug.ini && \
echo "xdebug.remote_log=\"/tmp/xdebug.log\"" >> /etc/php5/conf.d/xdebug.ini
#start apache
RUN echo "#!/bin/sh" > /start.sh && \
echo "httpd" >> /start.sh && \
echo "nohup mysqld --skip-grant-tables --bind-address 0.0.0.0 --user mysql > /dev/null 2>&1 &" >> /start.sh && \
echo "sleep 3 && mysql -uroot -e \"create database db;\"" >> /start.sh && \
echo "tail -f /var/log/apache2/access.log" >> /start.sh && \
chmod u+x /start.sh
WORKDIR /var/www/localhost/htdocs/
EXPOSE 80
EXPOSE 3306
#VOLUME ["/var/www/localhost/htdocs","/var/lib/mysql","/etc/mysql/"]
ENTRYPOINT ["/start.sh"]
理想情况下,我希望docker镜像包含Apache,PHP和MySQL - 所有这些都在一个图像中。我希望图像尽可能便携。因此,每次我需要启动一个新项目时,我都可以创建一个新容器并安装卷并继续编写代码。
当我开始一个新容器时,我按预期得到了所有东西。但无法安装mysql数据。我认为这是因为挂载是单向的(或者是它?)如果我在启动新容器时添加-v /project_dir/data:/var/lib/mysql
,则mysql无法启动,因为project_dir/data
为空。我的问题是:
project_dir
装载到容器内的/var/lib/mysql
? 编辑:如果我没有安装我的本地卷(即project_dir/data
)并启动容器,请获取shell tty,我看到/var/lib/mysql
已几个文件,我假设需要运行mysql及其初始数据库。但是,如果我将本地卷和ls
挂载到/var/lib/mysql
(容器内),则为空。这就是MySQL没有启动的原因,我无法从外部容器中保存数据。我的问题是:如何让它运行并从本地目录中保存数据。
答案 0 :(得分:4)
问题:
这里发生的是你在构建Docker镜像时创建一个空数据库:
mysql_install_db --user=mysql --verbose=1 --basedir=/usr --datadir=/var/lib/mysql --rpm > /dev/null && \
但是,当您从此图像创建容器时,您将在/var/lib/mysql
文件夹上安装卷。这会隐藏您的容器数据,以显示您的主机文件夹。因此,您会看到一个空文件夹。
解决方案:
如果您查看https://hub.docker.com/_/mysql/,您会看到通过在容器实际启动时创建数据库来解决此问题,而不是在创建映像时。这回答了你的问题:
换句话说,使用ENTRYPOINT
中的脚本初始化数据库,而不是直接在图像中。
<强>警告强>:
但是,有些警告。你不是真正推荐你的形象,因为Docker的理念是每个容器的一个过程&#34;。你在这里遇到的困难是你必须在同一个容器(apache,Mysql等)上启动多个服务,所以你可能不得不在你的入口点做两件事,这是令人困惑的。此外,一个服务失败,您的容器仍然会启动,但不能按预期工作。然后,我建议将每个进程中的所有内容拆分为1个映像,然后使用原始Docker或类似docker-compose
的用户启动它们。
此外,这将使您从Docker Hub:https://hub.docker.com中使用现有且高度可配置的图像的方式受益。减少工作量,减少错误。
答案 1 :(得分:-1)
当您在docker容器中有数据库时,使用卷是唯一的方法。也许我们应该在容器内陈述&#34;数据库&#34;表示不使用卷并且标准数据为10GB(如果默认大小已被修改,则更大),卷中的数据库表示docker run -v myvolume...
我完全同意Alexandre的回答,但我认为将数据库放入容器中也是错误的,这也是出于其他原因。默认情况下,图像的大小(运行时的容器)为10 GB。对于某些可执行文件,库和配置文件,这应该非常舒适。您可以修改此默认值,并在创建图像时添加更大的值。但是当你达到这个新限制时会发生什么?假设您认为数据库的大小为100 GB,实际上,您放置的数据多于计划数,并且最终需要5或20倍?卷可以在SAN上并在需要时进行扩展。