首先為什麼要自己編寫Dockerfile來構建 nginx、php、mariadb這三個鏡像呢?一是希望更深入瞭解Dockerfile的使用,也就能初步瞭解docker鏡像是如何被構建的;二是希望將來可以定製自己的images,特別是能針對不同的系統環境與目標需求適當對鏡像進行調整改進。在編輯Doc... ...
首先為什麼要自己編寫Dockerfile來構建 nginx、php、mariadb這三個鏡像呢?一是希望更深入瞭解Dockerfile的使用,也就能初步瞭解docker鏡像是如何被構建的;二是希望將來可以定製自己的images,特別是能針對不同的系統環境與目標需求適當對鏡像進行調整改進。在編輯Dockerfile過程中也參考了以下相關範例:
https://hub.docker.com/_/mysql/
https://hub.docker.com/_/nginx/
一.安裝Docker
sudo apt-get update 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 MAINTAINER cenze <[email protected]> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && groupadd -r mysql \ && useradd -r -g mysql mysql ADD conf/sources.list /etc/apt/ RUN apt-get update \ && apt-get install -y g++ cmake vim libncurses5-dev zlib1g-dev ENV PKGS="/usr/local/pkgs" ADD packages/mariadb-10.1.19.tar.gz $PKGS/ # install mariadb WORKDIR $PKGS/mariadb-10.1.19 ENV PREFIX_MARIADB="/usr/local/mariadb" RUN mkdir $PREFIX_MARIADB \ && cmake -DCMAKE_INSTALL_PREFIX="$PREFIX_MARIADB" . \ && make \ && make install ENV PATH $PREFIX_MARIADB/bin:$PATH ADD conf/my.cnf /etc/ RUN chown -R mysql:mysql $PREFIX_MARIADB/data \ && cd $PREFIX_MARIADB \ && ./scripts/mysql_install_db EXPOSE 3306 CMD ["mysqld"]
2.構建mariadb鏡像
cd ~/docker sudo docker build -t cenze/mariadb -f Dockerfile-Mariadb .
3.運行mariadb容器
sudo docker run -d --name mariadb cenze/mariadb
四.構建php鏡像並運行php-fpm容器
1.編輯Dockerfile-PHP-FPM
FROM ubuntu MAINTAINER cenze <[email protected]> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ADD conf/sources.list /etc/apt/ RUN apt-get update \ && apt-get install -y gcc make vim libssl-dev libpcre3-dev zlib1g-dev libxml2-dev libcurl4-gnutls-dev libpng16-dev libmcrypt-dev \ && ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/ ENV PKGS="/usr/local/pkgs" ADD packages/php-7.1.0.tar.gz $PKGS/ #install php WORKDIR $PKGS/php-7.1.0 ENV PREFIX_PHP="/usr/local/php" RUN mkdir $PREFIX_PHP \ && CONFIG_PHP="\ --prefix=$PREFIX_PHP \ --disable-cgi \ --enable-fpm \ --with-fpm-user=www-data \ --with-fpm-group=www-data \ --enable-mbstring \ --with-mysqli \ --with-pdo-mysql \ --with-mcrypt \ --with-zlib \ --with-curl \ --with-openssl \ --with-gd \ --enable-exif \ "\ && ./configure $CONFIG_PHP \ && make \ && make install ADD conf/php-fpm.conf $PREFIX_PHP/etc/ ADD conf/php.ini $PREFIX_PHP/etc/ ADD conf/www.conf $PREFIX_PHP/etc/php-fpm.d/ ADD conf/php-fpm $PREFIX_PHP/bin/ RUN chown -R www-data:www-data /var/www ###################Chroot######################################################### #如果不想chroot,這部分可以刪除 #chroot的配置是一個大坑,如果你使用到session、sendmail、DNS解析等有關api,可能需要添加複製相應的目錄和庫文件 #以下只是本人會涉及到的,很少一部分 RUN cd /var/www \ && mkdir -p public dev etc tmp usr/share/zoneinfo var/log \ && cp -a /dev/zero /dev/random /dev/urandom /dev/null dev/ \ && chmod --reference=/tmp tmp/ \ && chown -R root:root . \ && chown -R www-data:www-data public var/log \ && cp /lib/x86_64-linux-gnu/libc.so.6 \ /lib/x86_64-linux-gnu/libdl.so.2 \ /lib/x86_64-linux-gnu/libnss_dns.so.2 \ /lib/x86_64-linux-gnu/libnss_files.so.2 \ /lib/x86_64-linux-gnu/libresolv.so.2 \ lib/ ###################Chroot End###################################################### ENV PATH $PREFIX_PHP/bin:$PATH EXPOSE 9000 CMD ["php-fpm","start"]
2.構建php-fpm鏡像
cd ~/docker 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 cenze/php-fpm
特別說明:php-fpm.conf中daemonize = no,否則php-fpm容器無法開啟並運行在後臺;本人在主機~/web下掛載了捲,綁定到容器/var/www
五.構建nginx鏡像並運行nginx容器
1.編輯Dockerfile-Nginx
FROM ubuntu MAINTAINER cenze <[email protected]> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ADD conf/sources.list /etc/apt/ RUN apt-get update \ && apt-get install -y gcc make vim libpcre3-dev zlib1g-dev libssl-dev \ && ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/ ENV PKGS="/usr/local/pkgs" ADD packages/nginx-1.10.2.tar.gz $PKGS/ # install nginx WORKDIR $PKGS/nginx-1.10.2 ENV PREFIX_NGINX="/usr/local/nginx" RUN mkdir $PREFIX_NGINX \ && ./configure --prefix="$PREFIX_NGINX" --with-http_ssl_module \ && make \ && make install ADD conf/nginx.conf $PREFIX_NGINX/conf/ #WORKDIR $PREFIX_NGINX/html ENV PATH $PREFIX_NGINX/sbin:$PATH EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"]
2.構建nginx鏡像
cd ~/docker 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 cenze/nginx
特別說明:本人在主機~/web下掛載了捲,綁定到nginx容器/usr/local/nginx/html
六.創建新項目進行測試
1.上圖是運行php-fpm容器後主機~/web目錄結構圖,提取~/docker/packages/phpMyAdmin.tar.gz至~/web/public下
2.複製phpMyAdmin配置文件
cd ~/web/phpMyAdmin
cp config.sample.inc.php config.inc.php
3.訪問地址http://localhost/phpMyAdmin將出現下圖,說明基於容器的nginx/php/mysql服務環境已經創建成功