儿童摄影网站怎么做,中国最好的编程学校,互动网络平台,佛山网站建设公司有哪文章目录 摘要一、环境准备1、docker安装2、docker-compose安装 二、镜像制作2.1、编写Dockerfile文件2.1.1、熟悉常用Dockerfile命令2.1.2、制作php镜像案例 2.2、build镜像 三、docker-compose管理容器3.1、编写docker-compose.ymal配置文件3.2、编写systemctl配置 摘要
由于… 文章目录 摘要一、环境准备1、docker安装2、docker-compose安装 二、镜像制作2.1、编写Dockerfile文件2.1.1、熟悉常用Dockerfile命令2.1.2、制作php镜像案例 2.2、build镜像 三、docker-compose管理容器3.1、编写docker-compose.ymal配置文件3.2、编写systemctl配置 摘要
由于项目服务器要从centos 6升级到centos 7但是在升级过程中发现web项目的php在加载自行编写的C扩展时运行在centos 7总是崩溃但是直接改C扩展预计要花比较长的时间可能会延误服务器升级遂计划基于centos 6将php构造成docker 镜像来运行。正所谓当翻越山峰耗时那么绕过去不失为一个办法最终目的都是抵达终点。 于是有了本篇文章从docker安装、镜像构建到docker-compose管理容器最后基于systemctl管理docker-compose异常重启。
一、环境准备
1、docker安装
1yum安装 yum install -y yum-utils vim // 安装基础工具yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //添加软件源信息yum -y install docker-cesystemctl enable docker --now //启动docker并设置为开机自启
2二进制安装推荐更加灵活
下载安装
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.21.tgz
tar -zxvf docker-20.10.21.tgz
mkdir -p /usr/local/docker-20.10.21
mv docker/* /usr/local/docker-20.10.21
创建软连接
ln -sv /usr/local/docker-20.10.21/* /usr/bin/创建docker组docker启动需要
groupadd -r dockersystemctl配置
[rootali ~]# cat /usr/lib/systemd/system/docker.service
[Unit]
DescriptionDocker Application Container Engine
Documentationhttps://docs.docker.com
Afternetwork-online.target firewalld.service
Wantsnetwork-online.target[Service]
Typenotify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart/usr/bin/dockerd --config-file/etc/docker/daemon.json
ExecReload/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILEinfinity
LimitNPROCinfinity
LimitCOREinfinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMaxinfinity
TimeoutStartSec0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegateyes
# kill only the docker process, not all processes in the cgroup
KillModeprocess
# restart the docker process if it exits prematurely
Restarton-failure
RestartSec3s
StartLimitBurst3
StartLimitInterval60s[Install]
WantedBymulti-user.target
docker配置
[rootali ~]# cat /etc/docker/daemon.json
{data-root: /home/docker/data-root,pidfile: /home/docker/run/docker.pid,log-level: info,registry-mirrors: [http://hub-mirror.c.163.com,https://registry.docker-cn.com] #docker镜像源
}开机自启动
systemctl enable docker --now启动
systemctl restart dockerdocker配置相关 docker命令
2、docker-compose安装 docker-compose 是用于定义和运行多容器 Docker 应用程序的工具,通过一个配置文件来管理多个Docker容器在配置文件中所有的容器通过services来定义然后使用docker-compose脚本来启动停止和重启应用和应用中的服务以及所有依赖服务的容器非常适合组合使用多个容器进行开发的场景。这样就可以替代复杂的shell脚本来管理多个容器。 二进制文件获取
linux下载
curl -L https://github.com/docker/compose/releases/download/2.14.2/docker-compose-uname -s-uname -m -o /usr/bin/docker-compose
二、镜像制作
2.1、编写Dockerfile文件
指令说明
2.1.1、熟悉常用Dockerfile命令 FROM #基础镜像我们要制作的镜像常常是依赖某个基础镜像来实现的这些基础镜像常见的如centos,ubatu,alpine,harbox,debian等其中alpine很小安全。 这些镜像到docker官方仓库搜索即可选择相应的版本如FROM centos:6.6 。 COPY #从上下文目录中复制文件或者目录到容器里指定路径。如COPY ./package/usr/lib64/phpmath.so /usr/lib64/phpmath.so。 RUN #用于在基础镜像中执行后面跟着的命令行命令。如RUN mkdir -p /usr/local/php/ 。 CMD #类似于 RUN 指令用于运行程序但二者运行的时间点不同1CMD 在docker run 时运行2RUN 是在 docker build。如果有多条仅最后一条生效。该指令所启动的程序即容器的主进程其退出容器也会退出所以该指令的命令应当是常驻进程。
2.1.2、制作php镜像案例
FROM centos:6.6COPY ./package/usr/lib64/phpmath.so /usr/lib64/phpmath.so
COPY ./package/usr/lib64/libserialize.so /usr/lib64/libserialize.so
COPY ./package/usr/lib64/protocolbuffers.so /usr/lib64/protocolbuffers.so
COPY ./package/usr/lib64/redis.so /usr/lib64/redis.so
COPY ./package/usr/lib64/mysqli.so /usr/lib64/mysqli.soCOPY ./package/php5 /usr/local/
COPY ./dockerphp5/usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.confRUN mkdir -p /home/php/fpm/ #fpm 日志目录RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
COPY ./dockerphp5/etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN yum clean all yum makecache
RUN yum -y install vixie-cron
RUN yum -y install crontabs#一些定时脚本
COPY ./dockerphp5/etc/crontab /etc/crontab
RUN mkdir -p /etc/cron.minutely/
COPY ./dockerphp5/etc/cron.minutely/* /etc/cron.minutely/
RUN mkdir -p /etc/cron.hourly/
COPY ./dockerphp5/etc/cron.hourly/* /etc/cron.hourly/
RUN mkdir -p /etc/cron.daily/
COPY ./dockerphp5/etc/cron.daily/* /etc/cron.daily/EXPOSE 9000CMD [/usr/bin/phpfpmd.sh] #/usr/bin/phpfpmd.sh有多条命令仅最后一条是常驻的
[rootali ~]# cat /usr/bin/phpfpmd.sh
#!bin/bash
/etc/init.d/crond restart
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf -g /usr/local/php/var/run/php-fpm.pid
2.2、build镜像
docker build -t php:5.4.7 -f ./dockerphp5/Dockerfile . #其中-t指定镜像名称和tag(版本)如果顺利执行完就可以看到镜像了
[rootali ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 5.4.7 360997ecc130 3 weeks ago 852MB
centos 6.6 368c96d786ae 3 years ago 203MB
三、docker-compose管理容器
3.1、编写docker-compose.ymal配置文件
指令说明
version: 3
services:php5: image: php:5.4.7 #指定镜像ports:- 127.0.0.1:9000:9000volumes: #指定目录挂载- /usr/local/web:/usr/local/web #项目代码目录- /home/web:/home/web #项目日志等目录 - /etc/docker/cron.minutely:/etc/cron.minutely- /etc/docker/cron.hourly:/etc/cron.hourly- /etc/docker/cron.daily:/etc/cron.daily- /etc/localtime:/etc/localtime #时间与宿主机一致extra_hosts: #向容器/etc/hosts添加域名- redis.link.cn:200.200.172.106- mysql.link.cn:200.200.172.108container_name: phpfpmd #容器名称
此时可以通过/usr/bin/docker-compose -f /etc/docker/docker-compose.yml up 来启动容器了相比较docker run -itd -p 9000:9000 -v xxx:xxx --add-host xxx:xxx --name phpfpmd php:5.4.7 简洁多了特别是容器多的时候但是无法解决开机自启动没有看门狗的问题这个可以利用systemctl来解决
3.2、编写systemctl配置 指令说明
[Unit]
Descriptionphp-fpm
#Documentationnothing
Afternetwork-online.target docker.service
Wantsnetwork-online.target
Requiresdocker.service [Service]
#service type
Typesimple #服务类型1simple默认值ExecStart字段启动的进程为主进程 2forkingExecStart字段将以fork()方式启动此时父进程将会退出子进程将成为主进程#3oneshot类似于simple但只执行一次Systemd 会等它执行完才启动其他服务 4dbus类似于simple但会等待 D-Bus 信号后启动#5notify类似于simple启动结束后会发出通知信号然后 Systemd 再启动其他服务fixme:这种需要启动程序实现sd_notify 6idle类似于simple但是要等到其他任务都执行完才会启动该服务。一种使用场合是为让该服务的输出不与其他服务的输出相混合# for php-fpm container control,
ExecStart/usr/bin/docker-compose -f /etc/docker/docker-compose.yml up
#ExecReload
ExecStop/usr/bin/docker-compose -f /etc/docker/docker-compose.yml stop# kill only the docker process, only exec ExecStop
KillModenone
# softdog :restart the php-fpm process if it exit
Restarton-failure #异常时会重启
RestartSec3s #每3s检查一次
StartLimitBurst3
StartLimitInterval60s [Install]
WantedBymulti-user.target
编写完成放到/usr/lib/systemd/system/目录下即/usr/lib/systemd/system/phpfpmd.service
刷新
systemctl daemon-reload开启自启动
systemctl enable phpfpmd启动容器
systemctl restart phpfpmd至此一个完整的docker容器就完成了