在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:docker-lnmp开源软件地址:https://gitee.com/kingofhua/docker-lnmp开源软件介绍:LNMP - Docker 多容器间协作互连说明这是一个 Docker 多容器间协作互连的例子。使用的是最常见的 LNMP 的技术栈,既 在这个例子中,我使用的是 Docker Compose,这样比较简洁,如果使用 服务在 services: nginx: image: "${DOCKER_USER}/lnmp-nginx:v1.2" build: context: . dockerfile: Dockerfile.nginx ... php: image: "${DOCKER_USER}/lnmp-php:v1.2" build: context: . dockerfile: Dockerfile.php ... mysql: image: mysql:5.7 ... 其中 这里的镜像名看起来也有些不同: image: "${DOCKER_USER}/lnmp-nginx:v1.2" 其中的 DOCKER_USER=twang2218 每次执行 初次之外,还可以明确指定环境变量文件。具体的配置请查看 镜像mysql 服务镜像
mysql: image: mysql:5.7 ... environment: TZ: 'Asia/Shanghai' MYSQL_ROOT_PASSWORD: Passw0rd command: ['mysqld', '--character-set-server=utf8'] ... 在这个例子中, 并且,我重新指定了启动容器的命令,在 nginx 服务镜像
FROM nginx:1.11ENV TZ=Asia/ShanghaiCOPY ./nginx.conf /etc/nginx/conf.d/default.confCOPY ./site /usr/share/nginx/html 镜像定制很简单,就是指定时区后,将配置文件、网站页面目录复制到指定位置。 php 服务镜像
对应的 FROM php:7-fpmENV TZ=Asia/ShanghaiCOPY sources.list /etc/apt/sources.listRUN set -xe \ && echo "构建依赖" \ && buildDeps=" \ build-essential \ php5-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng12-dev \ " \ && echo "运行依赖" \ && runtimeDeps=" \ libfreetype6 \ libjpeg62-turbo \ libmcrypt4 \ libpng12-0 \ " \ && echo "安装 php 以及编译构建组件所需包" \ && apt-get update \ && apt-get install -y ${runtimeDeps} ${buildDeps} --no-install-recommends \ && echo "编译安装 php 组件" \ && docker-php-ext-install iconv mcrypt mysqli pdo pdo_mysql zip \ && docker-php-ext-configure gd \ --with-freetype-dir=/usr/include/ \ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ && echo "清理" \ && apt-get purge -y --auto-remove \ -o APT::AutoRemove::RecommendsImportant=false \ -o APT::AutoRemove::SuggestsImportant=false \ $buildDeps \ && rm -rf /var/cache/apt/* \ && rm -rf /var/lib/apt/lists/*COPY ./php.conf /usr/local/etc/php/conf.d/php.confCOPY ./site /usr/share/nginx/html 前面几行很简单,指定了基础镜像为 初学 Docker,不少人会误以为 这一层的目的是安装、构建 PHP 插件,因此真正所需要的是构建好的插件、以及插件运行所需要的依赖库,其它任何多余的文件都不应该存在。所以,在这里可以看到,依赖部分划分为了“构建依赖”以及“运行依赖”,这样在安装后,可以把不再需要的“构建依赖”删除掉,避免因为构建而导致这层多了一些不需要的文件。 这里使用的是官方 更多关于如何定制镜像的信息可以从 Docker Hub 官方镜像的文档中看到:https://hub.docker.com/_/mysql/ 最后的清理过程中,可以看到除了清除“构建依赖”、以及相关无用软件外,还彻底清空了 在 网络在这个例子中,演示了如何使用自定义网络,并利用服务名通讯。 首先,在 networks: frontend: backend: 每个自定义网络都可以配置很多东西,包括网络所使用的驱动、网络地址范围等设置。但是,你可能会注意到这里 然后,在前面 services: nginx: ... networks: - frontend php: ... networks: - frontend - backend mysql: ... networks: - backend 在这个例子中,
连接到同一个网络的容器,可以进行互连;而不同网络的容器则会被隔离。所以在这个例子中, 处于同一网络的容器,可以使用服务名访问对方。比如,在这个例子中的 <?php// 建立连接$conn = mysqli_connect("mysql", "root", $_ENV["MYSQL_PASSWORD"]);...?> 可以注意到,在这段数据库连接的代码里,数据库密码是通过环境变量, version: '2'services:... php:... environment: MYSQL_PASSWORD: Passw0rd... 关于 Docker 自定义网络,可以看一下官方文档的介绍:https://docs.docker.com/engine/userguide/networking/dockernetworks/#/user-defined-networks 关于在 Docker Compose 中使用自定义网络的部分,可以看官方这部分文档:https://docs.docker.com/compose/networking/ 存储在这三个服务中, volumes: mysql-data: 在 在 mysql: image: mysql:5.7 volumes: - mysql-data:/var/lib/mysql... 依赖服务的启动顺序有时候比较关键,Compose 在这里可以提供一定程度的启动控制。比如这个例子中,我是用了依赖关系 services: nginx: ... depends_on: - php php: ... depends_on: - mysql mysql: ... 在这里, 在 需要注意的是,这里的启动顺序的控制是有限度的,并非彻底等到所依赖的服务可以工作后,才会启动下一个服务。而是确定容器启动后,则开始启动下一个服务。因此,这里的顺序控制可能依旧会导致某项服务启动时,它所依赖的服务并未准备好。比如 如果需要应用级别的服务依赖等待,需要在 单机操作启动docker-compose up -d 如果构建过程中,发现镜像下载极为缓慢、甚至失败。这是伟大的墙在捣乱。你需要去配置加速器,具体文章可以参看我的 Docker 问答录。 如果修改了配置文件,可能需要明确重新构建,可以使用命令 查看服务状态docker-compose ps 查看服务日志docker-compose logs 访问服务
如果访问后,看到了 停止服务docker-compose down Swarm 集群编排在单机环境中使用容器,可能经常会用到绑定宿主目录的情况,这在开发时很方便。但是在集群环境中部署应用的时候,挂载宿主目录就变得非常不方便了。 在集群环境中,Swarm 可能会调度容器运行于任何一台主机上,如果一个主机失败后,可能还会再次调度到别的主机上,确保服务可以继续。在这种情况下,如果使用绑定宿主目录的形式,就必须同时在所有主机上的相同位置,事先准备好其内容,并且要保持同步。这并不是一个好的解决方案。 因此为了在集群环境中部署方便,比较好的做法是,将应用代码、配置文件等直接放入镜像。就如同这个例子中我们看到的
...COPY ./nginx.conf /etc/nginx/conf.d/default.confCOPY ./site /usr/share/nginx/html
...COPY ./php.conf /usr/local/etc/php/conf.d/php.confCOPY ./site /usr/share/nginx/html Docker Swarm 目前分为两代。第一代是以容器形式运行,被称为 Docker Swarm;而第二代是自 一代 Swarm一代 Swarm 是 Docker 团队最早的集群编排的尝试,以容器形式运行,需要外置键值库(如 etcd, consul, zookeeper),需要手动配置 这里提供了一个脚本, 建立 swarm 集群在安装有 ./run1.sh create 启动./run1.sh up 横向扩展./run1.sh scale 3 5 这里第一个参数是 nginx 容器的数量,第二个参数是 php 容器的数量。 访问服务
$ eval $(./run1.sh env)$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd85a2c26dd7d twang2218/lnmp-php:v1.2 "php-fpm" 9 minutes ago Up 9 minutes 9000/tcp node1/dockerlnmp_php_5c81e169c164d twang2218/lnmp-php:v1.2 "php-fpm" 9 minutes ago Up 9 minutes 9000/tcp node1/dockerlnmp_php_2b43de77c9340 twang2218/lnmp-php:v1.2 "php-fpm" 9 minutes ago Up 9 minutes 9000/tcp master/dockerlnmp_php_4fdcb718b6183 twang2218/lnmp-php:v1.2 "php-fpm" 9 minutes ago Up 9 minutes 9000/tcp node3/dockerlnmp_php_3764b10b17dc4 twang2218/lnmp-nginx:v1.2 "nginx -g 'daemon off" 9 minutes ago Up 9 minutes 192.168.99.104:80->80/tcp, 443/tcp master/dockerlnmp_nginx_3e92b34f998bf twang2218/lnmp-nginx:v1.2 "nginx -g 'daemon off" 9 minutes ago Up 9 minutes 192.168.99.106:80->80/tcp, 443/tcp node2/dockerlnmp_nginx_2077ee73c8148 twang2218/lnmp-nginx:v1.2 "nginx -g 'daemon off" 22 minutes ago Up 22 minutes 192.168.99.105:80->80/tcp, 443/tcp node3/dockerlnmp_nginx_11931249a66c1 e8920543aee8 "php-fpm" 22 minutes ago Up 22 minutes 9000/tcp node2/dockerlnmp_php_1cf71bca309dd mysql:5.7 "docker-entrypoint.sh" 22 minutes ago Up 22 minutes 3306/tcp node1/dockerlnmp_mysql_1 如这种情况,就可以使用 http://192.168.99.104, http://192.168.99.105, http://192.168.99.106 来访问服务。 停止服务./run1.sh down 销毁集群./run1.sh remove 二代 Swarm (Swarm Mode)二代 Swarm,既 Docker Swarm Mode,是自 1.12 之后引入的原生的 Docker 集群编排机制。吸取一代 Swarm 的问题,大幅改变了架构,并且大大简化了集群构建。内置了分布式数据库,不在需要配置外置键值库;内置了内核级负载均衡;内置了边界负载均衡。 和一代 Swarm 的例子一样,为了方便说明,这里提供了一个 建立 swarm 集群在安装有 ./run2.sh create 使用 Digital Ocean, AWS之类的云服务的话,就没必要本地使用 VirtualBox,不过需要事先配置好对应的 启动./run2.sh up 横向扩展./run2.sh scale 10 5 这里第一个参数是 nginx 容器的数量,第二个参数是 php 容器的数量。 列出服务状态我们可以使用标准的命令列出所有服务以及状态: $ docker service lsID NAME REPLICAS IMAGE COMMAND2lnqjas6rov4 mysql 1/1 mysql:5.7 mysqld --character-set-server=utf8ahqktnscjlkl php 5/5 twang2218/lnmp-php:v1.2bhoodda99ebt nginx 10/10 twang2218/lnmp-nginx:v1.2 我们也可以通过下面的命令列出具体的每个服务对应的每个容器状态: $ ./run2.sh ps+ docker service ps -f desired-state=running nginxID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR87xr5oa577hl9amelznpy7s7z nginx.1 twang2218/lnmp-nginx:v1.2 node2 Running Running 3 hours ago7dwmc22qaftz0xrvijij9dnuw nginx.2 twang2218/lnmp-nginx:v1.2 node3 Running Running 22 minutes ago00rus0xed3y851pcwkbybop80 nginx.3 twang2218/lnmp-nginx:v1.2 manager Running Running 22 minutes ago5ypct2dnfu6ducnokdlk82dne nginx.4 twang2218/lnmp-nginx:v1.2 manager Running Running 22 minutes ago7qshykjq8cqju0zt6yb9dkktq nginx.5 twang2218/lnmp-nginx:v1.2 node2 Running Running 22 minutes agoe2cux4vj2femrb3wc33cvm70n nginx.6 twang2218/lnmp-nginx:v1.2 node1 Running Running 22 minutes ago9uwbn5tm49k7vxesucym4plct nginx.7 twang2218/lnmp-nginx:v1.2 node1 Running Running 22 minutes ago6d8v5asrqwnz03hvm2jh96rq3 nginx.8 twang2218/lnmp-nginx:v1.2 node1 Running Running 22 minutes agoeh44qdsiv7wq8jbwh2sr30ada nginx.9 twang2218/lnmp-nginx:v1.2 node3 Running Running 22 minutes ago51l7nirwtv4gxnzbhkx6juvko nginx.10 twang2218/lnmp-nginx:v1.2 node2 Running Running 22 minutes ago+ docker service ps -f desired-state=running phpID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR4o3pqdva92vjdbfygdn0agp32 php.1 twang2218/lnmp-php:v1.2 manager Running Running 3 hours agobf3d6g4rr8cax4wucu9lixgmh php.2 twang2218/lnmp-php:v1.2 node3 Running Running 22 minutes ago9xq9ozbpea7evllttvyxk7qtf php.3 twang2218/lnmp-php:v1.2 manager Running Running 22 minutes ago8umths3p8rqib0max6b6wiszv php.4 twang2218/lnmp-php:v1.2 node2 Running Running 22 minutes ago0fxe0i1n2sp9nlvfgu4xlc0fx php.5 twang2218/lnmp-php:v1.2 node1 Running Running 22 minutes ago+ docker service ps -f desired-state=running mysqlID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR3ozjwfgwfcq89mu7tqzi1hqeu mysql.1 mysql:5.7 node3 Running Running 3 hours ago 访问服务
通过下面的命令可以列出所有节点,访问其中任意地址都应该可以看到应用页面: $ ./run2.sh nodesmanager http://192.168.99.101node1 http://192.168.99.103node2 http://192.168.99.102node3 http://192.168.99.104 停止服务./run2.sh down 销毁集群./run2.sh remove |
请发表评论