Docker之OSX+Vagrant+Docker+LNMP(二)

接上篇 《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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章