在编辑Dockerfile过程中参考了以下相关范例:https://hub.docker.com/_/php/https://hub.docker.com/_/mysql/https://hub.docker.com/_/nginx/。在build镜像时可能报出异常“containerd: container not started”,此时可能需要重启containerd或系统。

要删除某些无用的images,可执行如下命令:

sudo docker rmi $(sudo docker images -a|grep none|awk '{print $3 }')

一.安装Docker

sudo apt-get update<br/>
sudo apt-get install docker.io

二.在Home下创建如下docker目录(含源码安装包)

conf:配置文件目录,包含nginx.conf、php.ini、 my.cnf以及source.list等。当然这些配置文件并非必须的,可在相关的安装目录下去复制修改源配置文件,只是个人喜欢先准备好这些将要用到的文件。

packages:安装包目录,对于mysql的安装本人采用mariadb源码安装,所有的安装包都是官方下载的最新版。至于phpMyAdmin包是本人在开发测试时喜欢使用的mysql管理界面(客户端),如果最后phpMyAdmin能在容器中跑起来,也就初步说明整个创建过程是成功的。

Dockerfile-PHP-FPM:为构建php镜像而要编写的Dockerfile

Dockerfile-Mariadb:为构建mariadb镜像而要编写的Dockerfile

Dockerfile-Nginx:为构建nginx镜像而要编写的Dockerfile

三.构建mariadb镜像并运行mariadb容器

1.编辑Dockerfile-Mariadb

FROM ubuntu<br/>
MAINTAINER cenze <272666745@qq.com>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \<br/>
&& groupadd -r mysql \<br/>
&& useradd -r -g mysql mysql<br/>
ADD conf/sources.list /etc/apt/<br/>
RUN apt-get update \<br/>
&& apt-get install -y g++ cmake vim libncurses5-dev zlib1g-dev

ENV PKGS="/usr/local/pkgs"<br/>
ADD packages/mariadb-10.1.19.tar.gz $PKGS/

# install mariadb<br/>
WORKDIR $PKGS/mariadb-10.1.19<br/>
ENV PREFIX_MARIADB="/usr/local/mariadb"<br/>
RUN mkdir $PREFIX_MARIADB \<br/>
&& cmake -DCMAKE_INSTALL_PREFIX="$PREFIX_MARIADB" . \<br/>
&& make \<br/>
&& make install

ENV PATH $PREFIX_MARIADB/bin:$PATH<br/>
ADD conf/my.cnf /etc/<br/>
RUN chown -R mysql:mysql $PREFIX_MARIADB/data \<br/>
&& cd $PREFIX_MARIADB \<br/>
&& ./scripts/mysql_install_db

EXPOSE 3306<br/>
CMD ["mysqld"]

2.构建mariadb镜像

cd ~/docker<br/>
sudo docker build -t cenze/mariadb -f Dockerfile-Mariadb .

3.运行mariadb容器

sudo docker run -d --name mariadb --privileged=true cenze/mariadb

特别说明:此时的MySQL实例只能以 root 从本地访问,可手动配置root密码以及访问权限等。–privileged=true container内的root拥有真正的root权限,容器会被允许直接配置主机的网络堆栈;否则,container内的root只是外部的一个普通用户权限。

四.构建php镜像并运行php-fpm容器

1.编辑Dockerfile-PHP-FPM

FROM ubuntu<br/>
MAINTAINER cenze <272666745@qq.com>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime<br/>
ADD conf/sources.list /etc/apt/<br/>
RUN apt-get update \<br/>
&& apt-get install -y gcc make vim autoconf libssl-dev libpcre3-dev zlib1g-dev libxml2-dev libcurl4-gnutls-dev libpng16-dev libmcrypt-dev \<br/>
&& ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/

ENV PKGS="/usr/local/pkgs"<br/>
ADD packages/php-7.1.0.tar.gz $PKGS/

#install php<br/>
WORKDIR $PKGS/php-7.1.0<br/>
ENV PREFIX_PHP="/usr/local/php"<br/>
RUN mkdir $PREFIX_PHP \<br/>
&& CONFIG_PHP="\<br/>
--prefix=$PREFIX_PHP \
#默认为$PREFIX_PHP/lib,php-fpm启动时将在会自行搜索--sysconfdir[=$PREFIX_PHP/etc]指定目录下的php.ini,<br/>#但php以cli模式独立运行时只会在--with-config-file-path[=$PREFIX_PHP/lib]指定目录下搜索php.ini
--with-config-file-path=$PREFIX_PHP/etc \<br/>
--disable-cgi \<br/>
--enable-fpm \<br/>
--with-fpm-user=www-data \<br/>
--with-fpm-group=www-data \<br/>
--enable-mbstring \<br/>
--with-mysqli \<br/>
--with-pdo-mysql \<br/>
--with-mcrypt \<br/>
--with-zlib \<br/>
--with-curl \<br/>
--with-openssl \<br/>--with-jpeg-dir=/usr/lib/x86_64-linux-gnu \<br/>--with-png-dir=/usr/lib/x86_64-linux-gnu \<br/>
--with-gd \<br/>
--enable-exif \<br/>--enable-bcmath \ #如果没有自带libbcmath,就sudo apt-get install php-bcmath<br/>
"\<br/>
&& ./configure $CONFIG_PHP \<br/>
&& make \<br/>
&& make install<br/>
ADD conf/php-fpm.conf $PREFIX_PHP/etc/<br/>
ADD conf/php.ini $PREFIX_PHP/etc/<br/>
ADD conf/www.conf $PREFIX_PHP/etc/php-fpm.d/<br/>
ADD conf/php-fpm $PREFIX_PHP/bin/<br/>RUN mkdir /var/www \<br/>&& chown -R www-data:www-data /var/www
###################Chroot#########################################################<br/>
#如果不想chroot,这部分可以删除<br/>
#chroot的配置是一个大坑,如果你使用到session、sendmail、DNS解析等有关api,可能需要添加复制相应的目录和库文件<br/>
#以下只是本人会涉及到的,很少一部分<br/>
RUN chown -R root:root /var/www \<br/>&& cd /var/www \<br/>
&& mkdir -p lib public dev etc tmp usr/share/zoneinfo var/log \<br/>
&& cp -a /dev/zero /dev/random /dev/urandom /dev/null dev/ \<br/>
&& chmod --reference=/tmp tmp/ \<br/>
&& chown -R www-data:www-data public var/log \<br/>
&& cp /lib/x86_64-linux-gnu/libc.so.6 \<br/>
/lib/x86_64-linux-gnu/libdl.so.2 \<br/>
/lib/x86_64-linux-gnu/libnss_dns.so.2 \<br/>
/lib/x86_64-linux-gnu/libnss_files.so.2 \<br/>
/lib/x86_64-linux-gnu/libresolv.so.2 \<br/>
lib/<br/>
###################Chroot End######################################################

ENV PATH $PREFIX_PHP/bin:$PATH

#install extensions & tools for PHP
RUN pecl install redis \
&& php -r “readfile(‘https://getcomposer.org/installer&#8217;);” | php \
&& mv composer.phar /usr/local/bin/composer

EXPOSE 9000<br/>
CMD ["php-fpm","start"]

2.构建php-fpm镜像

cd ~/docker<br/>
sudo docker build -t cenze/php-fpm -f Dockerfile-PHP-FPM .

3.运行php-fpm容器

sudo docker run -d --link mariadb -v /home/cenze/web:/var/www --name php-fpm --privileged=true cenze/php-fpm

特别说明:php-fpm.conf中daemonize = no,否则php-fpm容器无法开启并运行在后台;本人在主机~/web下挂载了卷,绑定到容器/var/www

五.构建nginx镜像并运行nginx容器

1.编辑Dockerfile-Nginx

FROM ubuntu<br/>
MAINTAINER cenze <272666745@qq.com>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime<br/>
ADD conf/sources.list /etc/apt/<br/>
RUN apt-get update \<br/>
&& apt-get install -y gcc make vim libpcre3-dev zlib1g-dev libssl-dev \<br/>
&& ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/

ENV PKGS="/usr/local/pkgs"<br/>
ADD packages/nginx-1.10.2.tar.gz $PKGS/

# install nginx<br/>
WORKDIR $PKGS/nginx-1.10.2<br/>
ENV PREFIX_NGINX="/usr/local/nginx"<br/>
RUN mkdir $PREFIX_NGINX \<br/>
&& ./configure --prefix="$PREFIX_NGINX" --with-http_ssl_module \<br/>
&& make \<br/>
&& make install<br/>
ADD conf/nginx.conf $PREFIX_NGINX/conf/

#WORKDIR $PREFIX_NGINX/html<br/>
ENV PATH $PREFIX_NGINX/sbin:$PATH

EXPOSE 80 443<br/>
CMD ["nginx", "-g", "daemon off;"]

2.构建nginx镜像

cd ~/docker<br/>
sudo docker build -t cenze/nginx -f Dockerfile-Nginx .

3.运行nginx容器

sudo docker run -d -p 443:443 -p 80:80 --link php-fpm -v /home/cenze/web:/usr/local/nginx/html --name nginx --privileged=true cenze/nginx

特别说明:本人在主机~/web下挂载了卷,绑定到nginx容器/usr/local/nginx/html

六.创建新项目进行测试

Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

1)上图是运行php-fpm容器后主机~/web目录结构图,提取~/docker/packages/phpMyAdmin.tar.gz至~/web/public下

2)复制phpMyAdmin配置文件

cd ~/web/phpMyAdmin<br/>cp config.sample.inc.php config.inc.php 

特别说明:$cfg[‘Servers’][$i][‘host’] = ‘your-real-ip’;

3)访问地址http://localhost/phpMyAdmin将出现下图,说明基于容器的nginx+php+mariadb服务环境已经创建成功