最近部署上线一个项目,新的服务器,在生产环境安装配置nginx、php、mysql、git、composer等各类东西一大堆很麻烦。docker已经火了一段时间,已经成了后端和运维的必备技能,以前老大也说要尝试下,因而就来体验一下docker的魅力。本文是我学习并使用docker部署项目的一个记录。php
docker的主要优点能够总结为:一次构建,处处部署。当咱们使用docker构建好项目后,在开发环境、测试环境、生产环境均可以使用统一的镜像来部署,保证了环境的一致。而且docker支持linux、mac os、windows三大平台,代码运行在容器中,不受外部操做系统的影响,只和你的镜像有依赖关系。mysql
另外咱们能够部署不一样版本的应用,例如mysql5.五、mysql5.7,而且互不干扰。linux
关于docker的安装和相关概念在此都不赘述了,网上有不少资料,说下具体实施的思路。nginx
正确的使用方式不是项目完成后才开始构建docker镜像,而是项目架构、依赖、环境肯定了以后就构建和配置好docker镜像,以后代码的开发和运行都在容器之中。以后部署只须要移植镜像生成容器,就能保证环境的一致。laravel
我这个项目很简单,只用到nginx、php、mysql这三件套,nginx使用php-fpm做为cgi解析器。须要使用三个镜像:nginx、php-fpm、mysql。为何要用三个镜像而不是把这三个集成到一个大镜像中?这是docker推荐的作法,镜像之间尽可能解耦,方便复用,避免臃肿的镜像,容器间经过网络链接起来。git
官方提供了不少优质镜像,咱们只须要挑选并基于官方镜像来配置就好。github
DockerFile:docker
FROM nginx:1.10 ADD nginx.conf /etc/nginx/nginx.conf ADD site.conf /etc/nginx/conf.d/ ADD mkdir.sh /opt/ RUN chmod +x /opt/mkdir.sh && /opt/mkdir.sh
将基本配置和站点配置复制进去,用shell脚步来建立好log文件夹shell
DockerFile:
FROM php:7.0-fpm ADD apt-list /opt/ RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \ && cat /opt/apt-list > /etc/apt/sources.list \ && apt-get update \ && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev RUN docker-php-ext-install -j$(nproc) iconv mcrypt \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install zip RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ && composer config -g repo.packagist composer https://packagist.phpcomposer.com \
php镜像的是最麻烦的,要装系统依赖,php扩展,composer,还要设置环境变量。php扩展那块参考官方镜像dockr-hub-php
使用了apt,因此咱们要修改apt源,官方php镜像是基于debian的,不是ubuntu的源。
dockerfile一个run建一层,这里建议apt install做为一层,安装php扩展做为一层,而不是都放在一层。这样的好处就是若是第二层php扩展装失败了,不用再跑一遍apt install。最后一层咱们装上composer。
为了让php版本一致,咱们应该调用php容器内的php做为cli:
docker run -it -v $PWD:/opt/code -w /opt/code my-php php -v
命令太长了,咱们能够作个alias,在~/.bash_aliases中加入一行(注意最后空格):
alias myphp='docker run -it -v $PWD:/opt/code -w /opt/code --rm my-php '
咱们在yourpath/opt/code下建立laravel应用,修改权限,注意在宿主机将你加入www-data group:
cd ~/docker-php/opt/code myphp composer create-project --prefer-dist laravel/laravel . sudo chown -R www-data:www-data . && sudo chmod -R 775 .
DockerFile:
FROM mysql:5.7
mysql最简单,直接用官方的就好了
咱们如今有三个镜像,若是一个个启动、链接、挂载很麻烦,官方提供了docker-compose工具,将配置写在一块儿,一键启动。
docker-compose.yml:
nginx: build: ./nginx ports: - "80:80" links: - "php" volumes: - ~/docker-php/opt:/opt php: build: ./php ports: - "9000:9000" links: - "mysql" volumes: - ~/docker-php/opt:/opt mysql: build: ./mysql ports: - "3306:3306" volumes: - ~/docker-php/opt/data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123456
使用docker-compose up命令启动容器组:
启动访问 yourhost:80 能够看到熟悉的laravel欢迎页面:
进入mysql容器建个数据库建个表测试一下数据库链接:
docker exec -it dockerphp_mysql_1 bash
修改yourpath/opt/code/routes:
测试了一下报错:
SQLSTATE[HY000] [2002] Connection refused
google了一下,修改一下.env,把db_host改成你的ip:
DB_HOST=127.0.0.1 -> DB_HOST=yourhost
访问/mysql,页面输出,大功告成:
Reference: