laradock
有两种部署方式
多项目
laradock
projectA
projectB
单项目
projectA
laradock
projectB
laradock
事实上,可以通过配置.env
变更你的部署方式,此处推荐多项目
部署, 如下配置不需要修改
# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../
克隆仓库
git clone https://github.com/laradock/laradock.git
你的目录结构应该如下
多项目
laradock
projectA
projectB
配置env
环境
cd laradock
cp env-example .env
您可以编辑该.env文件以选择想要在您的环境中安装哪个软件。您始终可以引用该docker-compose.yml文件以查看如何使用这些变量。
根据主机的操作系统,您可能需要更改给定的值COMPOSE_FILE
。在Mac OS上运行Laradock时,要使用正确的文件分隔符:。从Windows环境运行Laradock时,必须使用多个文件进行分隔;
。
增加配置nginx/sites网站配置, laradock包含laravel.conf.example和symfony.conf.example 作为工作样本
cp nginx/laravel.conf.example nginx/your_app.conf
启动应用, 默认地会把当前laradock所在目录映射到nginx下/var/www
目录
docker-compose up -d nginx mysql
你可以从以下列表选择你自己的容器组合:
nginx, hhvm, php-fpm, mysql, redis, postgres, mariadb, neo4j, mongo, apache2, caddy, memcached, beanstalkd, beanstalkd-console, workspace
大多数情况下, 你可能不会关注程序版本的问题(默认软件版本为latest
),然而在构建过程中难免会因为版本兼容问题导致容器构建失败,比如mysql 5.7容器构建成功, mysql 8.0构建失败, 因此在生产环境中还是得小心测试.
注:workspace 和 php-fpm 将运行在大部分实例中, 所以不需要在 up 命令中加上它们。但是你还是需要通过docker-compose ps 确认容器是否存在
配置hosts
文件, 填写域名映射, 然后你就可以访问你的应用了
your_app.test 127.0.0.1
增加可以上网的代理, 编辑目录下的Dockerfile
pear config-set http_proxy http://192.168.1.55:1080
设置代理, 不要忘记192.168.1.55重新设置为你的代理ipARG INSTALL_PHPREDIS=false
RUN if [ ${INSTALL_PHPREDIS} = true ]; then \
# Install Php Redis Extension
pear config-set http_proxy http://192.168.1.55:1080 \
&& printf "\n" | pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis \
;fi
容器的启动依赖镜像, 因而先确认现有的镜像
docker-compose images
启动容器, 镜像不存在会尝试构建
docker-compose up -d {imagesA imagesB}
docker-compose up -d nginx mysql
启动容器错误, 重启docker 进程即可
ERROR: for laradock_nginx_1 Cannot start service nginx: driver failed programming external connectivity on endpoint laradock_nginx_1 (6d6c96a0419a23e09382a5e72a5c30f4540476882318b9176fc4db2f6a183349): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:4432:tcp:172.19.0.3:443: input/output error
启动容器错误, 端口占用
Error starting userland proxy: Bind for 0.0.0.0:443 failed: port is already allocated
启动之后,进入workspace容器,执行Laravel安装及Artisan命令等操作:
docker-compose exec nginx bash
docker-compose exec —user=laradock workspace bash
docker-compose exec mysql mysql -u homestead -psecret
尝试重启nginx容器中的nginx进程
docker-compose exec nginx nginx -s reload
您可以指定要重建的容器(而不是重建所有容器):
docker-compose build {container-name}
–no-cache, 区别在于之前已经搭建的容器不使用缓存完全重建
docker-compose build --no-cache
docker-compose build --no-cache {container-name}
列出当前正在运行的容器
docker ps -a
列出当前项目的容器
docker-compose ps
输出结果类似于
Name Command State Ports
--------------------------------------------------------------------------------------------------------
laradock_nginx_1 nginx Up 0.0.0.0:4432->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp
关闭所有正在运行的容器, 容器中创建内容不丢失
docker-compose stop
关闭单个容器
docker-compose stop {container-name}
停止容器并移除通过创建的容器,网络,卷和图像, 使用需要小心, 确保容器中不含有业务数据, 否则一起删除了
docker-compose down
删除已退出的容器
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
需要注意的时每个程序产生日志的情况都不同, 如mysql在容器启动的时候就会产生日志, 然而
nginx需要在访问应用的时候才产生日志
docker-compose logs {container-name}
docker-compose logs -f {container-name}
docker-compose logs nginx
再一次回顾以下快速入门所经历的步骤
第一步
, 进入laradock目录并把env-example复制为.env
cp env-example .env
第二步
, 通过docker-compose建立web环境
在这个例子中,我们将看到如何运行NGINX(Web服务器)和MySQL(数据库引擎)来托管PHP Web脚本:
docker-compose up -d nginx mysql
注:在Web服务器nginx,apache…全部依靠php-fpm, 上述命令等同于
docker-compose up -d nginx mysql php-fpm
详细请观察docker-compose.yml
定义nginx
依赖(depends_on
)另一个定义php-fpm
,从而导致自动启动容器
第三步
, 启动workspace
, 并连接控制台
docker-compose up -d workspace
docker-compose exec --user=laradock workspace bash
第四步
, 更新您的项目配置以使用数据库主机
打开您的PHP项目.env文件或您正在读取的配置文件,并将数据库主机设置DB_HOST为mysql:
DB_HOST=mysql
第五步
, 配置hosts
, 打开浏览器并访问您的本地主机地址http://your_app.test/
打开docker-compose.yml
并更改任何你想要的。
例子1:
更改MySQL数据库名称:
environment:
MYSQL_DATABASE: laradock
...
例子2:
将Redis的默认端口更改为1111:
ports:
- "1111:6379"
...
然而3.0以后, 你进需要配置
env文件
通过docker-compose ps
命令检验配置是否正确
找到Dockerfile你想要编辑的图像,举例mysql说明mysql/Dockerfile。
以您想要的方式编辑文件。
重新建立容器:
docker-compose build mysql
docker-compose build --no-cache mysql
Prestissimo 作为 composer 插件用于并行下载扩张包
1 - Enable Running Global Composer Install during the Build:
Click on this Enable Global Composer Build Install and do steps 1 and 2 only then continue here.
2 - Add prestissimo as requirement in Composer:
a - Now open the workspace/composer.json file
b - Add “hirak/prestissimo”: “^0.3” as requirement
c - Re-build the Workspace Container docker-compose build workspace
当你启动容器, laradock
将复制脚本aliases.sh
到laradock/workspace
容器~/.bashrc
git pull origin master
在中国npm源以及composer源非常慢
WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org
WORKSPACE_COMPOSER_REPO_PACKAGIST=https://packagist.phpcomposer.com
laradock 提供了简单的各种应用组合, 但是我们还是不了解其内部网络如何? 为了找出答案, 我们先启动容器
docker-compose up -d nginx redis workspace
连接其中一个容器,如: workspace
默认情况比较尴尬, docker 可能没有安装ping nslookup 这样的网络分析工具
workspace
--> Ubuntu
docker-compose exec workspace bash
apt update && apt-get -y install iputils-ping dnsutils nmap
workspace
--> Ubuntu
现在提出第一个疑问 nginx
redis
workspace
启用的容器是否都在同一个局域网, 他们相互之间能通讯吗?
分析路由表, workspace容器有两块网卡, eth1 --> 18 网段 , eth1 --> 19 网段
root@b550294e2bae:~# ip route
default via 172.19.0.1 dev eth0
172.18.0.0/16 dev eth1 proto kernel scope link src 172.18.0.2
172.19.0.0/16 dev eth0 proto kernel scope link src 172.19.0.4
使用nmap
扫描两块网卡上的主机
18 网段发现了nginx
root@b550294e2bae:~# nmap -sP 172.18.0.2/24
Starting Nmap 7.01 ( https://nmap.org ) at 2018-05-02 16:54 UTC
Nmap scan report for 172.18.0.1
Host is up (0.000036s latency).
MAC Address: 02:42:B1:5E:AD:2B (Unknown)
Nmap scan report for laradock_nginx_1.laradock_frontend (172.18.0.3)
Host is up (0.000017s latency).
MAC Address: 02:42:AC:12:00:03 (Unknown)
Nmap scan report for b550294e2bae (172.18.0.2)
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 4.74 seconds
19网段发现了nginx
, redis
, php-fpm
root@b550294e2bae:~# nmap -sP 172.19.0.4/24
Starting Nmap 7.01 ( https://nmap.org ) at 2018-05-02 16:55 UTC
Nmap scan report for 172.19.0.1
Host is up (0.000088s latency).
MAC Address: 02:42:B6:E7:7B:1E (Unknown)
Nmap scan report for laradock_redis_1.laradock_backend (172.19.0.2)
Host is up (0.000044s latency).
MAC Address: 02:42:AC:13:00:02 (Unknown)
Nmap scan report for laradock_php-fpm_1.laradock_backend (172.19.0.3)
Host is up (0.000033s latency).
MAC Address: 02:42:AC:13:00:03 (Unknown)
Nmap scan report for laradock_nginx_1.laradock_backend (172.19.0.5)
Host is up (0.000038s latency).
MAC Address: 02:42:AC:13:00:05 (Unknown)
Nmap scan report for b550294e2bae (172.19.0.4)
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 4.74 seconds
并且观察发现, nmap
可以发现其主机域名, 其域名解析服务为127.0.0.11提供服务
root@b550294e2bae:~# nslookup laradock_redis_1.laradock_backend
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: laradock_redis_1.laradock_backend
Address: 172.19.0.2
修改docker-compose.yml
, 添加testing网络
version: '3'
networks:
frontend:
driver: ${NETWORKS_DRIVER}
backend:
driver: ${NETWORKS_DRIVER}
testing:
driver: ${NETWORKS_DRIVER}
...
services:
...
### NGINX Server #########################################
nginx:
...
networks:
- frontend
- backend
- testing
此时再次启动容器nginx
, 发现其多了一个网络接口eth2
,网段为172.20.0.0/24
bash-4.4# ip route
default via 172.19.0.1 dev eth0
172.18.0.0/16 dev eth1 scope link src 172.18.0.3
172.19.0.0/16 dev eth0 scope link src 172.19.0.5
172.20.0.0/16 dev eth2 scope link src 172.20.0.2
docker
利用NETWORKS_DRIVER (bright)
生成网络连接,127.0.0.11
提供域名解析服务,