宿主机套用 docker 容器中安装 PHP 的开发环境

docker 可以把运行环境整体打包,但是在开发时,IDE 往往还要指定宿主机上的PHP 可执行文件,这样,安装php扩展时,要装两遍,比较麻烦.如果在宿主机上运行容器中的命令? 可以借助 docker exec -it <container_name> <command> <args> 命令, 写个 名为php 的shell 脚本,里面写入这行代码即可.

我用的环境是 wsl 中安装 docker, 很久以前,这个方法似乎很不通, 在 phpsrtom 中指定 php可执行文件时, 会报检测不通过,后来,这个方法又成功了.

从 ubuntu22.04 构建自己的基础镜像,这里主要是安装一些基础依赖,并切换了下镜像源。也可以跳过,直接用 ubuntu22.04 官方源。我之前用官方源时,发现 apt update 时,连接失败。然后我在香港云服务器上通过下面的 Dockfile 创建了个基础镜像。

#=================================================================================================
# docker build --force-rm -t zbseoag/ubuntu:22.04  .
#=================================================================================================
FROM ubuntu:22.04

WORKDIR /home
RUN set -eux ;\
apt-get update ;\
apt-get install -y --no-install-recommends --no-install-suggests ca-certificates ;\
cp /etc/apt/sources.list /etc/apt/sources.list.bak ;\
sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list ;\
sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list

运行容器:

docker run -id --name work --add-host work:127.0.0.1 --network host -v /c:/c -v /d:/d --cap-add SYS_PTRACE --restart unless-stopped zbseoag/ubuntu:22.04
docker exec -it work bash

进入容器后,就像一般使用 ubuntu 一样,安装 php nginx mysql 

apt install sudo 
apt install php-dev nginx mysql_server redis-server composer

在宿主机上创建 php 和 composer 脚本

su root
echo 'docker exec -t work php "$@"' > /usr/local/bin/php
echo 'docker exec -w $(pwd) -t work composer "$@"' > /usr/local/bin/composer
chmod a+x /usr/local/bin/php /usr/local/bin/composer

然后,就可以在宿主机上尝试使用 php -v 查看版本

提交容器为镜像,并推送到 docker hub

docker commit work zbseoag/work:latest
docker login
docker push zbseoag/work:latest

  

为了方法更新我的工作镜像,在 .bashrc 中封装一个 shell 函数

function work(){

    if [ -z "$1" ];then
        set -- bash
    fi

    case "$1" in
        run)
            docker rm -f work 2> /dev/null
            docker run -id --name work --add-host work:127.0.0.1 --network host -v /c:/c -v /d:/d --cap-add SYS_PTRACE --restart unless-stopped zbseoag/work:latest
        ;;
        commit)
            docker commit work zbseoag/work:latest && docker rm -f work && docker image prune -f
            work run
        ;;

        push)
            docker push zbseoag/work:latest
        ;;

        *)  docker exec -w $(pwd) -it work "$@" #运行容器中的命令,比如:启动mysql时, work service mysql start
    esac

}

 

posted @ 2023-05-26 15:49  心随所遇  阅读(191)  评论(0编辑  收藏  举报