docker容器配置php和nginx环境并配置扩展swoole

环境

menghuiguli@dreamfly:~$ docker version
Client: Docker Engine - Community
 Version:           19.03.9
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9d988398e7
 Built:             Fri May 15 00:25:18 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.9
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       9d988398e7
  Built:            Fri May 15 00:23:50 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec368
Codename:       bionic

安装php-fpm容器

docker pull bitnami/php-fpm
docker run --name php7-fpm  -v ~/nginx/www:/www -d bitnami/php-fpm

-d 后台运行 -v 目录映射 主机的~/nginx/www目录映射到容器的www目录 --name 给容器一个名字

安装nginx容器

docker pull nginx
docker run -p 80:80 --name nginx -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/conf.d:/etc/nginx/conf.d --link php7-fpm:php -d nginx

-p将容器80端口映射到服务器的80端口

配置nginx文件

将配置文件放到服务器的~/nginx/conf/conf.d/ 文件夹中,文件内容如下:

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
        include        fastcgi_params;
    }
}

fastcgi_pass 这里的php对应的是之前的php7-fpm进程,端口9000是php7-fpm默认进程.

重启nginx容器

docker restart nginx

配置swoole扩展

1.首先进入容器的shell环境

docker exec -it php7-fpm /bin/bash

2.更新源

apt update

3.安装需要的编译环境和文本编辑器

apt install -y gcc g++ autoconf libtool make vim

4.使用pecl安装swoole扩展

pecl install swoole

5.配置php.ini文件

cd  /opt/bitnami/php/bin/php
vim php.ini
添加swoole扩展,就是添加
extension=swoole

6.退出 exit 7.重启php7-fpm容器

docker restart php7-fpm

注意事项

由于swoole提供了http服务器,所以我们可以不使用php-fpm,我们可以直接使用php来运行我们的文件index.php文件如下:

<?php

error_reporting(E_ALL);

$http = new Swoole\Http\Server("0.0.0.0", 9999);

$http->on('request', function ($request,Swoole\Http\Response $response) {

$response->end("<h1>hello</h1>");

});

$http->start();

需要提到的一点,我们都是通过映射来进行和容器的文件交互的。

当我们对php安装了扩展之后,我们可以把我们的容器进行打包成镜像,这样下次运行的时候,就需要重复安装扩展,这也是容器的一个优点。

docker commit php7-fpm swoole

启动容器的方法

docker run --name swoole -it -p 8888:8888 -v /www:/app -d swoole php index.php

运行上面的语句之前,我们本地服务器需要在/www目录下面存在index.php,就是上面我们提到的那个index.php文件,如果不存在,容器就会启动失败。 查看容器的id,然后可以查询到容器的logs

docker ps -a
docker logs id[xxxxxxxxxxxxxxxxx]

而且我们可以进入容器的shell中查看/app目录中是否有同步的index.php

docker exec -it swoole /bin/bash
cd /app
ls

总结

我们的数据最后都是会放入到容器中执行的,那么如何和容器打交道或者通信是我们需要研究的 其中-v这个是一个同步的方法,还有一个就是通过scp 把文件存入到容器中,不管那种方法,最后容器执行的时候,数据都是在容器中运行的,而不是在本地运行的,这也是容器的好处,就是保证了隔离性。