广告

本站里的文章大部分经过自行整理与测试

2016年5月20日星期五

Ubuntu - Docker - Nginx / PHP / MySql + phpmyadmin

1. mysql_data 和 wwwroot 
(用这可以避免当 mysql 更换时, 再输入资料)

https://hub.docker.com/_/busybox/

$ docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data
$ cd /home/用户名
$ mkdir www
$ docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot


* 这 2 个容器不需要开启, 因它们只是用作挂载主机的文件夹到容器中而已

2. Mysql Server 5.5 (3306/tcp)

https://hub.docker.com/_/mysql/

# mysql - 设置密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5
# mysql - 设置空密码
$ docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -d mysql:5.5

# 进入容器 mysql
$ docker exec -it mysql_server bash

$ mysql -uroot -p123456


mysql> create database test_db;
mysql> create table student (name VARCHAR(20), age INT(10));
mysql> insert into student (name, age) values ("Andrew", "40"); 
mysql> quit

$ exit  # 退出回主机

# 检查容器 mysql_server 有没有 up
$ docker ps -a
$ docker start mysql_server 

3. php-fpm-mod - php-fpm 5.6.19 加入一些 mysql 模块
制作成 php-fpm-mysql 镜像 (9000/tcp)
 
https://hub.docker.com/_/php/

$ cd /home/用户名
$ mkdir dockerfile_php
$ cd dockerfile_php
$ gedit Dockerfile
 

# 应可以改去 php:5.6.21-fpm, 但 php:7-fpm 会有些模块不能安装
FROM php:5.6.19-fpm

# Install modules
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-configure mysqli --with-mysqli=mysqlnd  \
    && docker-php-ext-install mysqli  \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd  \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-configure mysql --with-mysql=mysqlnd  \
    && docker-php-ext-install mysql

CMD ["php-fpm"]

# 编译镜像 php-fpm-mysql

$ docker build -t php-fpm-mysql /home/用户名/dockerfile_php
$ docker images
# 运行容器 php-fpm-mod

$ docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql

$ docker exec -it php-fpm-mod cat /etc/hosts
172.17.0.2    mysql ad0d03214936 mysql_server  
# 从这里知道 mysql_server 的 IP
172.17.0.3    f20cb9377b85


# 在 php-fpm-mod 测试 mysql

$ docker exec -it php-fpm-mod ping -c 3 mysql 

# 检查容器 php-fpm-mod 有没有 up
$ docker ps -a
$ docker start php-fpm-mod 
 
4. 准备3个测试文件

$ gedit /home/用户名/www/index.html

<html>
<head>
<title>Testing</title>
</head>
<body>
Testing
</body>
</html>

$ gedit /home/用户名/www/index.php

<?php
phpinfo();
?>

$ gedit /home/用户名/www/mysql.php
 

<?php
$con = mysql_connect("172.17.0.2","root","123456");

if (!$con) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db("test_db", $con);

$result = mysql_query("SELECT * FROM student");
while($row = mysql_fetch_array($result)) {
    echo $row['name'] . " " . $row['age'];
    echo "<br />";
}
mysql_close($con);
?>

5. Nginx Server (因要改设置文件, 所以要制作 nginx-fix 镜像)

https://hub.docker.com/_/nginx/

# 可以先运行容器 nginx_server, 备份里面的 /etc/nginx/conf.d/default.conf
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx 
$ docker cp nginx_server:/etc/nginx/conf.d/default.conf /home/用户名/default-ori.conf 
$ docker stop nginx_server
$ docker rm nginx_server  # 撤容器 nginx_server

 
# 准备编译 nginx-fix-0 镜像
$ cd /home/用户名
$ mkdir dockerfile_nginx

# 准备 nginx 设置文件
$ gedit /home/用户名/dockerfile
_nginx/default.conf

server {
    listen 80;

    root /var/www/html;
    index index.html index.htm index.php;

    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

# 准备 Dockerfile 编译镜像
$ gedit /home/用户名/dockerfile
_nginx/Dockerfile

FROM nginx
COPY default.conf /etc/nginx/conf.d/

# 编译镜像 nginx-fix-0
$ docker build -t nginx-fix-0 /home/用户名/dockerfile
_nginx
$ docker images

# 运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix-0

如果现在去浏览 http://127.0.0.1/index.php   # 用 ifconfig 找 IP
会发现空白一片


以下开始 Fix 问题..
 
# $ docker exec -it nginx_server cat /etc/nginx/fastcgi_params
# 容器 nginx_server 中复制 fastcgi_params 出来
$ docker cp nginx_server:/etc/nginx/fastcgi_params /home/用户名/dockerfile
_nginx 
$ docker stop nginx_server
$ docker rm nginx_server  # 撤容器 nginx_server

$ docker rmi nginx-fix-0   # 镜像 nginx-fix-0

# 在 fastcgi_params 中添加一行
$ gedit /home/用户名/dockerfile
_nginx/fastcgi_params

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
# 添加这行以解决空白页的问题
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

# 修改 Dockerfile, 添加 fastcgi_params 文件
$ gedit /home/用户名/dockerfile
_nginx/Dockerfile

FROM nginx
COPY default.conf /etc/nginx/conf.d/
COPY fastcgi_params /etc/nginx/


# 重新编译镜像 nginx-fix
$ docker build -t nginx-fix /home/用户名/dockerfile
_nginx
$ docker images

# 再运行容器 nginx_server
$ docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix


# 检查容器 nginx_server 有没有 up
$ docker ps -a
$ docker start nginx_server   

6. phpmyadmin (8080/tcp)

$ docker run --name phpmyadmin --link mysql_server -e PMA_HOST=mysql_server -p 8080:80 -d phpmyadmin/phpmyadmin

这个要用 http://127.0.0.1:8080
 
7. 开关容器程序 (不一定要用 docker-compose)

$ gedit control.sh

if [ `docker ps -a | grep -c "mysql_data"` -eq 0 ]
then
      var1=`docker run --name=mysql_data -v /var/lib/mysql -d busybox echo MySQL Data`
fi

if [ `docker ps -a | grep -c "wwwroot"` -eq 0 ]

then
      var1=`docker run --name=wwwroot -v /home/用户名/www:/var/www/html -d busybox echo wwwroot`
fi

if [ `docker ps -a | grep -c "mysql_server"` -eq 0 ]

then
      var1=`docker run --name=mysql_server --volumes-from mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5`
fi

if [ `docker ps -a | grep -c "php-fpm-mod"` -eq 0 ]

then
      var1=`docker run --name php-fpm-mod --volumes-from wwwroot --link mysql_server:mysql -d php-fpm-mysql`
fi

if [ `docker ps -a | grep -c "nginx_server"` -eq 0 ]

then
      var1=`docker run --name=nginx_server --volumes-from wwwroot --link php-fpm-mod:php -p 80:80 -d nginx-fix`
      var1=`docker stop nginx_server`
fi

var=`docker ps`

if [ `echo $var | grep -c "80/tcp" ` -gt 0 ]
then
  var1=`docker stop nginx_server`
  var1=`docker rm nginx_server`

  if [ `echo $var | grep -c "9000/tcp" ` -gt 0 ]
  then
      var1=`docker stop php-fpm-mod`
      var1=`docker rm php-fpm-mod` 
  fi

  if [ `echo $var | grep -c "3306/tcp" ` -gt 0 ]
  then
      var1=`docker stop mysql_server`
      var1=`docker rm mysql_server`
  fi

else
  var1=`docker start mysql_server`

  if [ `echo $var | grep -c "9000/tcp" ` -eq 0 ]
  then
      var1=`docker start php-fpm-mod`
  fi

  if [ `echo $var | grep -c "80/tcp" ` -eq 0 ]
  then
      var1=`docker start nginx_server`
  fi
fi

var=`docker ps`
echo "$var"


$ ./control.sh

没有评论:

发表评论