当前位置: 首页 > 工具软件 > Laradock > 使用案例 >

Laradock入门到精通

戚宏扬
2023-12-01

Laradock

资料

部署方式

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

pecl扩展报错

增加可以上网的代理, 编辑目录下的Dockerfile

  • pear config-set http_proxy http://192.168.1.55:1080设置代理, 不要忘记192.168.1.55重新设置为你的代理ip
  • 尝试多次重启docker daemon
ARG 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

dock-compose 管理

启动容器

容器的启动依赖镜像, 因而先确认现有的镜像

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 命令检验配置是否正确

编辑Docker镜像

  • 找到Dockerfile你想要编辑的图像,举例mysql说明mysql/Dockerfile。

  • 以您想要的方式编辑文件。

  • 重新建立容器:

	docker-compose build mysql
	docker-compose build --no-cache mysql

编辑 compose-file

官方compose语法

Prestissimo 并行下载composer vender

github Prestissimo

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

aliases

当你启动容器, laradock将复制脚本aliases.shlaradock/workspace容器~/.bashrc

升级laradock

  1. 停止容器
  2. 更新仓库代码即可
	git pull origin master

自定义packgist和npm仓库

在中国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
  • nmap 主机发现
  • ping 工具测试网络连通性
  • nslookup/dig 测试域名解析

主机发现

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 提供域名解析服务,
  • 修改docker-compose.yml可定义网络名称, 根据需要绑定到服务应用(nginx)容器中
 类似资料: