使用 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 +)

Laradock项目 star 3.7k+

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 27

我docker-composer build nginx 从网站上fetch慢点要死。怎么破?

6年前 评论
Aaron

Cr, 嘿嘿,知道我是谁么?

6年前 评论

@rufo

国内用户如何加速容器内的包安装

#备份sources.list文件
cp /etc/apt/sources.list /etc/apt/sources.list.bak
#修改sources.list源
cat > /etc/apt/sources.list

#粘贴阿里云源内容
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

#Ctrl + c 退出粘贴

apt-get update
6年前 评论

@rufo

进入容器

docker-compose exec php-fpm bash

6年前 评论

@CRQM 谢谢,我等下试一试

6年前 评论

Laradock中的两个站点 如何才能相互请求

6年前 评论

@suoak php-fpm容器中修改hosts,把要访问的本地域名指向本机

6年前 评论
颜⑧

生产上问题:

1 - 用docker性能太差,不如用虚拟化。

2 - docker稳定但是容易造成意外,随便一个人进入实例改了什么都不知道。

开发上就是要添加新的东西,最好提前要由正确地操作步骤,否则一次次太麻烦。

6年前 评论
Oraoto

@颜⑧

随便一个人进入实例改了什么都不知道

虚拟机不也有这个问题吗?生产环境都是要安全措施的。

docker还能可以用docker diff 查看整个容器内被修改的文件和目录。

6年前 评论
lol173

使用中.......

6年前 评论
颜⑧

@Oraoto 进入实例不需要用户名密码啊

6年前 评论

不会, 先 mark. 国庆来捣鼓

6年前 评论
Jourdon

lardock如果多站点啊?
在nginx下增加了配置文件也不行?其它地方不知道要修改哪里

6年前 评论
mouyong

@rufo 修改 nginx 的 dockerfile , 添加换源的命令即可

6年前 评论
mouyong

@rufo 命令的话,在 issue 中有,你去找找就有了。

6年前 评论
mouyong

我是从 laradock 转 homestead 的。使我弃用 laradock 的原因是每当我修改了 .env 或者 根据自己需要修改 dockerfile 后,从新 build 的时候,总是需要等待漫长的时间。虽然等待一次也没啥,只是如果是根据自己需要修改 dockerfile 后,每次调试什么的,都要等待,太久了。第二是,当你在非 linux 下使用 docker 的时候,如果遇到让你升级 docker,你又不小心点了升级。如果出了问题。解决起来十分麻烦,虽然乐于解决问题(曾经睡觉前点了升级,醒来后,升级失败。然后相关的东西没了。自己又作死的 fetch 了 laradock,升级下 laradock,然后反正就是十分作死加麻烦就对了)

6年前 评论
mouyong

@rufo https://github.com/laradock/laradock/issue... 在这个 issue 中,换源被移除了,你可以按照这个 issue https://github.com/laradock/laradock/issue... 处理,更换 nginx 的 源

6年前 评论
mouyong

@suoak @CRQM 2 个站点互相访问不用修改 fpm 中的 host,只需要添加域名的时候,IP 指向正确就可以了。至于这个 ip,我是进入 workspace 容器 ip addr 得到的。然后取的网关 .1 来做域名的指向。

6年前 评论

@蜗牛 dockerfile文件和.env都是生成运行环境用的,一般不会频繁改动吧?

6年前 评论
mouyong

@WFC 恩,没错,只是当你需要为了自己的需要,修改 dockerfile 的时候,你 build 要等很久的,如果写一次就build出了你自己最终要的 dockerfile 那还好,要是边写边调,只能说等很久

6年前 评论

最大的问题,win10用了docker虚拟机就不能用了

6年前 评论

容器好是好,就死build这个问题很麻烦 我是直接进容器安装,然后再导出镜像 再添加镜像。减少等待时间
用linux开发还是好很多的。
之前是开发python 虚拟机linux桌面系统 安装容器 做爬出,直接怕硬盘跑100%使用率,就不敢再虚拟机里面跑了。

6年前 评论

请问docker中运行的laravel速度很慢,有没有什么解决办法
打开首页的路由都要1秒多,更别提开发了

6年前 评论

@metal_time 恩 是的,我也遇到同样的情况,正在定位,不确定咋放docker了后性能会差那么多

5年前 评论

请问使用laradock,怎么让使用同一个局域网的同事通过IP访问项目

4年前 评论

laradock build 的时候 提示apt-get update 的那些资源无法访问;Failed to fetch http: archive xxx InRelease 但是我宿主机是可以直接访问那些地址的,这是什么问题? 尝试了网上的各种修改源都没有用; 求助 :joy:

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!