使用docker搭建lnmp环境

docker是一个开源的容器引擎,随着“微服务架构”正在变得越来越重要,docker也变得越来越火。但是网上的文章中,要么是很有借鉴意义的干货,要么就是使用高端术语来讲述什么叫做微服务架构。今天我就通过文章来记述一下传统lnmp迁移docker的过程。

项目背景

主要是以自身的博客系统作为迁移的样例,项目环境是传统的lnmp环境。

前期准备

安装docker
$ sudo apt-get install docker.io -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
...
Setting up docker.io (1.6.2~dfsg1-1ubuntu4~14.04.1) ...
docker start/running, process 26908
获取php-fpm镜像
$ sudo docker search php-fpm #查找php-fpm镜像
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
php                               While designed for web development, the PH...   2782      [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable ...   454                  [OK]
bitnami/php-fpm                   Bitnami PHP-FPM Docker Image                    41                   [OK]
phpdockerio/php7-fpm
...

$ sudo docker pull  phpdockerio/php7-fpm:latest
latest: Pulling from phpdockerio/php7-fpm
632d62e9ff45: Pull complete
4719c3e8a982: Pull complete
2309d29c605a: Pull complete
83aeee240cf5: Pull complete
6962aaa46258: Pull complete
ceb4c4ec812a: Pull complete
821e3516e882: Pull complete
ef64564fd4f8: Pull complete
4ce8803d2ea8: Pull complete
ba9d4bc26f3e: Pull complete
20fd756c6431: Pull complete
f7729a02ff06: Pull complete
Digest: sha256:a2a240a31c8afdf723a8554b6c46691069a80ac622cbb5ab77fcd7b5762ddc58
Status: Downloaded newer image for phpdockerio/php7-fpm:latest
同理获取nginx镜像和MySQL镜像
$ sudo docker pull nginx:latest
$ sudo docker pull mysql:latest
端口检查
$ netstat -anp | grep "80\|3306\|9000" ##查看80 3306 和 9000端口占用情况,如果被占用,停掉响应服务
查看镜像
$ sudo docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                  latest              3ad8e8e4bdb1        14 hours ago        408.2 MB
phpdockerio/php7-fpm   latest              f7729a02ff06        5 days ago          166.2 MB
nginx                  latest              2ecc072be0ec        7 days ago          108.3 MB
运行镜像

生成MySQL容器

$ sudo docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 --name docker_mysql_00 mysql:latest

生成nginx容器,外部80端口映射到内部80端口,关联容器内外文件夹

$ sudo docker run -d -p 80:80 -v /usr/share/nginx:/usr/share/nginx -v /etc/nginx:/etc/nginx --name docker_nginx_00 nginx:lastest

生成php-fpm容器, 同理

$ sudo docker run -d -p 9000:9000 -v /usr/share/nginx:/usr/share/nginx --name docker_php_fpm_00 phpdockerio/php7-fpm

镜像配置

查看容器的ip

$ sudo docker inspect docker_php_fpm_00 docker_nginx_00 docker_mysql_00| grep "IPAddress"
"IPAddress": "172.17.0.7",
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.2",

配置nginx和php-fpm

$ sudo docker exec -ti docker_nginx_00 /bin/bash #进入docker_nginx_00容器
vim /etc/nginx/sites-enabled/blog.conf ##像正常一样配置nginx,

server {
        listen 80;
        root /usr/share/nginx/wordpress;
        index index.php index.html index.htm index.nginx-debian.html;

        server_name blog.feilong.tech www.feilong.tech feilong.tech;

        location ~ \.php$ {
                fastcgi_pass 172.17.0.7:9000; ##php-fpm容器的IP
                fastcgi_index  index.php;
                set $path_info "";
                set $real_script_name $fastcgi_script_name;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;

        }
}

同理配置好MySQL的IP地址,容器可能没有安装vim,所以编辑之前需要提前apt-get update。然后进行安装。

总结

安装过程比较复杂,尤其是需要配置IP。其实整个过程并不是符合docker的期望,理想情况是将lnmp放到一个容器中,即直接使用sudo docker search lnmp查找镜像,进行意见安装。前端使用nginx,通过\$host配置转发到端口,然后通过docker端口的映射到达容器内部。