使用 Docker 和 Laradock 进行 PHP 开发
为什么要使用Docker
Docker能极大地减少环境配置和环境差异带来的工作,能相当程度提高生产力.以往我们使用的Homestead等虚拟机只能实现开发环境的共享,并不能用到生产环境中,无法减少运维的工作.
什么是Docker?
Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本! 使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
理解Docker
传统的虚拟机是虚拟一套硬件,再在这套硬件上跑系统,Docker是操作系统级别的虚拟化,寄宿于你计算机中原有的操作系统,共用一套硬件.相比传统虚拟机,Docker更像是一个沙箱,也更轻量高效.在云计算虚拟化方便应用非常广泛.
核心概念
源(Registry)
类似各类Linux软件源,下载镜像的地方
仓库(Repository)
各种版本镜像的集合,例如Ubuntu是一个仓库,这个仓库里放了各种版本的镜像
镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。概念上可以视作程序代码中 "类" 的概念.
容器(Container)
运行镜像产生的就是容器,容器的实质是进程,容器之间是相互隔离的.概念上类比,类实例化产生的对象.
Docker常用命令
#镜像
docker images #列出本地镜像
docker rmi training/sinatra #删除(在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器)
docker run -t -i ubuntu:14.04 /bin/bash #
docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 #更新镜像
docker tag 5db5f8471261 ouruser/sinatra:devel #修改标签
docker build ${dockerfile_dir} #Dockerfile 构建
docker save -o ubuntu_14.04.tar ubuntu:14.04 #保存
docker load --input ubuntu_14.04.tar #导入
#容器
docker ps #查看容器信息
docker rm #删掉容器(-f 删除运行中)
docker inspect #查看指定容器详细信息(可获取ip,pid等信息)
docker logs insane_babbage #查看容器log
docker port CONTAINER [PRIVATE_PORT[/PROTO]] #查看端口映射
docker start|stop|restart insane_babbage #启动终止重启
docker attach insane_babbage #进入后台运行的容器 -d(推荐nsenter)
docker export 7691a814370e > ubuntu.tar #导出快照
cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 #导入快照
## docker hub
docker search #搜索镜像
docker pull #下载
docker push #推送(需登录)
Laradock 是什么?
Laradock是一个利用Docker实现的WEB环境配置工具,集成了大量WEB开发领域会用到的软件,如Redis,Mysql,MongoDB等.为PHP/Laravel开发和部署提供了极大的便利
Laradock 常用命令
docker-compose:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
Laradock官方提供了详细的文档,非常赞
http://laradock.io/
一些经验
- 我们知道Docker的镜像是不含数据的,所以我们的数据需要存到一个共享的数据卷上,Laradoc已经为我们配置好了
- 要熟悉Laradoc,重点看项目目录下的.env和docker-compose.yml,里面有详细的注释和配置项
- Docker的容器是相互隔离的,每个容器都有一套独立的运行时环境,相当于运行在一个微型的Linux上面.注意虽然Laradock转发了一些端口到宿主机127.0.0.1,但127.0.0.1对每个容器来说都是他自己,并不是宿主机.
- 由于众所周知的原因,Docker需要用国内镜像加速
也有一些开发者把镜像里的源都做了替换,如
https://github.com/callect/laradock
我个人并没有用这个,不是很新,很多官方新出的镜像没有
但如果用官网的版本,最要有高速科学上网的工具,不然就得手动改源了 - win10需要专业版和企业版才能使用Hyper-V,这是Docker在windows上运行的基础
国内用户如何加速容器内的包安装
推荐方法:为DockerFile设置http_proxy代理
docker-compose build --build-arg http_proxy=http://ip:port
参考资料:
Docker — 从入门到实践(免费的电子书, star 5.6K +)
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
我docker-composer build nginx 从网站上fetch慢点要死。怎么破?
Cr, 嘿嘿,知道我是谁么?
@rufo
国内用户如何加速容器内的包安装
@rufo
进入容器
docker-compose exec php-fpm bash
@CRQM 谢谢,我等下试一试
Laradock中的两个站点 如何才能相互请求
@suoak php-fpm容器中修改hosts,把要访问的本地域名指向本机
生产上问题:
1 - 用docker性能太差,不如用虚拟化。
2 - docker稳定但是容易造成意外,随便一个人进入实例改了什么都不知道。
开发上就是要添加新的东西,最好提前要由正确地操作步骤,否则一次次太麻烦。
@颜⑧
虚拟机不也有这个问题吗?生产环境都是要安全措施的。
docker还能可以用
docker diff查看整个容器内被修改的文件和目录。使用中.......
@Oraoto 进入实例不需要用户名密码啊
不会, 先 mark. 国庆来捣鼓
lardock如果多站点啊?
在nginx下增加了配置文件也不行?其它地方不知道要修改哪里
@rufo 修改 nginx 的 dockerfile , 添加换源的命令即可
@rufo 命令的话,在 issue 中有,你去找找就有了。
我是从 laradock 转 homestead 的。使我弃用 laradock 的原因是每当我修改了 .env 或者 根据自己需要修改 dockerfile 后,从新 build 的时候,总是需要等待漫长的时间。虽然等待一次也没啥,只是如果是根据自己需要修改 dockerfile 后,每次调试什么的,都要等待,太久了。第二是,当你在非 linux 下使用 docker 的时候,如果遇到让你升级 docker,你又不小心点了升级。如果出了问题。解决起来十分麻烦,虽然乐于解决问题(曾经睡觉前点了升级,醒来后,升级失败。然后相关的东西没了。自己又作死的 fetch 了 laradock,升级下 laradock,然后反正就是十分作死加麻烦就对了)
@suoak 博客:PHP 全局使用 Laravel 辅助函数 dd (补充:docker 环境下全局使用) 文章底部提到了你想要的
@rufo https://github.com/laradock/laradock/issue... 在这个 issue 中,换源被移除了,你可以按照这个 issue https://github.com/laradock/laradock/issue... 处理,更换 nginx 的 源
@suoak @CRQM 2 个站点互相访问不用修改 fpm 中的 host,只需要添加域名的时候,IP 指向正确就可以了。至于这个 ip,我是进入 workspace 容器
ip addr得到的。然后取的网关.1来做域名的指向。@蜗牛 dockerfile文件和.env都是生成运行环境用的,一般不会频繁改动吧?
@WFC 恩,没错,只是当你需要为了自己的需要,修改 dockerfile 的时候,你 build 要等很久的,如果写一次就build出了你自己最终要的 dockerfile 那还好,要是边写边调,只能说等很久
最大的问题,win10用了docker虚拟机就不能用了
容器好是好,就死build这个问题很麻烦 我是直接进容器安装,然后再导出镜像 再添加镜像。减少等待时间
用linux开发还是好很多的。
之前是开发python 虚拟机linux桌面系统 安装容器 做爬出,直接怕硬盘跑100%使用率,就不敢再虚拟机里面跑了。
请问docker中运行的laravel速度很慢,有没有什么解决办法
打开首页的路由都要1秒多,更别提开发了
@metal_time 恩 是的,我也遇到同样的情况,正在定位,不确定咋放docker了后性能会差那么多
请问使用laradock,怎么让使用同一个局域网的同事通过IP访问项目
laradock build 的时候 提示apt-get update 的那些资源无法访问;Failed to fetch http: archive xxx InRelease 但是我宿主机是可以直接访问那些地址的,这是什么问题? 尝试了网上的各种修改源都没有用; 求助 :joy: