Docker on Windows Operation not permitted

先前分享了一个容器化的开发环境——kelvinblood/docker-lnmp,在 mac 下运行无碍,可是跑到Windows下运行的时候,sock 的文件映射就出了问题:

2018/09/17 02:39:54 [crit] 6#6: *2 connect() to unix:/sock/www.sock failed (2: No such file or directory) while connecting to upstream, client: 10.0.75.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/sock/www.sock:", host: "10.0.75.2:8000"

让我疑惑的是,我还有很多的映射,都是ok的,比如log,怎么单单就这个 sock 出了问题?

谷歌了一番,发现 mongo 项目里也有很多人吐槽这个情况,看来并不是我一个人的问题。众多issue里发现了这个靠谱的中文答案:win10下部署报错:Operation not permitted, terminating #7

windows下只能使用volume,不能直接bind磁盘。

创建volume
docker volume create mongodata
docker volume create redisdata
docker volume create logsdata

将docker-compose.yml修改如下
version: "3.3"
...
    image: redis:4.0.6
    command: redis-server --appendonly yes
    volumes:
      - type: volume
        source: redisdata
        target: /data
...

# 一定要声明volumes
volumes:
  redisdata:
    external:
      name: redisdata
      
      
删除production.js中的db配置
运行docker-compose up -d

确实如此。我的修改在这个提交里可以参考:

[bugfix] use sock must use bind type for windows mount volume in dock…


腾讯 23 岁安全工程师因黑入新加坡一酒店 Wi-Fi,或判狱三年

一位中国公民在新加坡出席一次网络安全会议期间,决定黑入他下榻酒店的WiFi。

img

腾讯的23岁安全工程师郑杜涛(音译:Zheng Dutao)很想找出飞龙酒店(Fragrance Hotel)一家分店的WiFi服务器有没有安全漏洞,结果吃上了官司,真是好奇心害死猫。

郑某成功地黑入了这台服务器,并在一篇名为“钻新加坡酒店的空子”的帖子中撰文介绍了始末,他还公布了酒店管理员使用的服务器密码。结果这篇博文引起了新加坡网络安全局(CSA)的注意。

周一(9月24日),郑某因此违法行为在新加坡国家法院被罚5000美元。他对这一项罪名供认不讳:有意披露密码,未经授权擅自访问属于飞龙酒店的数据。法院在对他判决时考虑到了一起类似的罪状。

郑某上个月抵达新加坡参加“夺旗”(Capture the Flag)比赛,这项比赛是在洲际酒店举行的网络安全会议上举办的。参赛的安全专家们各自展示黑客攻击和反黑客能力。

郑某在8月27日入住了位于武吉士的飞龙酒店。一天后,他很好奇,想知道这家酒店的WiFi服务器有没有可能存在安全漏洞。通过谷歌,他成功地搜索到了这家酒店WiFi系统的默认用户ID和密码。

郑某连接到酒店的WiFi网关后,在接下来的三天内执行脚本、解密文件和破解密码,然后闯入了酒店WiFi服务器的数据库。

酒店使用的这款服务器存在一个安全漏洞,郑某钻了该漏洞的空子,最终闯入了服务器。他还试图访问飞龙酒店小印度分店的WiFi服务器,但结果失败了。

郑某在其个人博客上记述了他的攻击步骤。他在博文中公布了飞龙酒店WiFi服务器的管理员密码,还在WhatsApp群聊中共享了那篇博文的URL链接。


使用 docker 构建本地 lnmp 开发环境(Mac)

最近给个人的 mac 重装了系统,所有的配置全部没有了。对 Mac 下的 PHP 不同语言的环境切换还是很头疼的。这篇文章将介绍我使用 docker 部署本地 lnmp 开发环境的整个过程,可以结合我的 github 提交历史了解。业务涉及的知识点有 openresty、php 7.1、laravel、composer、postgresql、redis 等。

本项目也已经开源在 github 上,可以简单使用 docker-compose up -d 命令直接运行起来。

架构

这套环境由前端 openresty 接收请求,通过 linux sock 的方式传给 php-fpm,php-fpm 解析 php 代码,并连接数据库 postgresql 和 redis。

openresty 模块要做好配置文件,与 php-fpm 进行对接。

php-fpm 模块,需要事前编译 postgresql 扩展包。也要做好配置文件,与 openresty 对接。同时代码运行也需要提前使用 composer 进行依赖包的安装,并做好与 postgresql 的配置对接。

postgresql 模块需要准备好 dump 文件,用于首次运行的数据库准备工作。如有需要还要编辑postgresql的配置文件,比如打开慢日志、外部连接等配置。

相关的日志文件保存到 log 文件夹下。

对应的 docker-compose.yml 文件如下:

version:  '3.0'
services:
  nginx:
    image: openresty/openresty:alpine
    volumes:
      - $MYWORKSPACE:/var/www/html
      - ./openresty:/etc/nginx/conf.d
      - ./sock:/sock
      - ./log:/log
    links:
      - "php:php"
    ports:
      - "8000:80"

  php:
    build: ./php
    volumes:
      - $MYWORKSPACE:/var/www/html
      - ./php/php-fpm.d:/usr/local/etc/php-fpm.d
      - ./php/conf/php-fpm.conf:/usr/local/etc/php-fpm.conf
      - ./sock:/sock
      - ./log:/log
    links:
      - "pgsql:pgsql"

  pgsql:
    image: postgres:9.4-alpine
    volumes:
      - ./psql/data:/var/lib/postgresql/data
      - ./psql/dump:/var/lib/postgresql/dump
    ports:
      - "5432:5432"

openresty

基于 laravel 的写法,主要注意点在于 fastcgi 使用 sock 的方式,对提高 php 性能很有帮助。

server {
    listen       80;

    access_log off;
    error_log off;

    root         /var/www/html/public;

    location = / {
        fastcgi_pass                               unix:/sock/www.sock;
        fastcgi_index                              index.php;
        include                                    fastcgi.conf;
    }

    location = /_status {
        fastcgi_pass                               unix:/sock/www.sock;
        include                                    fastcgi.conf;
        fastcgi_param           SCRIPT_NAME        /_status;
    }

    location / {
        # URLs to attempt, including pretty ones.
        try_files   $uri $uri/ /index.php?$query_string;
    }

    # Remove trailing slash to please routing system.
    if (!-d $request_filename) {
        rewrite     ^/(.+)/$ /$1 permanent;
    }

    location ~* ^(.+\.php)(.*)$ {
        # limit_req zone=req_perip burst=8;
        fastcgi_pass                               unix:/sock/www.sock;
        fastcgi_split_path_info                    ^(.+\.php)(.*)$;
        include                                    fastcgi.conf;
    }

    location /nginx_status {
       stub_status on;
       access_log off;
    }
}

php-fpm

我使用的是 postgresql 数据库,官方默认没有带有 postgresql 的扩展,需要自行编译。官方专门为容器提供了三个的命令,用来简化扩展的安装: docker-php-ext-configuredocker-php-ext-install, 和 docker-php-ext-enable 。具体使用可以查看 Dockerfile:

FROM php:7.1-fpm

RUN apt-get update

RUN apt-get install -y libpq-dev \
    && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
    && docker-php-ext-install pdo_pgsql pgsql

还有需要注意的是laravel 项目的依赖安装的工作。在这里我也是使用了容器进行处理。可以参考 test.sh 文件中的命令:

#!/bin/bash

MYWORKSPACE="/Users/kelu/workspace/wechat.kelu.org"

docker run -it --rm \
  -v $MYWORKSPACE:/app \
  composer:1.4.2 install --ignore-platform-reqs --no-scripts

postgresql

完成了前面两步,接下来开始安装 postgresql。

我目前还在使用 postgresql 9.4的版本,所以安装时指定了版本号。

postgresql 比较重要的两个配置文件我提取了出来,以方便修改:

  • ./psql/data/postgresql.conf
  • ./psql/data/pg_hba.conf

因为本地环境的原因我便偷懒了一会,首次运行后需要手动进入镜像还原数据库。按照标准的做法是做一个只运行一次用于还原数据库的镜像。

如何使用可以参考 psql 目录下的 readme 文件,主要步骤是:

  • 设定数据库管理员密码
  • 生成用户 abc 和 其管理的数据库 abc
  • 还原 dump 文件
  • 检验是否还原成功
su postgres
psql

\password postgres
CREATE USER abc WITH PASSWORD 'abc';
CREATE DATABASE abc OWNER abc;
GRANT ALL PRIVILEGES ON DATABASE abc to abc;

sudo -u postgres pg_restore -d abc abc.dump;

\l
\c abc
\d
\d account
\q

待办

redis 的内容待完成。

参考资料