Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

303

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • mattrayner/docker-lamp的1804版的dockerfile解读

mattrayner/docker-lamp的1804版的dockerfile解读

vuePress-theme-reco Howard Yin    2021 - 2025

mattrayner/docker-lamp的1804版的dockerfile解读


Howard Yin 2019-04-17 11:04:03 DockerDockerfile服务器运维实操容器
FROM phusion/baseimage
MAINTAINER Matthew Rayner <hello@rayner.io>
1
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
1
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
1
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
1
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
1
2
3
4

ADD [把哪个文件] [放到哪]是把外部文件放进容器中,这里直接放了几个启动脚本在根目录

RUN chmod 755 /*.sh
1

管理员模式运行刚才放进去那几个启动脚本

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
1
2

放supervisord的配置文件。supervisord是一个nb的进程管理软件

这些.conf文件里面都写了启动命令的,然后run.sh脚本里面没有明显调用这几个文件而是只有一个exec supervisord -n。supervisord启动时会自动搜索配置文件

ADD supporting_files/mysqld_innodb.cnf /etc/mysql/conf.d/mysqld_innodb.cnf
1

放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
1
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
1
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
1
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
1
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
1
2
3
4
5

不知道干嘛的,反之就是在容器里面又run了点php有关的东西

ENV MYSQL_PASS:-$(pwgen -s 12 1)
1

这一条没找到引用在哪里

# config to enable .htaccess
ADD supporting_files/apache_default /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite
1
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
1
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
1
2
3

这两个在run.sh里面用到了,看字面意思是POST和上传文件时的大小限制

# Add volumes for the app and MySql
VOLUME  ["/etc/mysql", "/var/lib/mysql", "/app" ]
1
2

VOLUME [文件夹A,文件夹B,...]把指定的文件夹暴露给外部挂载,有了这个指令就可以在docker run的时候用-v挂载外部目录了。没暴露的文件夹不能挂载

EXPOSE 80 3306
1

EXPOSE 端口A 端口B ...把指定的端口暴露给外部映射,有了这个指令就可以在docker run的时候用-p指定端口映射了。没暴露的端口不能映射

CMD ["/run.sh"]
1

又运行了一下方才ADD进去的一个sh脚本

CMD是在容器内的控制台运行指令,这个会被docker run [CONTAIN_ID] [指令]中的[指令]覆盖

帮助我们改善此页面!
创建于: 2019-04-17 03:37:18

更新于: 2019-04-17 11:04:37