Я новичок в Docker. Я успешно создал Docker изображение со следующим Dockerfile:Сохранение данных MySQL в Docker
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 \
[email protected]
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"]
В идеале я хочу докер изображение содержит Apache, PHP и MySQL - все в одном изображении. Я хочу, чтобы изображение было максимально переносимым. Чтобы каждый раз, когда мне нужно было начинать новый проект, я могу просто создать новый контейнер и смонтировать тома и продолжить и код.
Когда я запускаю новый контейнер, я получаю все, как ожидалось. Но данные mysql не могут быть установлены. Я думаю, что это потому, что установка является односторонней (или это?). Если я добавлю -v /project_dir/data:/var/lib/mysql
при запуске нового контейнера, mysql не запускается, потому что project_dir/data
пуст. Мои вопросы:
- Как смонтировать данные из моего
project_dir
к/var/lib/mysql
внутри контейнера? - Как установить различные пароли mysql в разные контейнеры?
Edit: Если я не монтировать локальный объем (т.е. project_dir/data
) и запустить контейнер, получить TTY оболочки, я вижу, что /var/lib/mysql
есть несколько файлов, которые я предполагаю, что необходимо для запуска MySQL и его исходные базы данных. Но если я монтирую свой локальный том и ls
внутри /var/lib/mysql
(внутри контейнера), он пуст. Вот почему MySQL не запускается, и я не могу сохранить данные с за пределами контейнера. Мой вопрос: как я могу запустить его и сохранить данные из локального каталога.
Изображение должно быть независимым от вашей локальной среды. Вы должны использовать VOLUME, чтобы отметить каталог, который будет монтироваться снаружи. И когда вы запускаете образ в докере, вы подключаете его к своей локальной среде с использованием параметров '-v'. Этот способ работает даже на Kubernetes. – JosMac
Не используйте Docker для этого прецедента. Docker - это технология приложений. Вы создаете контейнер ОС/Золотое изображение. Используйте виртуальную машину или если вы настаиваете на том, чтобы использовать контейнеры только для охлаждения, используйте контейнер ОС (например, OpenVZ). У вас будет много проблем с вашим текущим aproach. – bartimar