[关闭]
@Aklis 2016-11-15T17:15:08.000000Z 字数 3696 阅读 468

一次 Docker 实践

Docker


前言 - 运维狗的养成

对于一个php应用,实现随时替换App的程序,甚至PHP 还有 Nginx 的版本,以此类推,对于其它应用我们都可以实现各部分的高度隔离,还可以保证测试开发生产都是同一套环境。
对于Docker来说,多容器连接是很方便的。

这一次打算用三个容器 (MySQL, PHP 和 Nginx )
Docker Hub 上有一个是把这三个都打个包放进了一份DockerFile,变成了FatContainer,好一点的是Nginx 和 PHP 放一起把 MySQL独立出来,或者是Apache-php, Nginx, MySQL。
还找到一些方案是把 MySQL, APP, PHP。
列成表格比较直观。

简单的 PHP 应用就这三个东西了,使用docker把它们各自『装』起来,从安全方面考虑,就没办法直接从外网访问mysql, mysql弱口令也不怕了。
不像某场信息安全比赛,mysql竟然是弱口令,还是 SA 权限,啧啧啧。
Redis说这次曝的事情不是他们的锅,因为本来就不应该暴露在危险环境下。啧啧啧。
其实说方便,lnmp一键安装包已经超方便了,但是还是有各种配置不当出现安全问题。Docker 容器就算被日穿了,从缺省安全方面想想,docker化还是比较安心的。

最初的目标

按照

One-Process-Per-Container Principle

拒绝官方所说的
Fat-container 因为这样的话就不如装一个虚拟机了。

MySQL

MySQL的 DockerFile 我觉得还是不需要了,mysql的基础镜像已经够了。

  1. docker pull mysql
  2. docker run --name mysql-master -v ~/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=aklis -it mysql

成功之后可以直接在宿主机通过

  1. docker run -it --link mysql-master:mysql --rm mysql sh -c 'mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

来连接。这一行看明白了之后就能了解--link参数至少改了hosts还有env

1.3之后可以更直接docker exec

PHP Container

参考了一篇文章,觉得这个redis这个玩意以后应该会成为标配,虽然最近爆了个未授权批量拿鸡的洞,但实在是运维的锅。放在docker 里面不要暴露在危险的环境下就好了。顺便把redis for php给加进去了,如果要用的话就再加一个redis容器(也就是第四个啰)。
还有对于 php 的其它扩展也可以通过docker官方帮忙打包的docker-php-ext-install安装,我就做个例子安装个gd和pdo-mysql的支持。

  1. wget https://getcomposer.org/composer.phar -O composer.phar
  2. wget https://pecl.php.net/get/redis-2.2.7.tgz -O redis.tgz

和DockerFile放在同一个目录就好了

DockerFile

  1. FROM php:5.6-fpm
  2. MAINTAINER Aklis <aklis@qq.com>
  3. #The php container is only to execute php script
  4. COPY fpm/* /usr/local/etc/
  5. COPY php/* /usr/local/etc/php/conf.d/
  6. RUN apt-get update && apt-get install -y wget libmemcached-dev libssl-dev libpng12-dev libjpeg-dev re2c libfreetype6-dev libmcrypt-dev libxml2-dev libpq-dev --no-install-recommends && rm -r /var/lib/apt/lists/*
  7. RUN wget https://pecl.php.net/get/redis-2.2.7.tgz -O /tmp/redis.tgz
  8. # Maybe you need the follows
  9. #bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mssql mysql mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sybase_ct sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
  10. RUN docker-php-ext-configure gd --with-jpeg-dir --with-png-dir --with-freetype-dir \
  11. && docker-php-ext-install gd \
  12. && docker-php-ext-install pdo_mysql \
  13. && docker-php-ext-install mysqli \
  14. && docker-php-ext-install mysql \
  15. && docker-php-ext-install iconv \
  16. && docker-php-ext-install mcrypt \
  17. && docker-php-ext-install mbstring \
  18. && docker-php-ext-install zip \
  19. && docker-php-ext-install soap \
  20. && docker-php-ext-install bcmath \
  21. #&& docker-php-ext-install xdebug \
  22. #&& docker-php-ext-install memcache \
  23. #&& docker-php-ext-install xhprof \
  24. #&& docker-php-ext-install mongo \
  25. #&& docker-php-ext-install memcached \
  26. && docker-php-ext-install pgsql \
  27. && docker-php-ext-install pdo_pgsql \
  28. && docker-php-ext-install opcache \
  29. && pecl install /tmp/redis.tgz \
  30. && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini
  31. WORKDIR /opt
  32. CMD ["php-fpm"]

xdebug memcache xhprof mongo memcached这几个东西需要另外下载再通过
docker-php-ext-install安装

php-fpm 就到这里部署完成了。

Nginx Container

DockerFile

  1. FROM nginx:1.9.6
  2. MAINTAINER Aklis <aklis@qq.com>
  3. #The php container is only to execute php script
  4. COPY nginx.conf /etc/nginx/nginx.conf
  5. COPY conf.d/ /etc/nginx/conf.d/
  6. # Add the support of redis and composer
  7. EXPOSE 80 443
  8. CMD ["nginx", "-g", "daemon off;"]

还能做得更多

看起来超有趣!
https://github.com/docker/dockercraft

参考
http://blog.herecura.eu/talks/20141007-php-wvl_isolating-multiple-php-versions-apps-with-docker/#/4

http://www.philo.top/2015/07/21/UbuntuDevEnv/
http://www.philo.top/2015/07/16/pc-docker/

关于compose的参考
https://docs.docker.com/compose/rails/

https://docs.docker.com/compose/wordpress/

https://github.com/EvaEngine/Dockerfiles

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注