M1 Mac 使用 Docker 配置 dnmp 环境(更新:PHP 中安装 zip 扩展、安装 composer)

目录结构

.
├── compose.dockerfile
│   ├── docker-compose.yml
│   ├── es7.9.1
│   │   └── Dockerfile
│   ├── mysql8.0.34
│   │   └── Dockerfile
│   ├── nginx
│   │   └── Dockerfile
│   ├── php7.3
│   │   └── Dockerfile
│   ├── php8.1
│   │   └── Dockerfile
│   └── redis
│       └── Dockerfile
├── data
├── etc
│   ├── es7.9.1
│   │   └── elasticsearch.yml
│   ├── mysql8.0.34
│   │   └── my.cnf
│   ├── nginx
│   │   ├── conf.d
│   │   └── nginx.conf
│   ├── php7.3
│   │   ├── conf.d
│   │   ├── php.ini
│   │   └── www.conf
│   ├── php8.1
│   │   ├── conf.d
│   │   ├── php.ini
│   │   └── www.conf
│   └── redis
│       └── redis.conf
├── plugins
│   └── es7.9.1
│       └── ik
├── log

Docker 安装

官方安装教程:docs.docker.com/desktop/install/ma...

我用的手动安装

  1. 使用 Homebrew 安装

    yeasy.gitbook.io/docker_practice/i...

    brew install --cask docker

    或者

    www.runoob.com/docker/macos-docker...

    $ brew install --cask --appdir=/Applications docker
    
    ==> Creating Caskroom at /usr/local/Caskroom
    ==> We'll set permissions properly so we won't need sudo in the future
    Password:          # 输入 macOS 密码
    ==> Satisfying dependencies
    ==> Downloading https://download.docker.com/mac/stable/21090/Docker.dmg
    ######################################################################## 100.0%
    ==> Verifying checksum for Cask docker
    ==> Installing Cask docker
    ==> Moving App 'Docker.app' to '/Applications/Docker.app'.
    🍺  docker was successfully installed!
  2. 手动下载安装

    点击以下链接下载 Install Docker Desktop on Mac
    image-20230509101309211

    选择适合自己的下载

    安装完成打开 Docker Desktop,完成基本设置和入门教程(可以跳过)。

    在终端可以使用以下命令检查安装的 Docker 的版本

    ╰─ docker -v
    Docker version 23.0.5, build bc4487a

镜像加速

Docker 镜像加速:www.runoob.com/docker/docker-mirro...

  1. 阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单点击“镜像工具”中“镜像加速器”就可以看到你的专属地址了。

  2. 配置镜像(阿里云镜像加速器页面下边也会有说明)

    建议多添加几个国内的镜像,如果有不能使用的,会切换到可以使用个的镜像来拉取。

    在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。

    将上个步骤中的加速地址(https://<你的ID>.mirror.aliyuncs.com),加到registry-mirrors的数组里,没有的话添加一个 key;

    点击 Apply & Restart 按钮,等待 Docker 重启并应用配置的镜像加速器。

    {
      "builder": {
        "gc": {
          "defaultKeepStorage": "20GB",
          "enabled": true
        }
      },
      "experimental": false,
      "features": {
        "buildkit": true
      },
      "registry-mirrors": [
        "https://<你的ID>.mirror.aliyuncs.com",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
      ]
    }
  3. 检查加速器是否生效

    在命令行执行

    docker info

    如果从结果中看到了如下内容,说明配置成功。

    Registry Mirrors:
    hub-mirror.c.163.com/
    mirror.baidubce.com/

安装 Nginx

官方文档:https://hub.docker.com/_/nginx

  1. 关闭本地 nginx(如果开启了的话,且恰好占用 80 端口)

     sudo nginx -s stop
  2. 直接执行一下命令默认拉取最新的镜像

     docker pull nginx
  3. 根据官方文档中 Complex configuration 部分

    后台启动一个名为 tmp-nginx 的容器

     docker run --name tmp-nginx -d nginx

    将 nginx 整个配置目录 copy 到本地一份,/Users/username/dockerServer/etc/根据自己的实际目录换成自己的,没有的话需要手动创建

     docker cp tmp-nginx:/etc/nginx ~/dockerServer/etc/nginx

    删除刚刚新建的容器

     docker rm -f tmp-nginx

    运行一个 html 文件,查看效果

    首先准备一个 html 文件:~/dockerServer/www/hello.html,然后执行命令

     docker run --name run-nginx -p 80:80 \
     -v ~/dockerServer/www:/usr/share/nginx/html:ro \
     -d nginx

    命令说明:

    后台启动一个名为 run-nginx 的容器,将容器的 80 端口映射到主机的 80 端口主机(宿主)端口:容器端口,绑定本地的一个目录(www)到 nginx 容器中的 web 目录(html)

    容器中的 web 目录可以到 ~/dockerServer/etc/nginx/conf.d/default.conf 中查看

    image-20230510113527076

    浏览器访问 localhost/hello.html 看看效果

    删除容器,后面我们改完配置再来启动它。

     docker rm -f run-nginx

安装 php:7.3-fpm

地址:hub.docker.com/_/php

Dockerfile 一直没成功,故直接pull,扩展之后再说

docker pull php:7.3-fpm

copy 出 nginx 配置一份,将 php 的相关配置也 copy 到本地。

docker run --name tmp-php-fpm -d php:7.3-fpm
mkdir -p ~/dockerServer/etc/php7.3

docker cp tmp-php-fpm:/usr/local/etc/php/php.ini-development ~/dockerServer/etc/php7.3
docker cp tmp-php-fpm:/usr/local/etc/php-fpm.d/www.conf ~/dockerServer/etc/php7.3
docker cp tmp-php-fpm:/usr/local/etc/php/conf.d/ ~/dockerServer/etc/php7.3

docker rm -f tmp-php-fpm

修改 nginx、php 配置文件

  1. 修改 nginx 配置

    复制一份 default.conf

    cd ~/dockerServer/etc/nginx/conf.d
    cp default.conf phpinfo.conf

    在新文件中加入以下内容

    location ~ \.php$ {
       fastcgi_pass   php-fpm-container:9000;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
       fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
       include        fastcgi_params;
    }

    php-fpm-container这个是咱们自己创建的 php-fpm 容器的别名,具体是在启动 nginx 的时候指定的,后边会提到

  2. 修改 php 相关配置

    进入 ~/dockerServer/etc/php7.3 下,将 php.ini-development 复制改名为 php.ini,配置内容根据自己情况修改即可。

    cd ~/dockerServer/etc/php7.3
    cp php.ini-development php.ini

启动 php、nginx 容器

docker run 启动

  1. 启动 php-fpm

     docker run --name run-my-php-fpm \
     -p 9000:9000 \
     -v ~/dockerServer/www:/var/www/html \
     -v ~/dockerServer/etc/php7.3/php.ini:/usr/local/etc/php/php.ini \
     -v ~/dockerServer/etc/php7.3/www.conf:/usr/local/etc/php-fpm.d/www.conf \
     -v ~/dockerServer/etc/php7.3/conf.d:/usr/local/etc/php/conf.d \
     -v ~/dockerServer/log/php7.3:/var/log/php \
     -d php:7.3-fpm

    ~/dockerServer/log/php 文件如果不存在需要手动创建

  2. 启动 nginx

     docker run --name run-nginx \
     -p 80:80 \
     --link run-my-php-fpm:php-fpm-container \
     -v ~/dockerServer/www:/usr/share/nginx/html \
     -v ~/dockerServer/etc/nginx/conf.d:/etc/nginx/conf.d \
     -v ~/dockerServer/etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
     -v ~/dockerServer/log/nginx:/var/log/nginx \
     -d nginx

    ~/dockerServer/log/nginx 文件如果不存在需要手动创建

    说明:

    • 将配置目录、日志目录和 web 目录都分别进行了绑定,方便在本地环境中修改。
    • 还记得上面提到的 nginx 中有个配置填写的 php-fpm-container 吗?实际上就是在这里指定的,连接两个容器,并给 php-fpm 容器起了个别名,配置中通过别名访问。

PHP7.3 Dockerfile

创建 Dockerfile 文件

cd ~/dockerServer/compose.dockerfile
mkdir php7.3 && cd php7.3
vim Dockerfile
  1. 使用脚本

    原始方法安装 imagick 扩展一直不成功

    GitHub地址:github.com/mlocati/docker-php-exte...

    Dockerfile 内容

    FROM php:7.3-fpm
    
    LABEL xuweidong="determined_xw@126.com"
    
    ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
    
    RUN chmod +x /usr/local/bin/install-php-extensions && \
        install-php-extensions gd xdebug redis mcrypt memcached swoole zip
    RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
        install-php-extensions imagick
    RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
    
    RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba pcntl shmop sysvmsg sysvsem sysvshm
    RUN docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql
    
    WORKDIR /tmp
    RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
    RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    
    # 容器启动时执行指令
    CMD ["php-fpm"]

    创建镜像

    docker build -t my-php-fpm:myphp.7.3 .

    启动容器

    docker run --name tmp-my-php-fpm -d my-php-fpm:myphp.7.3

    进入容器

    docker exec -it tmp-my-php-fpm bash

    镜像创建完成之后,可以像上面我们拷贝出 nginx 配置一样,将 php 的相关配置也拷贝到本地。

    docker cp tmp-my-php-fpm:/usr/local/etc/php/php.ini-development ~/dockerServer/etc/php7.3
    docker cp tmp-my-php-fpm:/usr/local/etc/php-fpm.d/www.conf ~/dockerServer/etc/php7.3
    docker cp tmp-my-php-fpm:/usr/local/etc/php/conf.d/ ~/dockerServer/etc/php7.3
    # 删除容器
    docker rm -f tmp-my-php-fpm

    PHP配置文件

    cd ~/dockerServer/etc/php7.3/
    cp php.ini-development php.ini

    修改 xdebug 的配置文件,加入一下内容

    vim ~/dockerServer/etc/php7.3/conf.d/docker-php-ext-xdebug.ini

    添加

    
    xdebug.mode=debug
    xdebug.remote_handler = dbgp
    xdebug.client_host = host.docker.internal 
    xdebug.client_port = 9001
    xdebug.log = /var/log/php/xdebug.log
    xdebug.idekey = PHPSTOR

    以上设置主要是开启 xdebug 的远程调试模式,因为 php-fpm 使用了 9000 端口,所以这里我们把 xdebug 的端口改为了 9001;host.docker.internal 是 docker 18.03 新加入的,可以解析获得宿主机的 ip 地址,这样就不用写死 ip 地址了。

    启动 php-fpm 容器

    docker run --privileged --name run-my-php-fpm \
    -p 9000:9000 \
    -v ~/dockerServer/www:/var/www/html \
    -v ~/dockerServer/etc/php7.3/php.ini:/usr/local/etc/php/php.ini \
    -v ~/dockerServer/etc/php7.3/www.conf:/usr/local/etc/php-fpm.d/www.conf \
    -v ~/dockerServer/etc/php7.3/conf.d:/usr/local/etc/php/conf.d \
    -v ~/dockerServer/log/php7.3:/var/log/php \
    -d my-php-fpm:myphp.7.3

    启动 nginx 容器

    docker run --name run-nginx \
    -p 80:80 \
    --link run-my-php-fpm:php-fpm-container \
    -v ~/dockerServer/www:/usr/share/nginx/html \
    -v ~/dockerServer/etc/nginx:/etc/nginx \
    -v ~/dockerServer/log/nginx:/var/log/nginx \
    -d nginx

    复制一个 Nginx 配置文件

    cd ~/dockerServer/etc/nginx/conf.d
    cp default.conf phpinfo.conf
    vim phpinfo.conf

    参考以下内容修改

    server {
        listen       80;
        server_name  localhost;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.php index.html index.htm;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   php-fpm-container:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    修改完配置文件,重启nginx容器

    docker restart run-nginx

    ~/dockerServer/www 中创建一个 phpinfo.php 文件,输出 php 信息,通过 localhost/phpinfo.php 访问来查看。

项目配置 nginx 参考

   server {
       listen       80;
       server_name  dev-www.sx1211.com;

       root    /usr/share/nginx/html/laravel10/public;
       index   index.php index.html index.htm;
       location / {
           if (!-e $request_filename) {
               rewrite ^/index.php(.*)$ /index.php?s=$1 last;
               rewrite ^(.*)$ /index.php?s=$1 last;
               break;
           }
       }

       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   /usr/share/nginx/html;
       }

       location ~ \.php$ {
           root           /var/www/html/laravel10/public;
           fastcgi_split_path_info  ^(.+\.php)(.*)$;
           fastcgi_param  PATH_INFO   $fastcgi_path_info;
           fastcgi_pass   php-fpm-container:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
           include        fastcgi_params;
       }
   }

Nginx Dockerfile

cd ~/dockerServer/compose.dockerfile
mkdir ningx && cd nginx
vim Dockerfile

Dockerfile 内容

FROM nginx:1.25.1
# 维护者信息
LABEL xuweidong="determined_xw@126.com"
# 时区
ENV TZ Asia/Shanghai
RUN date -R


# 容器启动时执行指令
CMD ["nginx", "-g", "daemon off;"]

构建镜像

docker build -t my-nginx:mynginx.1.25.1 .

启动容器

docker run --name run-my-nginx \
-p 80:80 \
--link run-my-php-fpm:php-fpm-container \
-v ~/dockerServer/www:/usr/share/nginx/html \
-v ~/dockerServer/etc/nginx:/etc/nginx \
-v ~/dockerServer/log/nginx:/var/log/nginx \
-d my-nginx:mynginx.1.25.1

安装 Redis

Dockerfile

参考:www.cnblogs.com/kendoziyu/p/158144...

cd ~/dockerServer/compose.dockerfile
mkdir redis && cd redis
vim Dockerfile

Dockerfile 内容

FROM redis:7.0.5
# 维护者信息
LABEL xuweidong="determined_xw@126.com"
# 时区
ENV TZ Asia/Shanghai
RUN date -R
# 容器启动时执行指令
CMD ["redis-server"]

配置

下载:github.com/redis/redis/blob/7.0.5/...

mkdir -p ~/dockerServer/etc/redis/
cd ~/dockerServer/etc/redis
mv ~/Downloads/redis.conf redis.conf

mkdir ~/dockerServer/data/redis

修改配置

vim redis.conf

注释bind 127.0.0.1 -::1 ,解绑 local ip

# bind 127.0.0.1 -::1

或者

bind 0.0.0.0

确保 daemonize,为no(默认) ,否则通过docker -d方式不能启动 redis, (非 docker 方式,需要改为yes实现后台启动)

daemonize no

外网访问

#protected-mode yes
protected-mode no

设定密码

#requirepass foobared
requirepass welcome1

使用 aof 持久化方式

#appendonly no
appendonly yes

创建镜像

docker build -t my-redis:redis.7.0.5 .

创建启动容器,由于本地 redis 占用 6379 端口,故映射 6380

docker run --name redis01 \
-p 6380:6379 \
--restart=always \
-v ~/dockerServer/etc/redis/redis.conf:/etc/redis.conf \
-v ~/dockerServer/data/redis:/data \
-v ~/dockerServer/log/redis:/var/log \
-itd my-redis:redis.7.0.5 \
redis-server /etc/redis.conf

注意:项目不能使用 IP + 端口号 的方式链接 redis

解决:

vim .env

删除REDIS_PORT,把REDIS_HOST的值改为redis

REDIS_HOST=redis
# REDIS_PORT=6380

参考:stackoverflow.com/questions/423603...

写个 PHP 脚本测试

<?php
// 连接到本地Redis服务器,默认端口是6379
$redis_host = '127.0.0.1';
$redis_port = 6380;

// 创建Redis客户端
$redis = new Redis();
$redis->connect($redis_host, $redis_port);

// 设置键值对
$redis->set('name', 'John');
$redis->set('age', 30);

// 获取键对应的值
$name = $redis->get('name');
$age = $redis->get('age');

echo "Name: $name, Age: $age\n";

// 使用哈希表(Hash)存储一些数据
$user_id = 1;
$user_data = array(
    'name' => 'Alice',
    'age' => 25,
    'email' => 'alice@example.com'
);
$redis->hmset("user:$user_id", $user_data);

// 获取哈希表中的字段值
$user_info = $redis->hgetall("user:$user_id");
print_r("User Info: ");
print_r($user_info);
?>

成功

╰─ php test.php
Name: John, Age: 30
User Info: Array
(
[name] => Alice
[age] => 25
[email] => alice@example.com
)

安装 MySQL

配置

  1. mysql:8.0.34

     # 拉取镜像
     docker pull mysql:8.0.34
     # 启动容器
     docker run -p 3306:3306 --name tmp-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.34
     # 复制配置文件
     mkdir -p  ~/dockerServer/etc/mysql8.0.34/
     docker cp tmp-mysql:/etc/my.cnf ~/dockerServer/etc/mysql8.0.34/
     # 删除容器
     docker rm -f tmp-mysql
    
     # 进入容器
     docker exec -it tmp-mysql bash
     # 进入mysql
     mysql -u root -p
     # 查看mysql版本
     select version();

    启动容器:挂载配置文件、日志、数据

     docker run -p 3306:3306 \
     --name run-mysql \
     -e MYSQL_ROOT_PASSWORD=123456 \
     -v ~/dockerServer/etc/mysql8.0.34/my.cnf:/etc/my.cnf \
     -v ~/dockerServer/log/mysql8.0.34:/var/log \
     -v ~/dockerServer/data/mysql8.0.34:/var/lib/mysql \
     -v ~/dockerServer/data/mysql-files8.0.34:/var/lib/mysql-files \
     -d mysql:8.0.34
  2. mysql:5.7.41

     docker pull mysql:5.7.43

    但是,由于 m1 直接从 dockerhub 拉取镜像报错,查了相关文章说,docker 官方仓库没有适配 M1 的镜像

    no matching manifest for linux/arm64/v8 in the manifest list entries

    解决方式:

    在 dockerhub 搜索 mysql/mysql-server hub.docker.com/r/mysql/mysql-serve...

    但是,docker-compose 方式启动,可以进入容器,但是无法连接,Dockerfile 可以连接

     # 拉取镜像
     docker pull mysql/mysql-server:5.7.41
     # 启动容器
     docker run -p 3307:3306 --name tmp-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7.41
     # 复制配置文件
     mkdir -p  ~/dockerServer/etc/mysql5.7.41/
     docker cp tmp-mysql:/etc/my.cnf ~/dockerServer/etc/mysql5.7.41/
    
     # 进入容器
     docker exec -it tmp-mysql bash
     # 进入mysql
     mysql -u root -p
     # 查看mysql版本
     select version();
    
     # 删除容器
     docker rm -f tmp-mysql

Dockerfile

  1. mysql:8.0.34

     cd ~/dockerServer/compose.dockerfile
     mkdir mysql8.0.34 && cd mysql8.0.34
     vim Dockerfile

    Dockerfile 文件内容

     FROM mysql:8.0.34
    
     # 维护者信息
     LABEL xuweidong="determined_xw@126.com"  
    
     # 时区
     ENV TZ Asia/Shanghai
     RUN date -R
    
     # 容器启动时执行指令
     CMD ["mysqld"]

    构建镜像

     docker build -t my-mysql:mysql-8.0.34 .

    启动容器

     docker run -p 3306:3306 \
     --name run-mysql \
     -e MYSQL_ROOT_PASSWORD=123456 \
     -v ~/dockerServer/etc/mysql8.0.34/my.cnf:/etc/my.cnf \
     -v ~/dockerServer/log/mysql8.0.34:/var/log \
     -v ~/dockerServer/data/mysql8.0.34:/var/lib/mysql \
     -v ~/dockerServer/data/mysql-files8.0.34:/var/lib/mysql-files \
     -d my-mysql:mysql-8.0.34
  2. mysql/mysql-server:5.7.41

     cd ~/dockerServer/compose.dockerfile
     mkdir mysql5.7.41 && cd mysql5.7.41
     vim Dockerfile

    Dockerfile 文件内容

     FROM mysql/mysql-server:5.7.41
    
     # 维护者信息
     LABEL xuweidong="determined_xw@126.com"  
    
     # 时区
     ENV TZ Asia/Shanghai
     RUN date -R
    
     # 容器启动时执行指令
     CMD ["mysqld"]

    构建镜像

     docker build -t my-mysql:mysql-5.7.41 .

    启动容器

     docker run -p 3307:3306 \
     --name run-mysql \
     -e MYSQL_ROOT_PASSWORD=123456 \
     -v ~/dockerServer/etc/mysql5.7.41/my.cnf:/etc/my.cnf \
     -v ~/dockerServer/log/mysql5.7.41:/var/log \
     -v ~/dockerServer/data/mysql5.7.41:/var/lib/mysql \
     -v ~/dockerServer/data/mysql-files5.7.41:/var/lib/mysql-files \
     -d my-mysql:mysql-5.7.41

安装 PHP8.1

配置文件

docker pull php:8.1-fpm

docker run --name tmp-php-fpm -d php:8.1-fpm

# 拷贝配置文件到本地
mkdir -p ~/dockerServer/etc/php8.1
docker cp tmp-php-fpm:/usr/local/etc/php/php.ini-development ~/dockerServer/etc/php8.1
docker cp tmp-php-fpm:/usr/local/etc/php-fpm.d/www.conf ~/dockerServer/etc/php8.1
docker cp tmp-php-fpm:/usr/local/etc/php/conf.d/ ~/dockerServer/etc/php8.1
# 删除临时镜像
docker rm -f tmp-php-fpm

cd ~/dockerServer/etc/php8.1
cp php.ini-development php.ini

Dockerfile

cd ~/dockerServer/compose.dockerfile
mkdir php8.1 && cd php8.1
vim Dockerfile

Dockerfile 文件内容

FROM php:8.1-fpm

LABEL xuweidong="determined_xw@126.com"

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions gd xdebug redis mcrypt memcached swoole zip
RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions imagick
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba pcntl shmop sysvmsg sysvsem sysvshm
RUN docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql

WORKDIR /tmp
RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 容器启动时执行指令
CMD ["php-fpm"]

Docker Compose

使用

cd ~/dockerServer/compose.dockerfile
vim docker-compose.yml

填入以下内容

version: "3"

services:
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    restart: always
    tty: true
    container_name: nginx
    volumes:
      - ~/dockerServer/www:/usr/share/nginx/html
      - ~/dockerServer/log/nginx:/var/log/nginx
      - ~/dockerServer/etc/nginx/conf.d:/etc/nginx/conf.d
      - ~/dockerServer/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - lnmp-networks

  mysql8.0.34:
    build: ./mysql8.0.34
    container_name: mysql8.0.34
    tty: true
    restart: always
    ports:
      - "3306:3306"
    volumes:
      - ~/dockerServer/data/mysql8.0.34:/var/lib/mysql
      - ~/dockerServer/data/mysql-files8.0.34:/var/lib/mysql-files
      - ~/dockerServer/etc/mysql8.0.34/my.cnf:/etc/my.cnf
      - ~/dockerServer/log/mysql8.0.34:/var/log
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    networks:
      - lnmp-networks

  redis:
    build: ./redis
    container_name: redis
    tty: true
    restart: always
    ports:
      - "6380:6379"
    volumes:
      - ~/dockerServer/etc/redis/redis.conf:/etc/redis.conf
      - ~/dockerServer/data/redis:/data
      - ~/dockerServer/log/redis:/var/log
    networks:
      - lnmp-networks

  php7.3:
    build: ./php7.3
    tty: true
    restart: always
    container_name: php7.3
    ports:
      - "9000:9000"
    volumes:
      - ~/dockerServer/www:/var/www/html
      - ~/dockerServer/log/php7.3:/var/log/php
      - ~/dockerServer/etc/php7.3/php.ini:/usr/local/etc/php/php.ini
      - ~/dockerServer/etc/php7.3/www.conf:/usr/local/etc/php-fpm.d/www.conf
      - ~/dockerServer/etc/php7.3/conf.d:/usr/local/etc/php/conf.d
    depends_on:
      - nginx
    networks:
      - lnmp-networks

  php8.1:
    build: ./php8.1
    tty: true
    restart: always
    container_name: php8.1
    ports:
      - "9081:9000"
    volumes:
      - ~/dockerServer/www:/var/www/html
      - ~/dockerServer/log/php8.1:/var/log/php
      - ~/dockerServer/etc/php8.1/php.ini:/usr/local/etc/php/php.ini
      - ~/dockerServer/etc/php8.1/www.conf:/usr/local/etc/php-fpm.d/www.conf
      - ~/dockerServer/etc/php8.1/conf.d:/usr/local/etc/php/conf.d
    depends_on:
      - nginx
    networks:
      - lnmp-networks

networks:
  lnmp-networks:

启动

docker-compose up -d

使用 docker 命令执行容器的命令

docker exec -it 容器名称 实际命令

docker exec -it redis redis-cli -v
docker exec -it php8.1 php -v
docker exec -it php8.1 php -m
# 重启 nginx
docker exec -it nginx nginx -s reload

项目中配置修改

设置自定义路径的都需要修改

admin .env 配置文件修改

;文件、日志目录
SCRIPT_FILE_PATH=/var/www/html/sx-code/www/script/
CURRENT_PATH=/var/www/html/sx-code/admin/
RUNTIME_PATH=/var/log/php/admin/new_trunk/php/runtimes/

teacher_center .env 配置文件修改

;课件
COURSEWARE_DOWNLOAD_PATH='/var/log/php/teacher_center/tmpfile/'

Elasticsearch7.9.1

下载 es

docker pull elasticsearch:7.9.1

启动 es

docker run -p 9201:9200 -p 9300:9300 --name=es01 -e "discovery.type=single-node" -d elasticsearch:7.9.1

docker 启动 elasticsearch 报错:

——ERROR: Elasticsearch did not exit normally - check the logs at xxx
解决:blog.csdn.net/weixin_40816738/arti...
在运行命令中添加 -e "discovery.type=single-node"
discovery.type
静态)指定 Elasticsearch 是否应形成多节点集群。默认情况下,Elasticsearch 在形成集群时会发现其他节点,并允许其他节点稍后加入集群。如果discovery.type设置为single-node,Elasticsearch 将形成单节点集群并抑制 所设置的超时 cluster.publish.timeout。有关何时可以使用此设置的更多信息,请参阅单节点发现

来源:www.elastic.co/guide/en/elasticsea...

拷贝配置文件

cd ~/dockerServer/etc
mkdir es7.9.1
docker cp es01:/usr/share/elasticsearch/config/elasticsearch.yml es7.9.1
mkdir -p ~/dockerServer/data/es7.9.1

删除容器

docker rm -f es01

ik 分词器

手动下载:github.com/medcl/elasticsearch-ana...

mkdir -p ~/dockerServer/plugins/es7.9.1/ik
mv ~/Downloads/elasticsearch-analysis-ik-7 ~/dockerServer/plugins/es7.9.1/ik

以下适用于 amd6 4架构系统,M1没有适合的 Kibana 镜像

安装 kibana, 自定义网络

Error response from daemon: user specified IP address is supported on user defined networks only.

仅在用户定义的网络上支持用户指定的IP地址。

创建自定义网络

docker network create --subnet=172.19.0.0/16 es-network

启动容器时,配置固定IP

docker run -p 9200:9200 -p 9300:9300 \
--restart=always \
--name=elasticsearch7.9.1 \
-e "discovery.type=single-node" \
--net=es-network --ip=172.19.0.12 \
-v ~/dockerServer/data/es7.9.1:/usr/share/elasticsearch/data \
-v ~/dockerServer/etc/es7.9.1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v ~/dockerServer/plugins/es7.9.1/ik:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.9.1

安装 kibana7.9.1

docker pull kibana:7.9.1

启动,指定 es 的IP,配置网络

docker run -p 5601:5601 -d --name kibana \
-e ELASTICSEARCH_HOSTS=http://172.19.0.12:9200 \
--net=es-network \
--restart=always kibana:7.9.1

M1 本地安装Kibana

可能需要安装jdk1.8

  1. 下载 JDK1.8

    可以到Java Downloads | Oracle下载,但是 Oracle 需要登录或者注册,然后才能下载,注册一个就好了。

  2. 安装 java 8

  3. 查看当前的 Java 版本

    java -version

启动 es

docker run -p 9200:9200 -p 9300:9300 \
--restart=always \
--name=elasticsearch7.9.1 \
-e "discovery.type=single-node" \
-v ~/dockerServer/data/es7.9.1:/usr/share/elasticsearch/data \
-v ~/dockerServer/etc/es7.9.1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v ~/dockerServer/plugins/es7.9.1/ik:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.9.1

安装

点击 View past releases,选择和已安装的 ES 版本相同的版本。

解压,默认在下载目录(也可以放到自己想放的目录),进入目录

# 进入kibana的文件目录下
# 启动命令(加-d问后台启动) 
# ~/Applications/kibana-7.9.1-darwin-x86_64/bin/kibana
# ./bin/kibana
cd ~/Applications/kibana-7.9.1-darwin-x86_64
# 后台启动
./bin/kibana -d

本地 Kibana 访问其他的机器的 es

配置文件: /config/kibana.yml

修改 elasticsearch.hosts 的值

# The URLs of the Elasticsearch instances to use for all your queries.
# elasticsearch.hosts: ["http://localhost:9200"]

elasticsearch.hosts: ["http://estest.com:9200"]

Dockerfile 添加es

  1. 编写 Dockerfile

     cd ~/dockerServer/compose.dockerfile/es7.9.1
     cd es7.9.1
     vim Dockerfile
     FROM elasticsearch:7.9.1
    
     # container creator
     LABEL maintainer="liu_xiao_guo@yahoo.com"
    
     # copy the configuration file into the container
     # COPY elasticsearch.yml /usr/share/elasticsearch/config
    
     # expose the default Elasticsearch port
     EXPOSE 9200 9300
  2. 启动测试

     docker build -t my-es:7.9.1 .
     docker run -p 9200:9200 -p 9300:9300 \
     --restart=always \
     --name=elasticsearch7.9.1 \
     -e "discovery.type=single-node" \
     -v ~/dockerServer/data/es7.9.1:/usr/share/elasticsearch/data \
     -v ~/dockerServer/etc/es7.9.1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
     -v ~/dockerServer/plugins/es7.9.1/ik:/usr/share/elasticsearch/plugins \
     -d my-es:7.9.1
  3. 编写 docker-compose.yml

    -e “discovery.type=single-node” 加入配置文件

    vim ~/dockerServer/etc/es7.9.1/elasticsearch.yml
    discovery.type: single-node
   vim ~/dockerServer/compose.dockerfile/docker-compose.yml
   version: "3"

   services:
     nginx:
       build: ./nginx
       ports:
         - "80:80"
       restart: always
       tty: true
       container_name: nginx
       volumes:
         - ~/dockerServer/www:/usr/share/nginx/html
         - ~/dockerServer/log/nginx:/var/log/nginx
         - ~/dockerServer/etc/nginx/conf.d:/etc/nginx/conf.d
         - ~/dockerServer/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
       networks:
         - lnmp-networks

     mysql8.0.34:
       build: ./mysql8.0.34
       container_name: mysql8.0.34
       tty: true
       restart: always
       ports:
         - "3306:3306"
       volumes:
         - ~/dockerServer/data/mysql8.0.34:/var/lib/mysql
         - ~/dockerServer/data/mysql-files8.0.34:/var/lib/mysql-files
         - ~/dockerServer/etc/mysql8.0.34/my.cnf:/etc/my.cnf
         - ~/dockerServer/log/mysql8.0.34:/var/log
       environment:
         MYSQL_ROOT_PASSWORD: 123456
       networks:
         - lnmp-networks

     redis:
       build: ./redis
       container_name: redis
       tty: true
       restart: always
       ports:
         - "6380:6379"
       volumes:
         - ~/dockerServer/etc/redis/redis.conf:/etc/redis.conf
         - ~/dockerServer/data/redis:/data
         - ~/dockerServer/log/redis:/var/log
       networks:
         - lnmp-networks

     php7.3:
       build: ./php7.3
       tty: true
       restart: always
       container_name: php7.3
       ports:
         - "9000:9000"
       volumes:
         - ~/dockerServer/www:/var/www/html
         - ~/dockerServer/log/php7.3:/var/log/php
         - ~/dockerServer/etc/php7.3/php.ini:/usr/local/etc/php/php.ini
         - ~/dockerServer/etc/php7.3/www.conf:/usr/local/etc/php-fpm.d/www.conf
         - ~/dockerServer/etc/php7.3/conf.d:/usr/local/etc/php/conf.d
       depends_on:
         - nginx
       networks:
         - lnmp-networks

     php8.1:
       build: ./php8.1
       tty: true
       restart: always
       container_name: php8.1
       ports:
         - "9081:9000"
       volumes:
         - ~/dockerServer/www:/var/www/html
         - ~/dockerServer/log/php8.1:/var/log/php
         - ~/dockerServer/etc/php8.1/php.ini:/usr/local/etc/php/php.ini
         - ~/dockerServer/etc/php8.1/www.conf:/usr/local/etc/php-fpm.d/www.conf
         - ~/dockerServer/etc/php8.1/conf.d:/usr/local/etc/php/conf.d
       depends_on:
         - nginx
       networks:
         - lnmp-networks

     es7.9.1:
       build: ./es7.9.1
       tty: true
       restart: always
       container_name: elasticsearch7.9.1
       ports:
         - "9200:9200"
         - "9300:9300"
       volumes:
         - ~/dockerServer/data/es7.9.1:/usr/share/elasticsearch/data
         - ~/dockerServer/etc/es7.9.1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
         - ~/dockerServer/plugins/es7.9.1/ik:/usr/share/elasticsearch/plugins
       networks:
         - lnmp-networks


   networks:
     lnmp-networks:
   docker-compose up -d
  1. 项目中连接 es

    1. TP 使用容器名称

      SCOUT_DRIVER=elasticsearch
      ELASTICSEARCH_HOST=elasticsearch7.9.1
      ELASTICSEARCH_PORT=
      ELASTICSEARCH_USER=
      ELASTICSEARCH_PASS=
    2. Laravel 中可以直接用“IP+端口号”

      SCOUT_DRIVER=elasticsearch
      ELASTICSEARCH_HOST=localhost
      ELASTICSEARCH_PORT=9200
      ELASTICSEARCH_USER=
      ELASTICSEARCH_PASS=

PHP 安装 zip 扩展

  1. 修改 PHP 的 Dockerfile

    解决上传文件报错

    ZipArchive library is not enabled

     vim ~/dockerServer/compose.dockerfile/php7.3/Dockerfile
     FROM php:7.3-fpm
    
     LABEL xuweidong="determined_xw@126.com"
    
     ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
    
     RUN chmod +x /usr/local/bin/install-php-extensions && \
         install-php-extensions gd xdebug redis mcrypt memcached swoole zip
     RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
         install-php-extensions imagick
     RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
    
     RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba pcntl shmop sysvmsg sysvsem sysvshm
     RUN docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql
    
     # 容器启动时执行指令
     CMD ["php-fpm"]
  2. 然后在对应的 php.ini 开启扩展

     extension=zip

PHP 镜像中安装 composer

php7.3

vim ~/dockerServer/compose.dockerfile/php7.3/Dockerfile

php8.1

vim ~/dockerServer/compose.dockerfile/php8.1/Dockerfile

写入

WORKDIR /tmp
RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

原文

mycherish.github.io/m1-mac-docker-...

参考

本作品采用《CC 协议》,转载必须注明作者和本文链接
倚南窗以寄傲,审容膝之易安
讨论数量: 4
自由与温暖是遥不可及的梦想

docker了 再搞一下 k8s

5个月前 评论
腹肌会有的 (楼主) 4个月前

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