php发展

首页 » 常识 » 常识 » Docker实践五生产环境容器化
TUhjnbcbe - 2021/6/14 17:21:00
前言

最近花了将近一个月的时间研究了Docker在生产环境中的使用,作为新手,期间走了无数的弯路,这里纪录一下,希望给别人带来微小的帮助。

前面几部分,介绍了在搭建集群之前需要做的一些工作,后面集群实践一块结合实际应用,介绍如何架构docker集群。

修改存储目录

生产环境中,镜像多了之后很容易把硬盘写满造成服务器宕机,所以需要挂载一块较大的硬盘,修改docker的默认存储路径,下面提供两种方案。

方案一:软连接

servicedockerstopmv/var/lib/docker/mnt/sdc/dockerln-s/mnt/sdc/docker/var/lib/docker

方案二:修改配置

配置deamon启动时-g参数,可以直接改变存储路径。

Ubuntu系统需要先修改/lib/systemd/system/docker.service文件:

...[Service]ExecStart=/usr/bin/docker-d$DOCKER_OPTS...EnvironmentFile=-/etc/default/docker...

其中ExecStart就是deamon的启动命令,可以直接在后面加参数,也可以选择上述EnvironmentFile配置,然后将启动参数写到/etc/default/docker文件中:

DOCKER_OPTS="-g/mnt/sdc/docker"

配置好之后,执行下面命令重新加载配置文件:

systemctldaemon-reloadsystemctlrestartdocker

参考:HowdoIchangetheDockerimageinstallationdirectory?

InsecureRegistry

生产环境中部署docker,需要在搭建一个私有registry:

dockerrun-d-p:--restart=always--nameregistryregistry:2

启动之后,没法直接进行镜像的push/pull,因为默认要求配置TLS。

为了图方便,可以暂时把私有的registry加入为insecure-registry进行测试。

insecure-registry也是通过添加deamon的启动参数实现的,可在/etc/default/docker中配置:

DOCKER_OPTS="--insecure-registry..1.19:"

然后重启即可。

参考:DeployingaplainHTTPregistry

集群方案

docker集群部署目前有两种方案,一般称作一代swarm和二代swarm。

一代swarm

官方文档。

一代swarm是以容器的方式进行集群管理的,需要在每个节点上运行一个swarm容器,便可进行集群管理,简单部署测试可参考:在ubuntu上使用swarm搭建docker集群。

需要注意的是,一代swarm还需要自己手动运行k/v服务容器,参考,运行起来之后可能会遇到报错:

Errorresponsefromdaemon:datastoreforscope"global"isnotinitialized

这其实是deamon没有配置cluster-advertise和cluster-store所致,需要在/etc/default/docker中配置这两项,具体可参考Nodesdiscovery。

二代swarm

官方文档。

二代swarm直接将swarm模式集成在docker里面,只需要简单的配置即可,参考:Createaswarm。

界面方案

在之前的文章中,介绍过ui-for-docker作为管理的web界面,但是过于简陋,后来有找到一个基于ui-for-docker实现的portainer,支持swarmmode,使用起来非常方便,也可以根据自己的需求修改。

集群实践

实践过程中我分别尝试了一代swarm和二代swarm。

版本配置过程管理扩容一代1.配置k/vstore。2.宿主机dockerdeamon监听某个端口。3.在每台宿主机上运行swarm容器。在任何一个节点都可以进行集群的管理手动扩容二代1.managerinitswarmmode2.workerjoin只能在manager节点进行管理自动扩容

目前实现了把Segmentfault的web服务迁移到容器中,简单的说就是一个nginx+php的环境,以下是具体步骤:

使用二代swarm。

创建一个overlay网络。

创建nginx服务。

创建php及web代码服务。

需要明确的几点:

二代swarm在同一个网络下服务可以通过服务名发现其他服务。

二代swarm部署之后,将会监听每个节点上publish的端口,收到的请求会负载均衡到所有的tasks中。

nginx

nginx服务只需选择官方提供的镜像,建议使用最轻量的nginx:alpine版本,自定义配置文件覆盖原生的即可。

php

镜像直接基于官方发布的php版本版本创建。

注意:ubuntu宿主机尽量使用Debian版本的基础镜像,其他的可能会遇到各种坑。

我在开始为了追求镜像尽量小,使用了基于alpine的基础镜像,遇到了以下问题:

7.1.0RC5-fpm-alpine版本,使用session_set_save_handler修改session的saveheader为memached之后没法写入session,换成了7.0.12-alpine就好了。

web代码对mount到容器中的

1
查看完整版本: Docker实践五生产环境容器化