当地发展的苦恼
在开发之前,首先需要将各种开发工具和服务支持安装到您的开发环境中,这可能会导致依赖问题、环境变量问题、端口冲突、编译库问题等等。
在开发过程中,您可能需要依赖一些其他服务。 你最好希望不会有任何问题。 也许您将不得不重新绘制来配置您的环境,因为您所有依赖的服务都位于您唯一的工作区上。
如果你的合作伙伴的操作系统不统一,你可能会遇到一些不同元字符的解析不一致的问题。
之后,在上线之前,或许可以完美运行本地开发调试,但是一旦部署到服务器上,就会出现各种问题。 大多数情况下,我们的开发环境和生产环境并不相同。
也许你上次必须使用新的项目开发环境。 你必须一次又一次面对这些问题。
你必须提出要求,并且花费大量时间来构建环境。
什么是 Docker
Docker是一个开源应用程序容器引擎,允许开发人员将他们的应用程序和依赖项打包到一个可移植的容器中,然后可以将其分发到任何流行的Linux机器上,也可以进行虚拟化。 容器是完全沙箱化的,它们之间不会有socket。对于我们来说,我认为只需要理解为一个可移植的应用程序容器
Docker 本地开发环境的好处
审判
对于开发者来说,每天晚上诞生的各种新技术都需要尝试,但开发者不可能为它们搭建一个环境并一一测试。 时间非常宝贵。 感谢 Docker,我们可以通过一条或几条命令构建一个环境,这个环境可以大到某个特定版本的操作系统,也可以小到一个软件。 Docker有一个笨办法来获取软件,Docker后台会手动获取环境镜像并运行环境。
统一的开发和生产环境
对于普通的小公司来说本地php环境搭建,搭建一个公共的开发环境并不是那么负担得起的。 这样,Docker就可以用来统一开发环境,因为无论你使用的是Windows、Mac还是Ubuntu,都没有关系。 如果生产环境也使用Docker,你甚至可以直接打包一个环境,扔掉就运行,再也不用担心开发环境和生产环境的差异了。
高性能
虚拟机的精细是虚拟机,而Docker的精细是受限制的应用。 相比之下,Docker占用显存更少,更轻量级,性能更好。 笔试书:
而且二级启动也可以让我们启动笔记本,而开发环境的运行是潜移默化的。
成就
我们可能经常要向用户或者朋友展示同样的功能,搭建演示环境的过程是非常麻烦的。 现在我们可以直接把我们的镜像打包扔掉本地php环境搭建,不需要做任何环境配置工作,同时我们也不用担心它们的环境配置会让我们的产品难以运行。
安装 Docker
在mac平台上,只需下载一个dmg安装文件即可。 下载完成后,双击,然后push进去。Windows应该类似。
就像安装qq一样简单,就像个白痴一样。
附上dockerhub上的下载链接:
成功后属于dockerversion。 如果下载到版本信息则表示安装成功,类似如下
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-composer
一般来说,mac安装docker后,也会携带docker-composer。
其他平台请附上下载链接:
安装完成后可以输入命令查看
➜ ~ 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的项目地址是我们可以找个地方克隆它
这里我在我的用户目录下新建了一个Docker目录,然后将项目克隆了出来
配置环境文件
将示例复制到 .env
cp env-example env
.env 文件中的 APP_CODE_PATH_HOST 为本地路径 APP_CODE_PATH_CONTAINER 为远程映射路径,根据需求的变化而定,大多数情况下不需要
如果需要调试代码,还可以开启 PHP_FPM_INSTALL_XDEBUG 和 WORKSPACE_INSTALL_XDEBUG 选项
如果还有其他需求,可以在.env上搜索,大部分配置项已经分离出来了
另外推荐公众号Java精选,回复java笔试,获取docker系列笔试资料,支持在线写题。
运行容器
进入laradock的工作目录,即克隆项目的根目录。 我的工作目录是~/Docker/laradock。
然后运行以下命令
docker-compose up -d nginx 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的组合。 如果容器不存在,则构建一个容器并启动服务。 如果容器存在,则直接启动服务,大概就是-d的意思,表示后台运行
配置网络项目
以下是我的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。
vim /etc/hosts
我这里是添加自己设置的虚拟域名
127.0.0.1 blog.test
然后保存并刷新主机。
配置nginx
进入./laradock/nginx/sites文件夹,然后点击它,我们会发现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 公众 号 Java精选,有惊喜
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;
使用权
输入网址
http://blog.test/
浏览器返回结果