docker安装php开发环境

序言

  • 本文继续mac os系统演示
  • 本文基于本地开发安装环境用于演示
  • nginx-1.19.3、php-7.3、redis:6.0

    一、安装docker

    1
    $ brew cask install docker

    二、安装需要了解的概念和基础命令

    1、docker的组成

    docker由 仓库、镜像、容器三大部分组成
    1)镜像:可以想想成为模版,例如windows系统的镜像,
    2)容器:通过启动镜像来生成容器,就是我们环境中真实要使用到的服务存储的地方 一般由 一个linux系统内包含一个应用服务组成(例如linux中安装了一个php)
    3)仓库:用来集中存储镜像的的地方,一般我们使用 docker hub (hub.docker.com)
    容器与镜像的关系类似于面向对象编程中的对象与类
  • 如果用git来对比举例:
    镜像则为一个维护好的master主分支
    容器则是我们自己定义使用的开发分支,但是不能合并到主分支
    仓库则为git的代码存放仓库了

    2、环境的安装方式

    1)使用docker安装一个linux虚拟机,然后在虚拟机中使用linux相关命令安装php相关开发环境,这就和docker没啥太大关系了
    2)使用docker分别nginx、PHP、redis等多个应用服务容器然后用docker的网关进行链接通信
    fLoeSW

    3、环境安装方法

  • 分为普通基础安装:
    一个一个安装,官方样例经常出现的方式
  • 使用docker-composer安装:
    使用docker compose 配置文件(yml文件),配置应用程序需要的所有服务,然后使用一个命令自动安装所有东西(例如php 的composer.json 和compose install)
  • 本文会先介绍基础安装,然后介绍 docker-composer 方式

    4、常用基础命令

    1) docker images(docker image ls) :来列出本地主机上已经下载的镜像
    2) docker pull :用来从远程仓库下载镜像
    3) docker search :在仓库中搜索镜像
    4)docker run :运行镜像生成并生成容器
    5)docker ps :查看正在运行的容器的列表
    6)docker ps -a:查看本地已经生成的容器(包含未运行的)
    7)docker exec :进入到容器中,可以想想未ssh进入到了一个linux系统

三、安装nginx

1、下载nginx镜像

1
$ docker pull nginx:1.19.3

这样nginx镜像就下载下来了,可以用 docker images 查看
iH1PtX

2、运行镜像生成容器

1
2
3
4
5
$ docker run --name nginx-1.19.3
-v ~/mycode:/usr/share/nginx/html
-v ~/docker-volumes/nginx/config:/etc/nginx/conf.d
-v /tmp/docker-log/nginx:/var/log/nginx
-p 80:80 -d nginx:1.19.3

参数说明:
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
–name nginx-1.19.3:设置容器名称。
-p 80:80: 端口进行映射,将本地 80 端口映射到容器内部的 80 端口。
-d: 设置容器在在后台一直运行。

sJ46Dc

3、创建配置文件、进入容器逛一逛

1
$ docker exec -it  nginx-1.19.3

进来后可以看看nginx的配置文件等信息,

现在我们已经把配置文件映射到宿主机上了我们可一到宿主机的对应目录调调改改nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#宿主机 config
server {
listen 80;
server_name mytest.com;
root /usr/share/nginx/html;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_param APP_ENV dev;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

然后exit退出 ,然后重启下nginx

1
$ docker restart  nginx-1.19.3

现在我们就可以运行我们的nginx了 127.0.0.1
但是现在只能运行查看html等静态文件,看不了php,这是为什么呢?因为我们还没装php

三、安装php

1、下载php

1
$ docker pull php:7.3

2、运行镜像生成容器

1
2
3
4
$ docker run --name  php-7.3
-v ~/mycode:/usr/share/nginx/html
--expose=9000
-d php:7.3

参数说明:
-expose 对其他容器报漏9000端口,但不能和主机通信 。
重点说明:
-此处php挂在的目录需要与nginx中的www目录相同,因为正常来说nginx和php在一台机器上,www目录要php和nginx都能访问到

-可以运行后发现好多扩展没有,可以使用进入docker容器使用docker提供的命令进行安装 例如mysql
因为使用的源是fpm包 所以很多扩展都没有装

1
2
$ docker-php-ext-install pdo
$ docker-php-ext-install pdo_mysql

四、容器和容器间通信

  • 现在已经安装了nginx和php了为啥还是不能解析php文件呢
    原因在于nginx和php两个容器之间还有没进行通信
    那么怎么进行通信呢
    1、我们要修修改nginx中fastcgi中请求php的地址参数 fastcgi_pass 127.0.0.1:9000; 改为 fastcgi_pass 172.25.0.2:9000;
    2、重启nginx,就可以了呀

  • 那么问题来了。这个php的ip哪来的。
    我们默认使用docker的bridge模式 此网络创建一个名为docker0的虚拟网桥,并将容器连接到一个docker0虚拟网桥,所有网桥下的容器共享Network Namespace

    五、使用docker compose 安装nginx、php

    上面已经大致的了解了怎么安装nginx和php了 ,mysql和上面的方法一样我就不举例了
    下面说如何使用compose进行安装呢?compose安装都需要什么呢?

1、compose安装环境的流程

使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。

Dockerfile 这个玩意没有也能装,他是用来自定义镜像的,我们用通用镜像就可以

2、上docker-compose.yml 文件

  • 随便找个地方件个文件夹,进去到里面创建的xxxx.yml文件,我的叫composetest.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
version: "3"
networks:
local_net:
external:
name: local_net

services:
nginx:
container_name: local-nginx-1.19.3
image: nginx:1.19.3
ports:
- "80:80"
volumes:
- ~/mycode:/usr/share/nginx/html
- ~/docker-volumes/nginx/config:/etc/nginx/conf.d
- /tmp/docker-log/nginx:/var/log/nginx
networks:
local_net:
ipv4_address: 172.25.0.3
extra_hosts:
- "local.testdoctor.meidaifu.com:127.0.0.1"
- "local.patient.meidaifu.com:127.0.0.1"

php:
container_name: local-php-7.3-fpm
image: php:7.3-fpm
volumes:
- ~/mycode:/usr/share/nginx/html
networks:
local_net:
ipv4_address: 172.25.0.2
stdin_open: true
tty: true
expose:
- 9000
redis:
container_name: local-redis-6.0
image: redis:6.0
networks:
local_net:
ipv4_address: 172.25.0.6
ports:
- "6379:6379"
expose:
- 6379
mysql:
container_name: local-mysql-8.0 # 指定容器的名称
image: mysql:8.0 # 指定镜像和版本
ports:
- "3306:3306"
expose:
- 3306
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ROOT_HOST: "%"
networks:
local_net:
ipv4_address: 172.25.0.7
volumes:
- "~/docker-volumes/mysql/data:/var/lib/mysql" # 挂载数据目录
- "~/docker-volumes/mysql/config:/etc/mysql/conf.d" # 挂载配置文件目录
  • 参数解释
    version:这个是表示用哪个docker-compose版本来解析,不用版本模版语法有差异 这里用的3
    networks:用来声明所使用的网络环境
    services:这个就是服务容器的集合,里面每一块都是一个服务
    container_name:用来定一容器的名称
    image:表示锁使用镜像的,也可以使用build命令来指定dockerfile文件路径从上下文路径 ./Dockerfile 所构建镜像
    volumes:挂载
    services 中的networks这里来指定使用哪个网络,指定当前容器在当前网段的ip
    expose:对外报漏的端口
    ports:宿主机和容器的端口映射

  • 注意事项
    1) 如果指定ip需要自己创建一个网络空间 不能使用默认的,这也解决了每次容器ip变动的问题

    1
    docker network local_net bridge

    Fd7VpT
    2) 关于虚拟域名配置
    这就要做一下nginx容器的host配置如上yml文件中extra_hosts,当前宿主机的本地host也要加

然后修改nginx的配置 如下是我的meidaifu.conf的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
listen 80;
server_name local.testdoctor.meidaifu.com ;
root /usr/share/nginx/html/onepiece/public;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_param APP_ENV dev;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 172.25.0.2:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

server {
listen 80;
server_name local.patient.meidaifu.com;
root /usr/share/nginx/html/onepiece_patient/public;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_param APP_ENV dev;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 172.25.0.2:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

然后修改yml文件 中nginx的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nginx:
container_name: local-nginx-1.19.3
image: nginx:1.19.3
ports:
- "80:80"
volumes:
- ~/mycode:/usr/share/nginx/html
- ~/docker-volumes/nginx/config:/etc/nginx/conf.d
- /tmp/docker-log/nginx:/var/log/nginx
networks:
local_net:
ipv4_address: 172.25.0.3
extra_hosts:
- "local.testdoctor.meidaifu.com:127.0.0.1"
- "local.patient.meidaifu.com:127.0.0.1"
depends_on:
- php

3、运行docker compose

1
docker-compose up -d

rc1Frn
然后就可以运行了。

如果可以在果面版的docker中查看的更清楚
dIgSAi

docker-compose down 停止并删除容器
67lyX4

docker-compose stop 停止并不删除容器
wn49vN

4、使用dockerfile自动增加PHP扩展

当前目录创建 phpfile/Dockerfile

1
2
3
4
5
6
7
8
# base image
FROM php:7.3-fpm

# MAINTAINER
MAINTAINER tianfs

# running required command
RUN docker-php-ext-install pdo_mysql

然后修改 compose文件中php的配置为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
php:
container_name: local-php-7.3-fpm
build:
context: ./phpfile
dockerfile: Dockerfile
image: php:7.3-fpm-local
volumes:
- ~/mycode:/usr/share/nginx/html
networks:
local_net:
ipv4_address: 172.25.0.2
stdin_open: true
tty: true
expose:
- 9000

build 和image 同时出现 则image 将为build后镜像生成的名字和tag
然后

1
docker-compose up -d

然后你就可以拿这你的配置文件 到处耍了。

六、注意事项

查看另一片文章docker遇到的相关问题

七、延伸思考

1、这种搭建方式是否符合最佳事实践方案标准?
2、如果多台服务器需要部署如何管理?