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


 

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