mattrayner/docker-lamp的1804版的dockerfile解读
FROM phusion/baseimage
MAINTAINER Matthew Rayner <hello@rayner.io>
2
FROM
基于哪个docker image
MAINTAINER
维护者信息
ENV REFRESHED_AT 2019-03-12
ENV DOCKER_USER_ID 501
ENV DOCKER_USER_GID 20
ENV BOOT2DOCKER_ID 1000
ENV BOOT2DOCKER_GID 50
ENV PHPMYADMIN_VERSION=4.8.5
2
3
4
5
6
7
8
9
ENV
是在镜像系统内定义变量的指令。通过ENV
定义的环境变量,会永久的保存到该镜像创建的任何容器中,可以被后面的所有指令中使用,包括后面运行用ADD
引入到系统的外部sh文件也能看得见这个
# Tweaks to give Apache/PHP write permissions to the app
RUN usermod -u ${BOOT2DOCKER_ID} www-data && \
usermod -G staff www-data && \
useradd -r mysql && \
usermod -G staff mysql
RUN groupmod -g $(($BOOT2DOCKER_GID + 10000)) $(getent group $BOOT2DOCKER_GID | cut -d: -f1)
RUN groupmod -g ${BOOT2DOCKER_GID} staff
2
3
4
5
6
7
8
RUN
在容器内运行指令,$XXX
和${XXX}
是调用ENV
系统变量的方式
# Install packages
ENV DEBIAN_FRONTEND noninteractive
RUN add-apt-repository -y ppa:ondrej/php && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C && \
apt-get update && \
apt-get -y upgrade && \
apt-get -y install supervisor wget git apache2 php-xdebug libapache2-mod-php mysql-server php-mysql pwgen php-apcu php7.1-mcrypt php-gd php-xml php-mbstring php-gettext zip unzip php-zip curl php-curl && \
apt-get -y autoremove && \
echo "ServerName localhost" >> /etc/apache2/apache2.conf
# needed for phpMyAdmin
RUN ln -s /etc/php/7.1/mods-available/mcrypt.ini /etc/php/7.3/mods-available/ && \
phpenmod mcrypt
2
3
4
5
6
7
8
9
10
11
12
13
这是在装php
# Add image configuration and scripts
ADD supporting_files/start-apache2.sh /start-apache2.sh
ADD supporting_files/start-mysqld.sh /start-mysqld.sh
ADD supporting_files/run.sh /run.sh
2
3
4
ADD [把哪个文件] [放到哪]
是把外部文件放进容器中,这里直接放了几个启动脚本在根目录
RUN chmod 755 /*.sh
管理员模式运行刚才放进去那几个启动脚本
ADD supporting_files/supervisord-apache2.conf /etc/supervisor/conf.d/supervisord-apache2.conf
ADD supporting_files/supervisord-mysqld.conf /etc/supervisor/conf.d/supervisord-mysqld.conf
2
放supervisord的配置文件。supervisord是一个nb的进程管理软件
这些.conf文件里面都写了启动命令的,然后run.sh脚本里面没有明显调用这几个文件而是只有一个exec supervisord -n
。supervisord启动时会自动搜索配置文件
ADD supporting_files/mysqld_innodb.cnf /etc/mysql/conf.d/mysqld_innodb.cnf
放mysqld的配置文件
# Allow mysql to bind on 0.0.0.0
RUN sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
2
改MySQL的绑定端口使能外部连接
# Set PHP timezones to Europe/London
RUN sed -i "s/;date.timezone =/date.timezone = Europe\/London/g" /etc/php/7.3/apache2/php.ini
RUN sed -i "s/;date.timezone =/date.timezone = Europe\/London/g" /etc/php/7.3/cli/php.ini
2
3
设php时区
# Remove pre-installed database
RUN rm -rf /var/lib/mysql
# Add MySQL utils
ADD supporting_files/create_mysql_users.sh /create_mysql_users.sh
RUN chmod 755 /*.sh
2
3
4
5
6
又整了一个创建MySQL用户的脚本
# Add phpmyadmin
RUN wget -O /tmp/phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/${PHPMYADMIN_VERSION}/phpMyAdmin-${PHPMYADMIN_VERSION}-all-languages.tar.gz
RUN tar xfvz /tmp/phpmyadmin.tar.gz -C /var/www
RUN ln -s /var/www/phpMyAdmin-${PHPMYADMIN_VERSION}-all-languages /var/www/phpmyadmin
RUN mv /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
2
3
4
5
装phpmyadmin
# Add composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
php composer-setup.php && \
php -r "unlink('composer-setup.php');" && \
mv composer.phar /usr/local/bin/composer
2
3
4
5
不知道干嘛的,反之就是在容器里面又run了点php有关的东西
ENV MYSQL_PASS:-$(pwgen -s 12 1)
这一条没找到引用在哪里
# config to enable .htaccess
ADD supporting_files/apache_default /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite
2
3
改apache的配置文件
# Configure /app folder with sample app
RUN mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html
ADD app/ /app
2
3
创建/app目录,然后链接到/var/www/html下面,然后把外部文件中的app/文件夹里面的文件(那个欢迎界面index.php)加进去
#Environment variables to configure php
ENV PHP_UPLOAD_MAX_FILESIZE 10M
ENV PHP_POST_MAX_SIZE 10M
2
3
这两个在run.sh里面用到了,看字面意思是POST和上传文件时的大小限制
# Add volumes for the app and MySql
VOLUME ["/etc/mysql", "/var/lib/mysql", "/app" ]
2
VOLUME [文件夹A,文件夹B,...]
把指定的文件夹暴露给外部挂载,有了这个指令就可以在docker run
的时候用-v
挂载外部目录了。没暴露的文件夹不能挂载
EXPOSE 80 3306
EXPOSE 端口A 端口B ...
把指定的端口暴露给外部映射,有了这个指令就可以在docker run
的时候用-p
指定端口映射了。没暴露的端口不能映射
CMD ["/run.sh"]
又运行了一下方才ADD
进去的一个sh脚本
CMD
是在容器内的控制台运行指令,这个会被docker run [CONTAIN_ID] [指令]
中的[指令]覆盖