运用 Docker 建立本地开发环境!

本地开发之痛苦

在开发之前,首要你需求装置各种开发工具和服务支撑到你的开发环境当中,可能会出依靠问题环境变量问题端口冲突,经编译库问题等等。

开发途中,可能你又需求依靠一些其他的服务,你最好祈求不会出问题,可能你又要重写来装备你的环境,因为你的所有的依靠服务都在你的唯一的作业空间里边。

假如你的伙伴的操作系统不一致,可能你还会遇到一些不同元字符解析不一致的问题。

然后上线之前,可能你在本地开发调试都能够完美运转,一但部署到服务器,就会呈现各种问题。因为大多数情况下,咱们的开发环境和生产环境并不相同。

可能你下次又有要用到一个新的开项目的开发环境。你又要重复面临上面这些问题.

你不得不去审视,你要话费很多的时间用在建立环境当中来。

正巧,我在3A平台购买了云服务器,能够测试一下。

什么是Docker

Docker 是一个开源的运用容器引擎,让开发者能够打包他们的运用以及依靠包到一个可移植的容器中,然后发布到任何盛行的 Linux 机器上,也能够完结虚拟化。容器是完全运用沙箱机制,相互之间不会有任何接口。对咱们而言,我觉得只需求把他理解成一个便携的运用容器 即可

Docker本地开发环境的优点

试错

对开发者而言,每天会催生出的林林总总的新技能都需求测验,然而开发者却不太可能为他们逐个建立好环境并进行测试。时间十分宝贵,正是得益于 Docker,让咱们有可能在一条或许几条指令内就建立完环境,而且这个环境大到一个特定版别的操作系统,小到一个软件。Docker 有一个傻瓜化的获取软件的方法,Docker后台会主动取得环境镜像而且运转环境。

一致开发和生产环境

关于一般的小公司来说,建立一个公用的开发环境是一件不那么划算的作业。那么就能够用 Docker 来一致开发环境,因为不管你用的是 Windows、Mac 仍是 Ubuntu。假如生产环境也运用的 Docker 的话,你乃至能够直接打包一套环境,直接丢上去就能够运转了,再也不用忧虑开发-生产环境之间的差异了。

高性能

虚拟机的粒度是虚拟出的机 ,而 Docker 的粒度则是被限制的运用 ,相比较而言 Docker 的内存占用更少,愈加轻量级,性能也更优。

而秒级的发动,也能够让咱们发动电脑时候,开发环境的运转是无感知的。

效果展现

咱们可能常常要给用户或许是同事展现相同功用的,但是建立演示环境的过程却是十分麻烦的。现在能够直接将咱们的镜像打包丢过去,而不用去做任何环境装备的作业,同时也不用忧虑他们的环境装备会导致咱们的产品无法运转。

装置Docker

在mac平台下,便是去下载一个dmg的装置文件。下载好了之后,双击,然后拖入就能够了,windows应该也是相似的。

便是装置qq相同简单,傻瓜式的。

附上dockerhub上的下载链接:

https://hub.docker.com/search/?type=edition&offering=community&q=

成功之后归于docker version假如出来版别信息便是装置成功,相似如下

Client: Docker Engine - Community
 Version:      18.09.0
 API version:    1.39
 Go version:     go1.10.4
 Git commit:     4d60db4
 Built:       Wed Nov  7 00:47:43 2018
 OS/Arch:      darwin/amd64
 Experimental:    false

Server: Docker Engine - Community
 Engine:
  Version:      18.09.0
  API version:    1.39 (minimum version 1.12)
  Go version:    go1.10.4
  Git commit:    4d60db4
  Built:       Wed Nov  7 00:55:00 2018
  OS/Arch:      linux/amd64
  Experimental:   true

装置docker-compose

一般来说,mac装置docker之后就会携带docker-compose。

其他平台,附上下载链接:github.com/docker/comp…

装置完结之后能够输入指令检测

  ~ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018

假如没有呈现版别相关信息,能够测验再次装置

下载laradock

laradock的项目地址是github.com/laradock/la… 咱们找一个当地clone下来即可。

我这里是在我的用户目录下面新建了一个Docker目录,然后clone了项目下来。

装备env文件

复制example成.env

cp env-example env

.env文件中APP_CODE_PATH_HOST是本地途径APP_CODE_PATH_CONTAINER是远程映射途径,看需求修正,大多数情况下是不需求的

假如有调试代码的需求,也能够将PHP_FPM_INSTALL_XDEBUGWORKSPACE_INSTALL_XDEBUG两个选项翻开

假如还有其他的需求,能够在.env里边查找,里边现已将大多数装备项都给独立出来了

运转容器

进入到laradock的作业目录下面,便是clone的项目的根目录我的作业目录便是~/Docker/laradock。

然后运转如下指令

docker-compose up -d nginx mysql

就会看到在主动执行build操作,而且build完了之后主动后台发动了如下容器

  • nginx
  • php-fpm
  • workspace
  • mysql

那是因为php-fpm和workspace还有docker-in-docker是随nginx一并发动的

所以实际上

docker-compose up -d nginx mysql

docker-compose up -d nginx workspace php-fpm mysql

这两条指令的效果是相同的,能够都带上,也能够不写。

up指令在第一次发动的时候实际上便是build + start的组合,假如容器不存在,那么就build一个容器,而且发动服务,假如容器存在那么直接发动服务,大约便是这么个意思 -d的意思是后台运转

装备web项目

一下是我laravel项目的部分装备

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=root
......

注意,数据库主机必须得是别号才能够,假如DB_CONNECTION这个当地输入172.0.0.1或许是localhost都是会连接失利的。

在其它的项目中也必须是这样的,装备数据库链接,redis,或许MemCache链接都必须设置成详细的别号。或许你说我找到各个容器的ip,能够嘛。能够,但是并不建议这样做,因为ip是会变化的。

详细别号能够参阅./docker-compose.yml文件中的设置

这个首要的技能完结应该是用了docker的虚拟网桥技能.

装备宿主机的host

因为,往往咱们拜访的时候,是通过宿主机上面的浏览器发送恳求的,所以,装备宿主机上面的host必不可少。

vim /etc/hosts

我这里参加一条我自己设置的虚拟域名

127.0.0.1    blog.test

然后保存,刷新下host。

装备nginx

进入到./laradock/nginx/sites文件夹,然后ll一下,咱们会发现,laradock现已帮咱们放了很多列举的文件进来

app.conf.example default.conf laravel.conf.example symfony.conf.example

根据需求复制一份,然后修正一下就能够了,都不是很难,因为咱们本地是laravel开发的博客项目,所以我就直接复制laravel.conf.example,然后运用vim翻开

cp laravel.conf.example blog.conf vim blog.conf
翻开后的内容…
server {
​
   listen 80;
   listen [::]:80;# For https
   # listen 443 ssl;
   # listen [::]:443 ssl ipv6only=on;
   # ssl_certificate /etc/nginx/ssl/default.crt;
   # ssl_certificate_key /etc/nginx/ssl/default.key;
​
   server_name laravel.test;
   root /var/www/laravel/public;
   index index.php index.html index.htm;
​
   location / {
     try_files $uri $uri/ /index.php$is_args$args;
   }
​
   location ~ .php$ {
     try_files $uri /index.php =404;
     fastcgi_pass php-upstream;
     fastcgi_index index.php;
     fastcgi_buffers 16 16k;
     fastcgi_buffer_size 32k;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     #fixes timeouts
     fastcgi_read_timeout 600;
     include fastcgi_params;

咱们会发现,假如没有特殊需求的话,这个里边大多数当地咱们并不需求修正。咱们只需求关注server_name和root这两个参数,把这个里边的laravel换成咱们项目名就能够了,这里咱们换成blog

下面是修正后的内容
server {
​
   listen 80;
   listen [::]:80;# For https
   # listen 443 ssl;
   # listen [::]:443 ssl ipv6only=on;
   # ssl_certificate /etc/nginx/ssl/default.crt;
   # ssl_certificate_key /etc/nginx/ssl/default.key;
​
   server_name blog.test;
   root /var/www/blog/public;
   index index.php index.html index.htm;
​
   location / {
     try_files $uri $uri/ /index.php$is_args$args;
   }
​
   location ~ .php$ {
     try_files $uri /index.php =404;
     fastcgi_pass php-upstream;
     fastcgi_index index.php;
     fastcgi_buffers 16 16k;
     fastcgi_buffer_size 32k;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     #fixes timeouts
     fastcgi_read_timeout 600;
     include fastcgi_params;

拜访

输入 url blog.test/,浏览器返回成果: