docker设置镜像存储位置

方式1

  • [x] 测试

step1: 停止docker服务
step2: 创建软连接

mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker

方式2

修改镜像和容器的存放路径, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致,在 Ubuntu 中的位置是:/etc/default/docker,在 CentOS 中的位置是:/etc/sysconfig/docker

如果是 CentOS 则添加下面这行:

OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://
如果是 Ubuntu 则添加下面这行(因为 Ubuntu 默认没开启 selinux):

OPTIONS=--graph="/root/data/docker" -H fd://
# 或者
DOCKER_OPTS="-g /root/data/docker"

相关资料

Docker配置本地镜像与容器的存储位置

Docker容器监控系统平台

cAdvisor+InfluxDB+Grafana + prometheus

Tip: 1.8 已把简单的管理界面移除了

部署

cadvisor+influxdb 配置

配置成功后会写入数据自动创建measurements如下

  • cpu_usage_per_cpu
  • cpu_usage_system
  • cpu_usage_total
  • cpu_usage_user
  • fs_limit
  • fs_usage
  • load_average
  • memory_usage
  • memory_working_set
  • rx_bytes
  • rx_errors
  • tx_bytes
  • tx_errors

grafana+influxdb 配置

相关资料

influxdb使用

influxdb.conf 官方
influxdb.conf 1.8 配置模板
命令行简单使用

Chronograf-influxdb-ui 1.8

influxdb.conf 说明
influxdb(UI Chronograf)+grafana使用笔记
Sentinel + InfluxDB + Chronograf 实现监控大屏

grafana配置读取一个容器内存使用的例子
grafana配置教程

docker安装perf性能分析工具

大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。

debian: apt install linux-perf

docker-compose.yml

      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      environment:
        - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
        - DOCKER_HOST=tcp://docker-in-docker:2375
        - FAKETIME=${PHP_FPM_FAKETIME}
        - TZ=${WORKSPACE_TIMEZONE}
      privileged: true # 增加这一行
      depends_on:
        - workspace
      networks:
        - backend
      links:
        - docker-in-docker

相关资料

debian/ubuntu 安装和使用perf
系统级性能分析工具perf的介绍与使用

swoole开启openssl

安装swoole扩展两种方式1. pecl 2. 编译安装

环境说明

  • 宿机win10
  • 操作主机vbox-ubuntu
  • 安装主机docker [letsdockerize/laradock-php-fpm:2.4-7.2]

pecl方式安装

pecl install swoole-4.4.4

执行上面命令后待定一段时间后、会出现下面询问对话输入[y]就是开启, 但是在dockerfile中无法自动为其输入[y]. 方法未找到. dockerfile可以使用编译方式安装.

...
381 source files, building
running: phpize
Configuring for:
PHP Api Version:         20170718
Zend Module Api No:      20170718
Zend Extension Api No:   320170718
enable sockets supports? [no] : 
enable openssl support? [no] : 
enable http2 support? [no] : 
enable mysqlnd support? [no] : 
building in /tmp/pear/temp/pear-build-defaultusernDqLij/swoole-4.4.1
....

编译安装

    curl -o /tmp/swoole.tar.gz https://github.com/swoole/swoole-src/archive/v4.4.1.tar.gz -L && \
    tar zxvf /tmp/swoole.tar.gz && cd swoole-src* && \
    phpize && \
    ./configure \
    --enable-openssl  \
    --enable-http2  \
    --enable-async-redis \
    --enable-mysqlnd && \
    make && make install && \
    docker-php-ext-enable swoole

查看swoole扩展信息

php --ri swoole

出现openssl字符说明已启用openssl

root@4c5bf38c1a5d:/var/www/html# php --ri swoole

swoole

Swoole => enabled
Author => Swoole Team <team@swoole.com>
Version => 4.4.1
Built => Sep  6 2019 05:54:34
coroutine => enabled
epoll => enabled
eventfd => enabled
signalfd => enabled
cpu_affinity => enabled
spinlock => enabled
rwlock => enabled
openssl => OpenSSL 1.1.0j  20 Nov 2018
http2 => enabled
zlib => enabled
mutex_timedlock => enabled
pthread_barrier => enabled
futex => enabled
mysqlnd => enabled
async_redis => enabled

Directive => Local Value => Master Value
swoole.enable_coroutine => On => On
swoole.enable_library => On => On
swoole.enable_preemptive_scheduler => Off => Off
swoole.display_errors => On => On
swoole.use_shortname => On => On
swoole.unixsock_buffer_size => 8388608 => 8388608

pecl install 参数选择 pecl help install

Options:
  -f, --force
        will overwrite newer installed packages
  -l, --loose
        do not check for recommended dependency version
  -n, --nodeps
        ignore dependencies, install anyway
  -r, --register-only
        do not install files, only register the package as installed
  -s, --soft
        soft install, fail silently, or upgrade if already installed
  -B, --nobuild
        don't build C extensions
  -Z, --nocompress
        request uncompressed files when downloading
  -R DIR, --installroot=DIR
        root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM
  -P DIR, --packagingroot=DIR
        root directory used when packaging files, like RPM packaging
  --ignore-errors
        force install even if there were errors
  -a, --alldeps
        install all required and optional dependencies
  -o, --onlyreqdeps
        install all required dependencies
  -O, --offline
        do not attempt to download any urls or contact channels
  -p, --pretend
        Only list the packages that would be downloaded

相关资料

pecl-swoole
github-swoole-tag
pecl 安装swoole怎么开启openssl | 如果是 Nginx 代理到 Swoole,那么 Swoole 不需要配置 SSL 编译Swoole时指定--enable-openssl或--with-openssl-dir可以开启SSL

expect - 自动交互脚本 待研究

服务器性能监控

docker 性能监控方案 服务器性能监控 swoole 进程监控 linux 系统资源监控

linux-命令监控

sudo apt-get install glances 安装

glances 执行命令

glances-介绍

开源方案: cAdvisor+InfluxDB+Grafana + prometheus

连接用户-在influxdb-web 右边齿轮配置用户

sudo docker run -d --name influxdb -p 8086:8086 -p 8083:8083 tutum/influxdb

CREATE DATABASE "cadvisor"

CREATE USER "admin" WITH PASSWORD '123456' WITH ALL PRIVILEGES



sudo docker run -d \
--name=cadvisor \
-p 8082:8080 \
-v /:/rootfs,ro \
-v /var/run:/var/run \
-v /sys:/sys,ro \
-v /var/lib/docker/:/var/lib/docker,ro \
google/cadvisor \
-storage_driver=influxdb \
-storage_driver_db=cadvisor \
-storage_driver_host=192.168.3.67:8086 \
-storage_driver_user=mjw \
-storage_driver_password=a123456

### 测试是否写入influxdb库

SHOW MEASUREMENTS


sudo docker run -d --name grafana -p 3000:3000 grafana/grafana

相关资料

jmeter-监控系统资源

如何选择Docker监控方案
可视化的Docker容器监控系统平台

swoole_tracker

内网DNS服务搭建

内网DNS服务搭建 docker搭建DNS服务

  1. docker pull andyshinn/dnsmasq
  2. 工作目录 /websys/opt/dnsmasq
  3. 域名映射ip文件 my_dnsmasq_hosts
192.168.1.102   test1.com
192.168.1.102   test2.com
  1. dns文件 my_resolv.dnsmasq
nameserver 114.114.114.114
nameserver 8.8.8.8
  1. 启动容器
sudo docker run -d \
-p 192.168.1.102:53:53/tcp \
-p 192.168.1.102:53:53/udp \
-v /websys/opt/dnsmasq/my_dnsmasq_hosts:/etc/my_dnsmasq_hosts \
-v /websys/opt/dnsmasq/my_resolv.dnsmasq:/etc/my_resolv.dnsmasq \
--cap-add=NET_ADMIN \
--name my_dns_server \
andyshinn/dnsmasq
  1. 进入容器修改文件 docker exec -it my_dns_server /bin/sh
vi /etc/dnsmasq.conf 
# 修改两处地方,都需要取消掉注释,并制定文件
addn-hosts=/etc/my_dnsmasq_hosts
resolv-file=/etc/my_resolv.dnsmasq
  1. 退出容器重启-docker restart my_dns_server
  2. 修改路由器上的DNS或客户端电脑上的DNS

docker-compose.yml 版

version: '2'
services:
registry:
  image: andyshinn/dnsmasq:latest
  container_name: my_dns_server
  tty: true
  cap_add:
    - NET_ADMIN
  ports:
    - 192.168.1.102:53:53/tcp
    - 192.168.1.102:53:53/udp
  volumes:
    - /home/wilker/Desktop/a_dns/my_dnsmasq_hosts:/etc/my_dnsmasq_hosts
    - /home/wilker/Desktop/a_dns/my_resolv.dnsmasq:/etc/my_resolv.dnsmasq

相关资料

ubuntu_内网dns服务器搭建

PHP Fatal error: Class ‘Memcache’ not found

使用laradock构建镜像时报错误, Memcache

Memcache是什么?

Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash表,Memcached自管理这些Hash表。

Memcached是简单而强大的。它简单的设计促进迅速部署,易于发展所面临的问题,解决了很多大型数据缓存。它的API可供最流行的语言。

Memcache官方网站:http://memcached.org/

Memcached又是什么?

Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据

修复处理

1.打开php-fpm/Dockerfile 文件大概在320行-或搜索关键字INSTALL_MEMCACHED 修改

原件部分代码

    && ( \  
        cd memcached \
        && phpize \
        && ./configure \
        && make -j$(nproc) \
        && make install \
    ) \
    && rm -r memcached \
    && rm /tmp/memcached.tar.gz \
    && docker-php-ext-enable memcached\
;fi

修改后代码

...
    && ( \  
        cd memcached \
        && phpize \
        && ./configure \
        && make -j$(nproc) \
        && make install \
    ) \
    && rm -r memcached \
    && rm /tmp/memcached.tar.gz \
    && pecl install memcache \
    && docker-php-ext-enable memcached memcache \
;fi
...

2.重新docker-compose build php-fpm

测试代码

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$memcache = new Memcached;             //创建一个memcache对象
$memcache->connect('memcached', 11211) or die ("Could not connect"); //连接Memcached服务器
$memcache->set('key', 'test');        //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get('key');   //从内存中取出key的值

相关资料

memcache和memcached区别
PHP 连接 Memcached 服务
pecl-memcache

给docker运行总的容器添加端口

docker运行中的服务映射端口

docker inspect -f='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器name] 获取容器的IP

iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 IP是有上面一步查出来的、将外部端口8001映射到容器端口8000

iptables -nL 查看端口映射情况

但自己操作后、通过命令查看并没法发现端口映射成功

相关资料

查看docker的端口映射情况
Docker inspect 命令
Docker 给运行中的容器设置端口映射的方法