接上篇 《OSX+Vagrant+Docker+LNMP(-)》
phpfpm 創建Dockerfile
基於 centos6.7 的 php-fpm ,當前目錄 /root
① mkdir centos67_phpfpm
② vi centos67_phpfpm/Dockerfile
FROM hub.c.163.com/library/centos:6.7
MAINTAINER linning <[email protected]>
ENV TZ "Asia/Shanghai"
#Dir
RUN mkdir -p /usr/local/nginx/html
#Yum
RUN yum -y update && \
yum install -y gcc automake autoconf libtool make gcc-c++ vixie-cron wget zlib file openssl-devel sharutils zip bash vim cyrus-sasl-devel libmemcached libmemcached-devel libyaml libyaml-devel unzip libvpx-devel openssl-devel ImageMagick-devel autoconf tar gcc libxml2-devel gd-devel libmcrypt-devel libmcrypt mcrypt mhash libmcrypt libmcrypt-devel libxml2 libxml2-devel bzip2 bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel bison libtool-ltdl-devel net-tools && \
yum clean all
#Php
#fix error: mcrypt.h not found
RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && \
yum install -y libmcrypt-devel
RUN cd /tmp && \
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz && \
tar xzf php-5.6.30.tar.gz && \
cd /tmp/php-5.6.30 && \
./configure \
--prefix=/usr/local/php \
--with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-simplexml --enable-xml --disable-rpath --enable-bcmath --enable-soap --enable-zip --with-curl --enable-fpm --with-fpm-user=nobody --with-fpm-group=nobody --enable-mbstring --enable-sockets --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-opcache && \
make && \
make install
#複製文件
RUN cp /tmp/php-5.6.30/php.ini-production /usr/local/php/lib/php.ini && \
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
EXPOSE 9000
#配置php
RUN sed -i -e 's/listen = 127.0.0.1:9000/listen = 9000/' /usr/local/php/etc/php-fpm.conf
#啓動php
ENTRYPOINT ["/usr/local/php/sbin/php-fpm", "-F", "-c", "/usr/local/php/lib/php.ini"]
③ docker build -t centos67_phpfpm:5.6.30 -f centos67_phpfpm/Dockerfile . (別遺漏最後的“.”,代表Dockerfile的 path,即,如果 -f /path/Dockerfile ,那麼,這個 . 就該替換成 /path
樣例:docker build -t oliverlin/phpfpm:v5.6.0.1 -f /home/vagrant/repository/phpfpm_5_6/Dockerfile /home/vagrant/repository/phpfpm_5_6
)
mysql 拉取官方鏡像
[root@vgt-docker1 ~]# docker pull hub.c.163.com/library/mysql:5.6
依次創建容器
# 鏡像列表
[root@vgt-docker1 centos67_phpfpm]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos67_phpfpm 5.6.30 cbc1a6a09572 18 hours ago 1.282 GB
centos67_nginx 1.9.5 ad247ff06dd7 3 days ago 734 MB
hub.c.163.com/library/mysql 5.6 90761c5c57ce 4 weeks ago 298.4 MB
hub.c.163.com/library/centos 6.7 a8b4df3be85c 8 months ago 190.6 MB
# 因 --link 的依賴順序是 nginx -> php -> mysql 故啓動順序如下
# 創建放置 mysql 數據目錄
[root@vgt-docker1 ~]# mkdir /data/mysql
# 啓動 mysql
[root@vgt-docker1 ~]# docker run --name mysql02 -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d hub.c.163.com/library/mysql:5.6
[root@vgt-docker1 ~]# ll /data/mysql/
total 110604
-rw-rw---- 1 999 999 56 May 22 11:20 auto.cnf
-rw-rw---- 1 999 999 12582912 May 22 11:21 ibdata1
-rw-rw---- 1 999 999 50331648 May 22 11:21 ib_logfile0
-rw-rw---- 1 999 999 50331648 May 22 11:20 ib_logfile1
drwx------ 2 999 999 4096 May 22 11:21 mysql
drwx------ 2 999 999 4096 May 22 11:20 performance_schema
# 創建 php 容器
[root@vgt-docker1 ~]# docker run --name php5.6.30-build -p 9000:9000 -v /home/wwwroot/default:/home/wwwroot --link mysql02:mysql02 -d centos67_phpfpm:5.6.30
8d734bed1c58d55ca348ddcfeaf3e20a0dcc3f2f9431a79de14e833ef34dcb9d
# 創建 nginx 容器
[root@vgt-docker1 ~]# docker run -dti --name=nginx02 -p 80:80 -p 443:443 -v /home/wwwroot/default:/home/wwwroot --link php5.6.30-build:php5.6.30-build centos67_nginx:1.9.5
fd4e1ab5cef49ed7340af2a84cd1181b6e34ee547413e7b0a586b515e452ff4f
[root@vgt-docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd4e1ab5cef4 centos67_nginx:1.9.5 "/run.sh nginx" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx02
8d734bed1c58 centos67_phpfpm:5.6.30 "/usr/local/php/sbin 9 minutes ago Up 9 minutes 0.0.0.0:9000->9000/tcp php5.6.30-build
824946c62768 hub.c.163.com/library/mysql:5.6 "docker-entrypoint.s 13 minutes ago Up 13 minutes 0.0.0.0:3306->3306/tcp mysql02
校驗環境搭建是否成功:
① 共享目錄:
宿主:/home/wwwroot/default
docker容器:/home/wwwroot
創建 /home/wwwroot/default/phpinfo.php
<?php
phpinfo();
# mysql:host= 要連接的mysql的容器名
$conn = new PDO('mysql:host=mysql02;port=3306;dbname=mysql;charset=utf8', 'root', '123456');
var_dump($conn);
1)能顯示 phpinfo ,則 php 啓動 OK;
2)能 顯示 object(PDO)#1 (0) { } ,則 mysql 連接成功;
②
[root@vgt-docker1 ]# docker exec -it nginx02 /bin/bash
# 說明:由於 Nginx 和 PHP-FPM 不在同一臺主機上,所以 Nginx 只做靜態文件處理和路由轉發,實際的 PHP 文件執行時在 PHP-FPM 容器中發生的。所以 SCRIPT_FILENAME 變量必須要使用 PHP-FPM 容器中的目錄
[root@fd4e1ab5cef4 /]# cat /usr/local/nginx/conf/vhost/docker1.dev.cc.conf
server {
listen 80;
server_name docker1.dev.cc;
location ~ \\.php$ {
root html;
fastcgi_pass php5.6.30-build:9000; #此處爲關鍵!!其中php5.6.30-build爲PHP容器的名稱,參見啓動PHP容器docker run --name指定的值
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #關鍵!!$document_root爲web目錄
include fastcgi_params;
}
}
③ 綁定 host 測試: 192.168.69.101 docker1.dev.cc
④ mac 機器瀏覽器運行
容器編排
一旦需要重啓這個lnmp的組合容器,就得一個個 docker restart 容器ID or Name,要累死的節奏,有莫有。。。解決方式:docker-compose
Compose的默認配置文件是docker-compose.yml
mx_mysql: restart: always image: mysql:5.6 volumes: - /root/data/mysql:/var/lib/mysql - ./conf/:/etc/mysql/conf.d ports: - "3306:3306" environment: - MYSQL_DATABASE=online - MYSQL_ROOT_PASSWORD=123456 mx_redis: restart: always image: redis:3.2 volumes: - /root/data/redis:/data ports: - "6379:6379" command: redis-server --appendonly yes mx_nginx: restart: always image: nginx ports: - "80:80" volumes: - ./conf/mx_nginx.conf:/etc/nginx/conf.d/mx_nginx.conf volumes_from: - mx_online links: - mx_online:web mx_online: restart: always build: . expose: - "8000:8000" volumes: - .:/online links: - mx_mysql:mysql - mx_redis:redis command: uwsgi -s :8000 -w online.wsgi -p 3 mx_celery: restart: always build: . volumes_from: - mx_online links: - mx_mysql:mysql - mx_redis:redis command: celery -A online worker -l info
看看目錄結構(來源網絡):
$ tree composeTest composeTest ├── code │ ├── index.php │ ├── mysql.php │ └── testmysql.php │ ├── docker-compose.yml ├── index.php ├── mysql │ ├── data │ │ ├── auto.cnf │ │ ├── ibdata1 │ │ ├── ib_logfile0 │ │ ├── ib_logfile1 │ │ ├── mysql [error opening dir] │ │ ├── performance_schema [error opening dir] │ │ └── test_db [error opening dir] │ └── Dockerfile ├── nginx │ ├── conf │ │ └── default.conf │ └── Dockerfile └── phpfpm └── Dockerfile 10 directories, 23 files
其他
一、docker run --link src容器名:別名
直接ping 容器別名 證明--link 是起作用的,這樣,無論 容器如何重啓,改變ip ,只有記住容器名就能實現容器間互聯。
二、docker-compose
# docker-compose [-p/–verbose/-f/–version] [up/start/stop/restart/rm ...]
# 如果不指定 -p 參數,創建的容器 NAMES 默認以當前文件夾名 root 前綴,如:root_service_1 ...
[root@vgt-docker1 dckcompose]# docker-compose -p aaa up -d
Creating aaa_mysql02_1
Creating aaa_php5.6.30-build_1
Creating aaa_nginx02_1
[root@vgt-docker1 dckcompose]# docker-compose -p aaa rm
Going to remove aaa_nginx02_1, aaa_php5.6.30-build_1, aaa_mysql02_1
Are you sure? [yN] y
Removing aaa_nginx02_1 ... done
Removing aaa_php5.6.30-build_1 ... done
Removing aaa_mysql02_1 ... done