首页 > Windows开发 > 详细

在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

时间:2020-12-18 22:41:36      阅读:272      评论:0      收藏:0      [点我收藏+]
接上篇:

https://mp.weixin.qq.com/s/MvIl0uJR21JUZ3WbmIngdQ

六、Docker 容器的基本操作
1、如下图,在 windows shell 中使用 docker-composer up -d nginx mysql 命令,可以启动容器,并会启动相关联的容器。启动之后一个基本的 LNMP 环境就构建完成了。
技术分享图片

使用 docker-compose ps 可以查看所有容器,如上图,可以看到,beanstalkd 和 redis 在 state 状态是 Exit ,也就是没有启动。所以,想使用哪个服务就启动哪个容器。最后的 Ports 端口号是 宿主机的端口映射到容器的端口,比如,浏览器访问 http://127.0.0.1 ,宿主机( Win10 ) 的80端口就会映射到 nginx 容器的 80 端口,这样就由 nginx 提供服务了。

2、进入相应的容器就相当于进入了 Linux 系统环境,比如进入 Workspace 容器就可以执行( Artisan, Composer, PHPUnit, Gulp, ... )等命令,进入 mysql 容器,可以登录 mysql 命令行。
技术分享图片

如上图,进入 nginx 容器 bash 后,就可以运行 Linux 命令了,运行 nginx -V 查看版本,可以看到版本号及编译参数,比如,已经启用了 ssl 、gzip、 http_v2 等功能模块。最后用 exit 退出 Linux bash 环境。


docker
-
compose 
exec
 workspace bash 
// 进入workspace 容器bash

docker
-
compose 
exec
 mysql bash 
// 进入 mysql 容器 bash

docker
-
compose 
exec
 nginx bash  
// 进入 nginx 容器 bash

###显示结果###

bash
-
4.4
#

Windows PowerShell 用户执行以下命令以进入任何正在运行的容器:


# docker exec -it {workspace-c
```ontainer-id} bash

每一个容器就相当于类似于沙箱一样的互相隔离的一个 Linux 系统,比如 nginx 容器就是一个 Linux + nginx 系统,而 mysql 容器是另一个 Linux + mysql 系统,两个容器之间是隔离的,不会互相影响,每个容器都有一个 Docker 统一分配的局域网 IP 地址。进入容器之后 bash ,可以运行基本的 Linux 命令,比如查看容器的ip地址:

cat /etc/hosts


3、为了区别 Windows PowerShell 和 容器 base 环境,可以约定:如果命令行前是 > 符号,就表示要在 Windows PowerShell 中运行;如果命令行前是 # 符号,就表示在 Linux base 环境中运行。

4、如果在安装时没有修改 .env 文件,按默认没有安装 Xdebug ,要重新配置启用 Xdebug 的话,可以按前面 五、安装 Laradock 中的第3条方法修改 .env 文件,修改完成后,运行命令 > docker-compose build workspace php-fpm 重新构建容器,所需时间和第一次安装时一样。

5、一般在修改 nginx 配置后,需要重启 Docker 的 Nginx:

docker

compose up

d nginx

###显示结果###

laradock_docker

in

docker_1
is
up

to

date

Recreating
laradock_workspace_1
...

done

Recreating
laradock_php

fpm_1
...

done

Recreating
laradock_nginx_1
...

done


6、进入 workspace 容器 base ,使用国内的 composer 镜像,详见:https://pkg.phpcomposer.com/

docker

compose
exec
workspace bash

composer config

g repo
.
packagist composer https
:
//packagist.phpcomposer.com


**七、mysql8.0 无法连接问题**
1、使用docker-compose up命令运行phpMyAdmin容器

use with mysql

docker

compose up

d mysql phpmyadmin


2、打开浏览器并通过端口8080访问本地主机:http://localhost:8080 ,服务器:mysql, 用户名:root,密码:root 登录

3、如果宿主机安装了 Navicat 之类的数据库管理软件,主机地址使用 127.0.0.1 ,就可以连接 mysql 数制库。

4、但是在 mysql8.0 时,这些数据库管理软件还不支持,可能会报错:

mysqli_real_connect
():

The
server requested authentication method unknown to the client
[
caching_sha2_password
]

mysqli_real_connect
():

(
HY000
/
2054
):

The
server requested authentication method unknown to the client


这是因为 mysql 8.0 将密码验证方式由以前的 mysqlnativepassword 改为了 cachingsha2password 。可以进入 mysql 容器 bash,登录 mysql ,将验证方式修改成原来的。

#在

docker

compose
exec
mysql bash

mysql

uroot

p

mysql

grant all PRIVILEGES on
.
to root@
‘%‘
WITH GRANT OPTION
;

mysql

ALTER user br/>‘root‘
@
‘%‘
IDENTIFIED WITH mysql_native_password BY
‘root‘
;

mysql

ALTER user br/>‘root‘
@
‘localhost‘
IDENTIFIED WITH mysql_native_password BY
‘root‘
;

mysql

FLUSH PRIVILEGES
;

mysql

exit
;


现在就可以用 root 登录了。为了使新建用户的验证方式默认为 mysqlnativepassword ,可以修改 my.cnf 文件,在 [mysqld] 部分中添加:

defaultauthenticationplugin = mysqlnativepassword

5、laradock 默认装的是 mysql 最新版本(mysql8),也可以更换成低版本的 mysql 。

修改 .env 文件

MYSQL_VERSION

5.7

默认为 latest

#停止mysql容器

docker

compose stop mysql

删除旧数据库数据

rm

rf
~
/.laradock/
data
/
mysql

重新构建新 mysql

docker

compose build mysql

重新创建容器

docker

compose up

d nginx mysql

查看现有 mysql 版本

docker inspect laradockmysql


6、在 php 程序中连接数据库时,如果 DB_HOST 为 127.0.0.1 或 localhost,则会报错:SQLSTATE[HY000] [2002] Connection refused ,SQLSTATE[HY000] [2002] No such file or directory,那时因为 php 容器里是没有 mysql 的,需要用 mysql 容器的 IP。

**八、项目配置**
1、以安装和配置一个 Laravel 项目为例,在 PowerShell 中首先进入 Laradock 目录,启动容器:

docker

compose up

d mysql

docker

compose up

d nginx

###输出内容###

laradock_mysql_1
is
up

to

date

laradock_docker

in

docker_1
is
up

to

date

laradock_workspace_1
is
up

to

date

laradock_php

fpm_1
is
up

to

date

laradock_nginx_1
is
up

to

date

docker

compose up

d redis beanstalkd phpmyadmin

docker

compose up

d phpmyadmin


**注意**:默认情况下,docker会使用 bridge 网络模式为每一个启动的容器动态分配一个IP,以172.17.0.1为网关,172.17.0.2,172.17.0.3 依次类推作为容器的 ip,但是如果下次启动时容器启动顺序有变化,可能分配的 IP 地址也会变化,并且有些容器之间互相有依赖,所以最好按顺序依次启动,不要包含在一条 docker-compose up 命令中,这样当下次启动多个容器的时候 IP 还是会分配和上次相同的 IP。

2、进入 workspace 容器

docker

compose
exec
workspace bash

###输出内容###

root@5f056ea61aed
:
/var/
www
#


输出内容可以看到容器中默认目录是 /var/www 目录,这个目录默认是和 win10 中 Laradock 同级目录建立的软链接。

ps:如果要修改这个默认的软链接目录,可以先在 laradock 父级目录下创建一个与 laradock 同级的 wwwroot 目录,然后编辑 laradock 目录下 .env 文件中的 APPLICATION 配置项:

APPLICATION
=../
wwwroot
/


再重新载入容器,这样就相当于为 win10 中的 wwwroot 目录与 Docker 的 /var/www 目录建立了软链接

4、在 workspace 容器的 bash 中,首先要确定是否已启用用 composer 国内镜像,参见上述 六.6 ,然后运行 composer 命令创建一个 Laravel 项目:

composer create

project laravel
/
laravel larabbs

prefer

dist


在 win10 中的目录结构如下:

+
laradock

+
laravel


在 win10 中的 laravel 目录,就相当于 workspace 中的 /var/www 目录。

5、在win10中打开 laradock/nginx/sites 目录,复制一份 laravel.conf.example ,重命名为 larabbs.conf 并编辑此文件:

server_name larabbs
.
test
;

root
/
var
/
www
/
laravel
/
public
;

index index
.
php index
.
html index
.
htm
;


重新启动 laradock_nginx 容器,也就是重启 nginx 服务器

docker restart laradock_nginx_1


6、打开 C:\Windows\System32\drivers\etc 目录,编辑 hosts 文件,添加:127.0.0.1 laravel.test

7、打开浏览器,访问 http:// laravel.test ,即可看到 laravel 框架默认首页。

8、使用 Navicat ,或 phpMyAdmin ,新建数据库 testlaravel ,字符及排序规则选:utf8mb4unicode_ci

9、进入 mysql 容器,查询容器的 ip 地址。如本例:172.19.0.2 即为 php 项目连接数据库的地址。

docker

compose
exec
mysql bash

cat /etc/hosts

显示结果

127.0
.
0.1
localhost

::
1
localhost ip6

localhost ip6

loopback

fe00
::
0
ip6

localnet

ff00
::
0
ip6

mcastprefix

ff02
::
1
ip6

allnodes

ff02
::
2
ip6

allrouters

172.19
.
0.2

973c5c774036


退出容器 bash

exit

显示结果

exit

PS C
:
\WWW\laradock

10、用 phpstrom 或别的编辑器,打开 Laravel 项目,编辑 .env 配置文件,DB_HOST 为上一步查询到的 IP 地址:

APP_URL
=
http
:
// laravel.test

...

DB_CONNECTION
=
mysql

DB_HOST
=
172.19
.
0.2

DB_PORT
=
3306

DB_DATABASE
=
test_laravel

DB_USERNAME
=
root

DB_PASSWORD
=
root

11、至此,项目配置完成!


一、安装 cmder
1、win10 中将 cmder 放在C:\Program files\ 目录下时有权限问题。2、360杀毒会误杀,要将 cmder/vendor/init.bat 到360杀毒的 设置->文件白名单 中,在弹出拦截窗口时点击加入白名单无效,要手动加入。

二、Docker 常用命令
切换到 laradock 目录执行:

进入容器:docker-compose exec{容器名}bash 默认是使用 root 用户进入,议不要采用root进入,因为composer不推荐

用 laradock 用户进入容器:docker-compose exec —user=laradock workspace bash

退出命令是 : exit。

进入 mysql 容器:docker-compose exec mysql bash

在 mysql 容器 bash 中,进入mysql 命令行:mysql -uroot -proot

进入 workspace 容器:docker-compose exec workspace bash ,这是 laradock 的 docker 的工作空间

查看容器启动状态:docker-compose ps

关闭所有容器:docker-compose stop

关闭指定容器:docker stop CONTAINER ID或者NAMES

删除所有容器:docker-compose down

重新启动容器:docker start CONTAINER ID或者NAMES

重启 nginx 容器:docker-compose restart nginx

杀死所有正在运行的容器:docker kill $(docker ps -a -q)

删除所有已经停止的容器:docker rm $(docker ps -a -q)

查看本地镜像:docker images

查看本地容器:docker ps

创建镜像:docker build -t name:tag Dockerfile路径

进入容器:docker exec-it IMAGE ID或者NAMES /bin/bash

移除本地容器:docker rm CONTAINER ID或者NAMES

查看openssl版本号:openssl version

查看 nginx 的版本及编译参数:nginx -V

三、win10 中 docker 运行程序加载速度慢的问题
docker 在win10挂载目录 IO 速度慢,导致 laravel 程序加载速度慢,说明及解决方法见以下两个链接:

https://github.com/docker/for-win/issues/188

https://www.jianshu.com/p/db1c826ea98c

相关内容

php开发环境安装配置:win10+docker+Laradock(上篇)

---END---

在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

原文:https://blog.51cto.com/15057852/2566984

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!