“Docker k8s底层原理”与“Docker lnmp Docker-compose搭建nginx+php+mysql”:页面之间的差异

来自linuxsa wiki
(页面间差异)
跳转到导航 跳转到搜索
Evan留言 | 贡献
无编辑摘要
 
Evan留言 | 贡献
 
第1行: 第1行:
[[category:devops]]  
==[http://wiki.linuxchina.net/index.php?title=Docker-compose%E6%95%99%E7%A8%8B#install Docker-Compose install]==


=docker=
https://wiki.linuxchina.net/index.php/Alpine#alpine_docker_php  站内参考


Docker 底层原理基于容器技术,依赖于 Linux 操作系统的几项核心功能,如 Namespaces、Cgroups 和 UnionFS 等机制,来实现进程隔离、资源控制和高效的文件系统管理。
[[Docker nginx]]


1. Namespace (命名空间)
[[Docker mysql]]


Namespace 是 Docker 实现资源隔离的基础技术。Linux 内核通过命名空间将容器内的资源与主机隔离。每个容器都有自己的独立命名空间,从而达到进程、网络、文件系统等资源的隔离。


    PID Namespace:隔离进程 ID,使得容器中的进程看不到其他容器或主机上的进程。
[[How to Create a MySql Instance with Docker Compose]]
    Network Namespace:每个容器拥有自己独立的网络接口、路由表、IP 地址。
    Mount Namespace:提供文件系统的隔离,每个容器有自己独立的文件系统视图。
    UTS Namespace:允许容器内的进程独立修改主机名和域名。
    IPC Namespace:隔离进程间的通信,确保容器间的消息队列、信号量等是独立的。
    User Namespace:使容器内的用户和主机上的用户权限可以不同步,提供安全性。


2. Cgroups (控制组)
==php==
<pre>
mkdir docker4php  && cd docker4php
vi Dockerfile
FROM php:7.1-fpm-stretch 
#原来是这个 但是这个就不能apt 如果要和下面对应 要改一下
#FROM php:7.1-fpm-alpine 
Run apt-get update \
&& apt install iputils-ping \
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli
</pre>


Cgroups 用于控制容器的资源使用,主要包括 CPU、内存、网络带宽、IO 等。Docker 使用 Cgroups 来限制、统计和隔离每个容器的资源使用。
== compose==
<pre>
mkdir npm4compose
cd npm4compose
mkdir conf.d php html
cd conf.d && touch nginx.conf
cd -
cd html && touch index.php && echo "<?php phpinfo(); ?>" >index.php
cd  ..
mv  ~/docker4php/Dockerfile ./php/


    资源限制:通过 Cgroups,Docker 可以为每个容器设定 CPU、内存等资源上限,防止某个容器过度消耗资源。
[root@localhost npm4compose]# tree
     资源监控:Cgroups 能实时监控容器的资源使用,帮助优化性能和进行故障诊断。
.
|-- conf.d
|  `-- nginx.conf
|-- docker-compose.yml
|-- html
|  `-- index.php
`-- php
     `-- Dockerfile


3. UnionFS (联合文件系统)


UnionFS 是一种分层的文件系统技术,Docker 利用它来高效地构建和管理镜像。Docker 镜像由多个只读层组成,不同的镜像层共享基础层,这减少了存储空间的占用。


    写时复制(Copy-on-Write):容器的可写层在启动时叠加到只读镜像层上,只有当容器需要修改数据时,才会对数据进行写时复制。
vi docker-compose.yml
    镜像分层:Docker 镜像是分层的,基础镜像可以被多个容器共享,从而提高了镜像的构建和分发效率。


4. 容器网络
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
    - "80:80"
    depends_on:
    - "php"
    volumes:
    - "${PWD}/conf.d:/etc/nginx/conf.d" 
    - "${PWD}/html:/usr/share/nginx/html"
    networks:
    - d_net
    container_name: "compose-nginx"
  php:
    build: ./php  #指定build Dockerfile生成镜像
    image: php:7.1-fpm-alpine
    ports:
    - "9000:9000"
    volumes:
    - "$PWD/html:/var/www/html"
    networks:
    -  d_net
    container_name: "compose-php"
  mysql:
    image: mysql:5.7
    ports:
    - "3306:3306"
    environment:
      MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'evan'
      # You can use whatever password you like
      MYSQL_PASSWORD: '123456'
      # Password for root access
      MYSQL_ROOT_PASSWORD: '123456'
    expose:
      # Opens port 3306 on the container
      - '3306'


Docker 提供了多种网络模式,通过虚拟网络技术为容器提供灵活的网络配置。
    networks:
    - d_net
    container_name: "compose-mysql"


    桥接网络(Bridge Network):Docker 默认使用桥接网络,将容器连接到虚拟桥接设备上,容器之间可以通过 IP 直接通信。
networks:
     Host 网络:容器与主机共享同一个网络堆栈,使用主机的 IP 地址和端口。
     d_net:
    Overlay 网络:用于跨多个主机的容器通信,特别适用于 Docker Swarm 或 Kubernetes 环境。
        driver: bridge


5. 存储机制


Docker 使用多种存储机制来管理容器中的数据。容器内的文件系统是临时的,容器删除后会丢失,Docker 通过持久化存储解决这个问题。


    Volumes(卷):Docker 推荐的持久化存储方式,可以将数据存储在主机上,并在多个容器间共享。
vi  conf.d/nginx.conf
    Bind mounts:将主机文件系统中的目录挂载到容器中,容器可以直接访问主机上的文件。
    tmpfs mounts:数据只存储在内存中,适合临时数据。


6. 容器运行时(Container Runtime)
server{
    listen 80;
    server_name a.com;
    #server_name localhost;
    location /{
        root /var/www/html;
        index index.php index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/html;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
    }
   
}


Docker 的容器运行时负责创建和管理容器,Docker 默认使用 runc 作为容器运行时。runc 是基于 Open Container Initiative (OCI) 标准的运行时工具,能够启动符合标准的容器。


    Containerd:它是 Docker 的底层容器管理服务,负责容器的生命周期管理(创建、启动、停止等),同时与 runc 协同工作执行容器的具体操作。
docker-compose  up -d
</pre>


7. Docker Daemon 和 REST API
=php连接mysql=


Docker 的核心组件是 Docker Daemon,它是运行在后台的进程,负责处理容器的生命周期管理。Docker Daemon 通过 REST API 提供外部接口,开发者可以通过 API 或 Docker CLI 与 Daemon 进行交互。
=测试检查=
<pre>
[root@work2 npm4compose]# docker-compose  ps
    Name                  Command              State                Ports             
-----------------------------------------------------------------------------------------
compose-mysql  docker-entrypoint.sh mysqld    Up      0.0.0.0:3306->3306/tcp, 33060/tcp
compose-nginx  nginx -g daemon off;            Up      0.0.0.0:80->80/tcp             
compose-php    docker-php-entrypoint php-fpm  Up      0.0.0.0:9000->9000/tcp 


总结


Docker 通过命名空间 (Namespaces) 实现资源的隔离,使用 Cgroups 管理资源分配与限制,通过 UnionFS 高效管理镜像层次,结合强大的网络模型和存储机制,形成了一个轻量、高效的容器化平台。Docker 的底层技术结合了 Linux 内核的众多强大功能,为现代云计算和微服务架构提供了基础支持。
docker ps
************************
CONTAINER ID        IMAGE                COMMAND                  CREATED            STATUS              PORTS                              NAMES
docker 底层原理有深入理解
0e2e7b200b47        nginx:latest        "nginx -g 'daemon of…"  5 minutes ago      Up 5 minutes        0.0.0.0:80->80/tcp                  compose-nginx
ChatGPT 说:
b0990f13ddd2        mysql:5.7            "docker-entrypoint.s…"  5 minutes ago      Up 5 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp  compose-mysql
ChatGPT
e0ff739663a9        php:7.1-fpm-alpine  "docker-php-entrypoi…"  5 minutes ago      Up 5 minutes        0.0.0.0:9000->9000/tcp              compose-php


在深入理解 Docker 的底层原理时,需要特别关注容器的隔离、资源管理和存储机制等关键技术。让我更详细地解释这些核心技术。
1. 容器与虚拟机的区别


Docker 容器和传统虚拟机最大的区别在于它们的隔离方式:


    虚拟机: 每个虚拟机都拥有完整的操作系统实例,包括虚拟化的硬件层(如 CPU、内存、磁盘等),其资源开销较大。
http://192.168.88.22/index.php
    容器: 容器共享主机的操作系统内核,并使用操作系统级别的隔离技术来实现轻量化的虚拟化。这大幅减少了容器的资源占用,使其启动和销毁更加迅速。


2. Docker 主要使用的三大技术:Namespace、Cgroups 和 UnionFS
dns 
2.1 Namespace (命名空间)


Namespace 是 Linux 内核提供的一种隔离机制,Docker 使用它来隔离容器与主机以及容器之间的资源:
cat  /etc/hosts
192.168.88.22  a.com


    PID Namespace:每个容器有自己独立的进程树。容器内的进程无法看到或影响其他容器中的进程。
</pre>
    Mount Namespace:提供文件系统的隔离,确保每个容器只能访问分配给它的文件系统。
    Network Namespace:每个容器都有独立的网络堆栈,包括 IP 地址、路由表等,这使得容器的网络通信可以独立进行。
    UTS (Unix Time Sharing) Namespace:容器拥有独立的主机名和域名。
    IPC Namespace:隔离进程间的通信,确保不同容器的进程无法共享消息队列、信号量等。
    User Namespace:允许容器中的用户和宿主机的用户 ID 进行映射,使得容器中的 root 用户权限受到限制。
2.2 Cgroups (控制组)


Cgroups 提供了资源管理的功能,Docker 使用它来限制和监控容器使用的 CPU、内存、网络带宽等资源:


    资源限制:通过 Cgroups,Docker 可以为每个容器设定 CPU 核心数、内存上限等参数,确保容器不会消耗过多资源。
==mysql暂时不用这个==
    资源优先级:Docker 允许设置容器之间的资源优先级(例如不同的 CPU 权重),从而实现资源的合理分配。
docker pull mysql:8.0
    资源统计:Cgroups 能够实时监控容器的资源使用情况,如 CPU 使用时间、内存使用量等,便于运维人员优化和排查问题。


2.3 UnionFS (联合文件系统)
[[How to Create a MySql Instance with Docker Compose]]


Docker 镜像采用分层存储结构,使用 UnionFS 这种分层文件系统技术来管理镜像。常见的实现包括 AUFS、OverlayFS 和 Btrfs。
=trouble=
<pre> docker-compose up -d
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.php.networks contains {"d_net": null}, which is an invalid type, it should be a string


    分层镜像:Docker 镜像由多个只读层组成,每一层通常代表一次文件系统的变更。例如,基础镜像可以是一个最小化的 Linux 操作系统,上面逐层叠加应用依赖和应用程序。
  networks:
    写时复制(Copy-on-Write):当容器对文件系统进行写操作时,文件的写入是在容器的可写层上完成的,而基础层保持不变。这样,多个容器可以共享基础层数据,节省磁盘空间并加快启动速度。
    - d_net :  :不能要


3. Docker 网络


Docker 提供多种网络模型,支持灵活的容器网络配置:


    Bridge 网络:默认情况下,Docker 会创建一个 bridge(网桥)网络,所有容器都连接到这个网络上。它通过 NAT 来实现容器与外部网络的通信。
    Host 网络:容器与主机共享网络堆栈,这种模式下,容器直接使用宿主机的网络接口,减少了网络虚拟化的开销。
    Overlay 网络:用于跨多个主机的容器通信,尤其是在 Swarm 和 Kubernetes 环境下,通过 Overlay 网络可以将不同主机上的容器连接在一起。


4. Docker 存储
[root@localhost npm4compose]# cat  php/Dockerfile
容器的存储是临时的,默认情况下,容器关闭或删除后其文件系统中的数据会丢失。为了实现持久化存储,Docker 提供了几种机制:
FROM php:7.1-fpm-alpine
Run apt-get update \
&& apt install iputils-ping \
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli
这个alpine 他居然安装软件是apt  我去 这么搞笑


     Volumes(卷):这是 Docker 推荐的持久化存储方式,卷可以存在于主机文件系统之外,多个容器可以共享同一个卷。
nginx:
     Bind mounts:将主机的文件或目录直接挂载到容器中,允许容器访问主机的文件系统。这在开发环境中非常有用。
     image: nginx:lastest
    tmpfs mounts:将数据存储在内存中,而不是磁盘,适合临时性的数据需求,例如缓存数据。
     ports:
这些单词 拼写 我去 ,


5. Docker Daemon 和 REST API


Docker Daemon 是 Docker 的核心,它是一个后台进程,负责处理 Docker 容器的管理任务。Docker Daemon 与容器运行时(如 runc)通信,并通过以下几部分协同工作:


    Docker CLI:命令行工具,与 Docker Daemon 通信来执行容器操作。
定义网络叫app_net 写在应用又写了d_net
    Docker API:Docker Daemon 通过 REST API 提供外部接口,开发者可以使用它编写程序来自动化容器管理。


6. 容器运行时(Container Runtime)


Docker 使用的默认容器运行时是 runc,它是一个轻量级的运行时,用于创建和运行容器。runc 基于 OCI(Open Container Initiative)的规范,确保容器的标准化和兼容性。此外,容器运行时抽象层(Containerd)也是 Docker 生态系统中的一个重要组件,它负责管理容器生命周期
container_name: "compose-php"
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD={your_passwd}
networks:
- d_net
container_name: "compose-mysql"
networks: #配置docker 网络
app_net:
driver: bridge
</pre>


=2020年 11月 15日 星期日 13:34:00 CST给phper=
https://github.com/evan886/docker-compose-lnmp


总结来说,Docker 依赖于 Linux 内核的多种特性,如 Namespace 提供隔离,Cgroups 管理资源,UnionFS 实现高效存储管理,同时通过 Daemon 和 REST API 进行容器生命周期管理和自动化操作。Docker 的设计思想基于轻量级虚拟化,使得容器成为开发和部署现代应用的核心技术之一。
有空要结合我上面的 再搞好一些
=k8s 底层原理有深入理解=
Kubernetes (K8s) 是用于自动化部署、扩展和管理容器化应用的分布式系统。其底层原理涉及多个核心组件,协调工作以提供高可用性、可扩展性和弹性。以下是对 Kubernetes 底层原理的深入理解:


1. 架构概述
[https://www.jianshu.com/p/79c650b1918d docker-compose搭建lnmp运营环境]


Kubernetes 是一个主从架构(Master-Worker)系统,主节点(Master)负责集群的全局控制和管理,工作节点(Worker)则负责运行容器化的应用程序。Kubernetes 的核心组件包括:
[https://learnku.com/articles/31344  避坑!用 Docker 搞定 PHP 开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode) ]


    Master 节点:负责协调整个集群,包括 API Server、Scheduler 和 Controller Manager。
[https://zhuanlan.zhihu.com/p/59863793 docker部署MySQL+PHP-FPM+Nginx服务]
    Worker 节点:运行应用容器,包括 Kubelet、Kube-proxy 和容器运行时。


1.1 Master 节点组件
https://github.com/yansongda/docker-compose-LNMP


    API Server:API Server 是 Kubernetes 的核心入口,提供 REST API 接口供用户和集群内部组件通信。所有的集群管理请求都会首先进入 API Server,它负责处理验证和请求路由。
[https://zhuanlan.zhihu.com/p/38284933 【docker】 linux 下 使用docker搭建 lNMP]
    Etcd:Kubernetes 使用 Etcd 作为其一致性存储,存储所有的集群状态数据。它是一个分布式键值存储,保证数据的强一致性、高可用性。
    Scheduler:调度器负责将新创建的 Pod 分配到集群中的工作节点。调度器会根据预设的策略、资源需求、节点健康状态等条件,决定最适合运行 Pod 的节点。
    Controller Manager:运行各种控制器(如副本控制器、节点控制器等),负责监控集群的状态,并确保实际状态符合期望状态。例如,如果某个 Pod 意外崩溃,控制器会确保其重新调度。


1.2 Worker 节点组件
=see also=


    Kubelet:Kubelet 是运行在每个工作节点上的代理,负责与 Master 节点的 API Server 通信,并执行分配到该节点的 Pod。Kubelet 会根据 Pod 定义启动相应的容器,并周期性监控容器的健康状况。
[https://blog.csdn.net/hanlicun/article/details/79049598 基于Dockerfile构建LNMP(good-php扩展php7+mysql+nginx]
    Kube-proxy:负责在每个节点上维护网络规则,确保 Pod 和服务之间的通信。它处理节点之间的网络流量和服务的负载均衡。
    容器运行时:负责实际启动和管理容器。Kubernetes 支持多种容器运行时,如 Docker、containerd、CRI-O 等
2. 核心概念和原理
2.1 Pod


Pod 是 Kubernetes 中最小的部署单位,通常包含一个或多个紧密相关的容器。这些容器共享同一个网络命名空间、存储卷和生命周期。每个 Pod 都有一个唯一的 IP 地址,用于和其他 Pod 进行通信。
2.2 Service (服务)


Service 是 Kubernetes 中的抽象,用于将一组 Pod 组织为一个逻辑服务,提供统一的访问入口。即使背后的 Pod 动态变化,Service 的 IP 和端口保持不变,从而实现了负载均衡和服务发现。


    ClusterIP:默认服务类型,提供集群内部的负载均衡。
[https://github.com/Tinywan/dnmp docker-compose部署LNMP环境 Nginx(Openresty)、MySQL5.7、PHP7.2(5.6)、Redis5.0、PHPMyAdmin、Xdebug]
    NodePort:允许通过每个节点的指定端口从外部访问服务。
    LoadBalancer:集成云提供商的负载均衡器,直接暴露服务到外部。


2.3 Volume (存储)
[https://www.jyoryo.com/index.php/archives/96.html Nginx 1.15.X Linux Debian/Ubuntu 源码编译安装 LNMP之Nginx]


Pod 中的容器通常是无状态的,但 Kubernetes 提供了持久化存储支持。Kubernetes 支持多种存储后端,如本地磁盘、NFS、云存储(如 AWS EBS、GCE Persistent Disks)等。通过 Persistent Volume (PV) 和 Persistent Volume Claim (PVC),用户可以声明和请求持久化存储。
[https://www.jyoryo.com/index.php/archives/1.html Linux安装优化配置LNMP LEMP]
2.4 Deployment (部署)


Deployment 是一种声明式的方式来定义应用程序的期望状态。它允许自动更新应用程序,并支持滚动升级和回滚。通过 Deployment,用户可以定义多个副本的 Pod 并确保在集群中高效运行。
[https://www.jyoryo.com/index.php/archives/89.html MySQL 5.6 Linux Debian/Ubuntu源码编译安装 LNMP之MySQL]
2.5 Namespace (命名空间)


Kubernetes 使用命名空间来实现资源的逻辑隔离。不同的团队或项目可以在同一个集群中使用不同的命名空间,从而实现资源的分离。
3. Kubernetes 调度与资源管理
3.1 调度策略


Kubernetes 的调度器负责根据资源请求(CPU、内存等)、节点资源利用率、亲和性、反亲和性规则等,将 Pod 安排到合适的节点上。调度器的目标是最大化资源利用率,并确保服务的高可用性。
[https://blog.csdn.net/whw8007/article/details/8828613 在 Debian 上源码编译和安装 Nginx+PHP+FastCGI+MySQL]


    资源请求和限制:在定义 Pod 时,用户可以指定容器的资源请求(request)和资源限制(limit)。Kubernetes 会根据这些资源要求来调度容器。
[https://www.jianshu.com/p/0561d3cfccda good_testmysql-docker-compose搭建nginx+php+mysql]
    亲和性/反亲和性:调度时,Kubernetes 支持 Pod 之间的亲和性和反亲和性规则。例如,可以让某些 Pod 优先调度在同一个节点上,或者确保它们分布在不同的节点上。


3.2 资源管理
[https://www.chadou.me/p/218 从零开始学习Docker - 搭建 nginx+mysql+php 环境]


Kubernetes 提供了多种资源管理功能,包括水平自动扩展、垂直自动扩展和自愈机制。
[https://kim1024.github.io/2018/10/30/lnmp-docker.html 使用Docker-Compose搭建nginx+php+mysql基础应用]


    水平扩展 (Horizontal Pod Autoscaler, HPA):根据 CPU 使用率或自定义指标,自动调整 Pod 副本数。
https://github.com/kkmike999/docker-compose-php-nginx-mysql/blob/master/docker-compose.yml
    垂直扩展 (Vertical Pod Autoscaler, VPA):自动调整 Pod 所请求的 CPU 和内存资源。
    自愈机制:Kubernetes 会自动重新调度失败的 Pod,确保应用程序的高可用性。


4. 网络模型与服务发现
[https://blog.csdn.net/hellozhxy/article/details/80239697 dockerfile构建nginx并结合php]


Kubernetes 使用了一个扁平的网络模型,要求集群中的每个 Pod 都能够直接与其他 Pod 通信。常见的网络插件有 Calico、Flannel、Weave 等,它们为 Kubernetes 提供了网络连接和路由功能。
[https://blog.csdn.net/tang05709/article/details/77996246 compose install more PHP extensions]
4.1 DNS 服务


Kubernetes 内置了 DNS 服务,用于为集群中的每个 Service 和 Pod 提供 DNS 解析。通过 DNS,Pod 可以直接使用服务的名称而不是 IP 地址进行通信,从而简化了服务发现和连接。
[https://my.oschina.net/yifanxiang/blog/3001902 使用docker-composer创建一个mysql容器,并创建一个database且指定其编码集为中文utf8]
4.2 网络插件 (CNI)


Kubernetes 使用 Container Network Interface (CNI) 来集成不同的网络插件,提供灵活的网络管理能力。每个插件可以处理网络隔离、IP 地址分配、路由、负载均衡等任务。
[https://blog.csdn.net/weixin_33786077/article/details/87560933 Docker docker-compose 配置Nginx+Php+Mysql开发环境]


5. 安全机制
[https://blog.csdn.net/bbwangj/article/details/81352154 docker-compose搭建 Nginx+PHP+MySQL 环境]


Kubernetes 通过多种机制保障集群的安全性,包括 RBAC(基于角色的访问控制)、命名空间隔离、网络策略、加密通信等。


    RBAC (Role-Based Access Control):通过定义角色和权限来限制用户对集群资源的访问。
    网络策略:允许用户定义 Pod 之间的通信规则,限制不必要的网络连接,提升安全性。


6. 扩展与自定义


Kubernetes 提供了一系列自定义与扩展能力,使得用户能够根据需求扩展其功能。
[https://www.jianshu.com/p/fcd0e542a6b2 Docker多容器部署LNMP环境]


    Custom Resource Definitions (CRD):允许用户定义自己的 API 资源。
[https://www.chadou.me/p/218 从零开始学习Docker - 搭建 nginx+mysql+php 环境]
    Operator:一种 Kubernetes 中的自定义控制器,用于自动化管理复杂的应用程序生命周期。


总结
[https://segmentfault.com/a/1190000012795525 从零构建一个基于Docker的Laravel应用]


Kubernetes 的底层原理依赖分布式系统设计,核心通过 API Server 协调,etcd 存储状态,Scheduler 调度 Pod,Controller Manager 维持集群期望状态与实际状态一致。它利用命名空间和服务来实现应用的隔离与高可用性,并通过调度、扩展、资源管理等功能实现应用的自动化管理。
 
[https://blog.csdn.net/Gekkoou/article/details/80915694 docker-compose 部署 nginx + php-fpm + mysql + phpmyadmin]
 
 
[https://github.com/kkmike999/docker-compose-php-nginx-mysql docker-compose php + nginx + mysql]
 
 
[https://www.jianshu.com/p/3384e342502b 使用Docker快速搭建Nginx+PHP-FPM环境]
=参考=
 
[https://blog.csdn.net/q6627666/article/details/89256238  Docke搭建Nginx+php-fpm+https]
 
[https://www.cnblogs.com/xiao987334176/p/12918413.html 使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境]
 
[https://blog.csdn.net/xiazichenxi/article/details/95652457  docker-compose一键部署LNMP环境(Nginx+MySQL+PHP)]
 
[http://www.sail.name/2017/09/26/retalk-use-docker-to-build-development-environment-of-php-mysql-nginx/ 再谈docker搭建nginx+php+mysql开发环境]
 
[https://www.awaimai.com/728.html Docker部署LNMP完整教程]
 
https://github.com/nanoninja/docker-nginx-php-mysql
 
[https://github.com/addcn/docker-lnmp/blob/master/lnmp/nginx/Dockerfile addcn/docker-lnmp]
 
[https://segmentfault.com/a/1190000019361535 Docker快速搭建一套PHP、Nginx、MySQL、Redis、Xdebug、Memcached 开发环境并演进]
 
 
[https://blog.csdn.net/dawn_moon/article/details/78873027 docker搭建php,nginx,mysql环境]
 
[http://www.runoob.com/docker/docker-install-mysql.html 通过 Dockerfile构建 mysql]
 
[https://www.jianshu.com/p/fcd0e542a6b2 Docker多容器部署LNMP环境]
 
[http://hugoren.iteye.com/blog/2208740 Docker多容器配合实现开发环境(nginx、php、memcached、mysql)]
 
 
[https://severalnines.com/blog/mysql-docker-building-container-image MySQL on Docker: Building the Container Image ]
 
[https://coding.net/u/twang2218/p/docker-lnmp?public=true docker lnmp]
 
[https://blog.rj-bai.com/post/138.html  docker 奔跑 LNMP 运行环境]
 
[https://learnku.com/articles/31344?tdsourcetag=s_pcqq_aiomsg  避坑!用 Docker 搞定 PHP 开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode) ]
 
[[category:Container]] [[category:compose]] [[category:ops]]

2021年8月26日 (四) 06:23的最新版本

Docker-Compose install

https://wiki.linuxchina.net/index.php/Alpine#alpine_docker_php 站内参考

Docker nginx

Docker mysql


How to Create a MySql Instance with Docker Compose

php

mkdir docker4php  && cd docker4php
vi Dockerfile
FROM php:7.1-fpm-stretch  
#原来是这个 但是这个就不能apt 如果要和下面对应 要改一下
#FROM php:7.1-fpm-alpine  
Run apt-get update \
&& apt install iputils-ping \
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli

compose

mkdir npm4compose
cd npm4compose
mkdir conf.d php html 
cd conf.d && touch nginx.conf
cd -
cd html && touch index.php && echo "<?php phpinfo(); ?>" >index.php
cd  ..
mv  ~/docker4php/Dockerfile ./php/

[root@localhost npm4compose]# tree
.
|-- conf.d
|   `-- nginx.conf
|-- docker-compose.yml
|-- html
|   `-- index.php
`-- php
    `-- Dockerfile



vi docker-compose.yml

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
     - "80:80"
    depends_on:
     - "php"
    volumes:
     - "${PWD}/conf.d:/etc/nginx/conf.d"   
     - "${PWD}/html:/usr/share/nginx/html"
    networks:
     - d_net
    container_name: "compose-nginx" 
  php:
    build: ./php  #指定build Dockerfile生成镜像
    image: php:7.1-fpm-alpine
    ports:
     - "9000:9000"
    volumes:
     - "$PWD/html:/var/www/html"
    networks:
     -  d_net
    container_name: "compose-php"
  mysql:
    image: mysql:5.7
    ports:
     - "3306:3306"
    environment:
      MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'evan'
      # You can use whatever password you like
      MYSQL_PASSWORD: '123456'
      # Password for root access
      MYSQL_ROOT_PASSWORD: '123456'
    expose:
      # Opens port 3306 on the container
      - '3306'

    networks:
     - d_net
    container_name: "compose-mysql"

networks:
    d_net:
        driver: bridge



vi  conf.d/nginx.conf 

server{
    listen	80;
    server_name	a.com;
    #server_name	localhost;
    location /{
        	root 	/var/www/html;
        	index	index.php index.html index.htm;
    }
    error_page	 500 502 503 504 /50x.html;
    location = /50x.html {
        	root	/var/www/html;
    }
    location ~ \.php$ {
        include 	fastcgi_params;
        fastcgi_pass	php:9000;
        fastcgi_index	index.php;
        fastcgi_param	SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
    }
    
}


docker-compose  up -d

php连接mysql

测试检查

[root@work2 npm4compose]# docker-compose  ps 
    Name                   Command              State                 Ports              
-----------------------------------------------------------------------------------------
compose-mysql   docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp, 33060/tcp
compose-nginx   nginx -g daemon off;            Up      0.0.0.0:80->80/tcp               
compose-php     docker-php-entrypoint php-fpm   Up      0.0.0.0:9000->9000/tcp  


docker ps 
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                               NAMES
0e2e7b200b47        nginx:latest         "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp                  compose-nginx
b0990f13ddd2        mysql:5.7            "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   compose-mysql
e0ff739663a9        php:7.1-fpm-alpine   "docker-php-entrypoi…"   5 minutes ago       Up 5 minutes        0.0.0.0:9000->9000/tcp              compose-php



http://192.168.88.22/index.php

dns  

cat  /etc/hosts
192.168.88.22  a.com


mysql暂时不用这个

docker pull mysql:8.0

How to Create a MySql Instance with Docker Compose

trouble

 docker-compose up -d
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.php.networks contains {"d_net": null}, which is an invalid type, it should be a string

  networks:
     - d_net :  :不能要




[root@localhost npm4compose]# cat  php/Dockerfile
FROM php:7.1-fpm-alpine
Run apt-get update \
&& apt install iputils-ping \
&& docker-php-ext-install mysqli && docker-php-ext-enable mysqli
这个alpine 他居然安装软件是apt  我去 这么搞笑

nginx:
    image: nginx:lastest
    ports:
这些单词 拼写 我去 ,



定义网络叫app_net 写在应用又写了d_net 


		container_name: "compose-php"
	mysql:
		image: mysql:8.0
		ports:
			- "3306:3306"
		environment:
			- MYSQL_ROOT_PASSWORD={your_passwd}
		networks:
			- d_net
		container_name: "compose-mysql"
networks: 			#配置docker 网络
	app_net:
		driver: bridge

2020年 11月 15日 星期日 13:34:00 CST给phper

https://github.com/evan886/docker-compose-lnmp

有空要结合我上面的 再搞好一些

docker-compose搭建lnmp运营环境

避坑!用 Docker 搞定 PHP 开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

docker部署MySQL+PHP-FPM+Nginx服务

https://github.com/yansongda/docker-compose-LNMP

【docker】 linux 下 使用docker搭建 lNMP

see also

基于Dockerfile构建LNMP(good-php扩展php7+mysql+nginx


docker-compose部署LNMP环境 Nginx(Openresty)、MySQL5.7、PHP7.2(5.6)、Redis5.0、PHPMyAdmin、Xdebug

Nginx 1.15.X Linux Debian/Ubuntu 源码编译安装 LNMP之Nginx

Linux安装优化配置LNMP LEMP

MySQL 5.6 Linux Debian/Ubuntu源码编译安装 LNMP之MySQL


在 Debian 上源码编译和安装 Nginx+PHP+FastCGI+MySQL

good_testmysql-docker-compose搭建nginx+php+mysql

从零开始学习Docker - 搭建 nginx+mysql+php 环境

使用Docker-Compose搭建nginx+php+mysql基础应用

https://github.com/kkmike999/docker-compose-php-nginx-mysql/blob/master/docker-compose.yml

dockerfile构建nginx并结合php

compose install more PHP extensions

使用docker-composer创建一个mysql容器,并创建一个database且指定其编码集为中文utf8

Docker docker-compose 配置Nginx+Php+Mysql开发环境

docker-compose搭建 Nginx+PHP+MySQL 环境



Docker多容器部署LNMP环境

从零开始学习Docker - 搭建 nginx+mysql+php 环境

从零构建一个基于Docker的Laravel应用


docker-compose 部署 nginx + php-fpm + mysql + phpmyadmin


docker-compose php + nginx + mysql


使用Docker快速搭建Nginx+PHP-FPM环境

参考

Docke搭建Nginx+php-fpm+https

使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境

docker-compose一键部署LNMP环境(Nginx+MySQL+PHP)

再谈docker搭建nginx+php+mysql开发环境

Docker部署LNMP完整教程

https://github.com/nanoninja/docker-nginx-php-mysql

addcn/docker-lnmp

Docker快速搭建一套PHP、Nginx、MySQL、Redis、Xdebug、Memcached 开发环境并演进


docker搭建php,nginx,mysql环境

通过 Dockerfile构建 mysql

Docker多容器部署LNMP环境

Docker多容器配合实现开发环境(nginx、php、memcached、mysql)


MySQL on Docker: Building the Container Image

docker lnmp

docker 奔跑 LNMP 运行环境

避坑!用 Docker 搞定 PHP 开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)