2020年6月

docker入门

docker linux的安装

# 下载
sudo wget -qO- https://get.docker.com/ | sh # 下载docker安装shell脚本

# 添加用户到docker用户组
sudo usermod -aG docker xbf # 用户xbf添加到docker用户组

# 安装后启动服务
service docker start

# 使用阿里云docker加速器
https://cr.console.aliyun.com/#/accelerator

docker命令

docker build # 建立一个新的image
docker pull nginx # 下载一个iamge
docker run -p 8080:80 -d nginx # 运行容器
docker ps # 查看运行的docker程容器
docker stop 容器ID # 停止运行
docker commit -m '备注' # 提交新的images
docker rmi image的ID # 删除image

编写简单文件自创docker镜像

# 新增文件夹下Dockerfile文件
FROM alpine:latest
MAINTAINER zhorz
CMD echo "Hello Docker"

# 在新建的文件夹下运行命令: docker build -t hello_docker . 

# dockerfile语法
FROM base image
RUN 执行命令
ADD 添加文件
COPY 拷贝文件
CMD 执行命令
EXPOSE 暴露端口
WORKDIR 指定路径
MAINTAINER 维护者
ENV 设定环境变量
ENTRYPOINT 容器入
USER 指定用户
VOLUME mount point

重新学习 20200628

更换 unbuntu 源 https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.11871b11drdcbT

docker 下载 和安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

验证
apt list --installed | grep docker
sudo docker run hello-world

更换 docker 源 https://www.cnblogs.com/reasonzzy/p/11127359.html (最好用阿里云的,飞快)

重启使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

windows 使用 docker : https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly

通过Dockerfile 安装

FROM php:7.4.6-fpm-buster
# 设置阿里云源
RUN echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib\n\
deb http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb-src http://mirrors.aliyun.com/debian-security buster/updates main\n\
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib\n\
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib\n\
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib' > /etc/apt/sources.list
RUN apt-get update
# gd库
RUN apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
# pdo
RUN apt-get update && docker-php-ext-install pdo_mysql
# yaf
RUN pecl install yaf && docker-php-ext-enable yaf
# redis 
RUN pecl install redis && docker-php-ext-enable redis
# apcu 
RUN pecl install apcu && docker-php-ext-enable apcu
# pcntl
RUN docker-php-ext-install pcntl
# 生产环境 dev 要改成  product
RUN echo '[yaf]\n\
yaf.environ="dev"\n\
yaf.use_namespace=On\n\
yaf.use_spl_autoload=1' >> /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini

docker build -t sm:php74_v2 .

交互式进入容器
sudo docker run -it -v /home/vagrant:/home/vagrant sm:php74_v2 /bin/bash

启动php-fpm

docker run --name php74 -d -p 9000:9000 -v /home/vagrant:/home/vagrant sm:php74_v2 /usr/local/sbin/php-fpm

修改 nginx 端口指向

function php74(){
tty=
tty -s && tty=--tty
sudo docker run
$tty
--interactive
--rm
--volume $PWD:/home/vagrant
--workdir /home/vagrant
sm:php74_v2 php "$@"
}

更改全局composer源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

php composer.phar -vvv --ignore-platform-reqs install

问题 php:7.4.6-fpm-buster 镜像缺少 pcntl、git

  1. Dockerfile 中添加 docker-php-ext-install pcntl
  2. 从源码编译

sudo docker history php:7.4.6-fpm-buster --no-trunc --format "{{.CreatedBy}}"
得知源码地址 https://www.php.net/distributions/php-7.4.6.tar.gz

cd /path/to/php-source-code/ext/pcntl
phpize
./configure --enable-pcntl --with-php-config=/path/to/php-config
make && make install
php.ini 中 引入 extension=pcntl.so

xphrof 安装和使用

xhprof

安装

git clone https://github.com/longxinH/xhprof.git ./xhprof
cd xhprof/extension/
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make && sudo make install

使用

xhprof_enable();
register_shutdown_function(function () {
    include_once __DIR__ . "/xhprof_lib/utils/xhprof_lib.php";// 包含在扩展目录里
    include_once __DIR__ . "/xhprof_lib/utils/xhprof_runs.php";
    $xhprof_data = xhprof_disable();
    $xhprof_runs = new XHProfRuns_Default();
    $type        = "project_type";
    $run_id      = $xhprof_runs->save_run($xhprof_data, $type);
});

效果

http://www.example.com/xhprof_html/index.php?run={$run_id}&source={$type}&all=1

xhprof 已经好久不维护了,改用 xhgui

xhgui

xhgui 包含两部分 GUI界面 和 profile 收集器,首先安装扩展 tideways_xhprof 收集 php 运行数据

安装扩展 tideways_xhprof

https://github.com/tideways/php-xhprof-extension#installation

线上项目使用 收集器 php-profiler

composer require perftools/php-profiler:v0.5.0 -- 装哪个版本就看哪个版本的README

GUI界面就是一个web项目,以下是 nginx 配置

server {
    listen   80;
    server_name xhgui.wsl;

    # root directive should be global
    root   /mnt/e/xhgui2/webroot/;
    index  index.php;
    access_log off;
    error_log /data/wwwlogs/xhgui.wsl_nginx.log error;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        #fastcgi_pass    127.0.0.1:9000;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

profile 收集的信息可以存放文件,也可以上传到 GUI 提供的接口,使用 mongodb 保存数据

// GUI 信息配置
/path/to/xgui-store/config/config.default.php

线上项目开始收集

try {
    $config   = [
        'profiler.enable'     => function () {
            return true;
        },
        'save.handler'        => \Xhgui\Profiler\Profiler::SAVER_UPLOAD,
        'save.handler.upload' => [
            'uri'     => 'http://xhgui.wsl/run/import', // 上传到GUI提供的接口
            'timeout' => 3,
            'token'   => 'zhorz',
        ],
    ];
    $profiler = new \Xhgui\Profiler\Profiler($config);
    $profiler->start();
    $profiler->registerShutdownHandler();
} catch (Exception $e) {
    echo $e->getMessage();
}

最后就是到 http://xhgui.wsl 分析,每个请求的函数栈执行时间、消耗内存等情况一目了然~