当前位置: 首页 > news >正文

从0-1的docker镜像服务构建

文章目录

    • 摘要
    • 一、环境准备
        • 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安装

1)yum安装

 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)二进制安装(推荐,更加灵活)

  1. 下载安装
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
  1. 创建软连接
ln -sv /usr/local/docker-20.10.21/* /usr/bin/
  1. 创建docker组,docker启动需要
groupadd -r docker
  1. systemctl配置
[root@ali ~]# cat /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
# 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.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
RestartSec=3s
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
  1. docker配置
[root@ali ~]# 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镜像源
}
  1. 开机自启动
systemctl enable docker --now
  1. 启动
systemctl restart docker

docker配置相关
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 指令,用于运行程序,但二者运行的时间点不同:1)CMD 在docker run 时运行;2)RUN 是在 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有多条命令,仅最后一条是常驻的
[root@ali ~]# 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(版本)

如果顺利执行完,就可以看到镜像了

[root@ali ~]# 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:9000"volumes:                                           #指定目录挂载- "/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.108"container_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]
Description=php-fpm
#Documentation=nothing
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service  [Service]
#service type
Type=simple          #服务类型,1)simple(默认值):ExecStart字段启动的进程为主进程 2)forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程#3)oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务 4)dbus:类似于simple,但会等待 D-Bus 信号后启动#5)notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务,fixme:这种需要启动程序实现sd_notify 6)idle:类似于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
KillMode=none
# softdog :restart the php-fpm process if it exit
Restart=on-failure  #异常时会重启
RestartSec=3s       #每3s检查一次
StartLimitBurst=3
StartLimitInterval=60s   [Install]
WantedBy=multi-user.target

编写完成放到/usr/lib/systemd/system/目录下,即/usr/lib/systemd/system/phpfpmd.service

  1. 刷新
systemctl daemon-reload
  1. 开启自启动
systemctl enable phpfpmd
  1. 启动容器
systemctl restart phpfpmd

至此一个完整的docker容器就完成了

相关文章:

从0-1的docker镜像服务构建

文章目录 摘要一、环境准备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配置 摘要 由于…...

RabbitMQ、Kafka、RocketMQ:特点和适用场景对比

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 「java、python面试题」…...

【实战】十一、看板页面及任务组页面开发(四) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十六)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

解决docker无法执行定时任务问题

背景 在docker里面想创建定时任务,但是发现时间到了并没有执行,第一时间想到应该是没有开启crond服务,然后执行systemctl status crond.service报错如下所示: System has not been booted with systemd as init system (PID 1).…...

【FreeRTOS】【STM32】中断详细介绍

文章目录 一、三种优先级的概念辨析1. 先理清楚两个概念:CPU 和 MPU2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系3. 优先级的概念辨析① Cortex-M3 内核和 STM32F1XX 的中断优先级② FreeRTOS 的任务的优先级 二、 Cortex-M3 内核的中断优先级1. 中断编号2. 优先…...

stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

单片机型号STM32F103R6: 最后实现的效果是,开机后PC内要求输入1或0,输入1则打开灯泡,输入0则关闭灯泡,输入其他内容则显示错误,值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是1…...

计算机毕设 基于机器学习与大数据的糖尿病预测

文章目录 1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重新进行…...

【数据结构】——查找、散列表的相关习题

目录 一、选择填空判断题题型一(顺序、二分查找的概念)题型二(分块查找的概念)题型三(关键字比较次数) 二、应用题题型一(二分查找判定树) 一、选择填空判断题 题型一(顺…...

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…...

PostgreSQL系统概述

目录 写在前面 1.简介 1.1何为关系型数据库 1.2何为对象型数据库 2.特性 3.代码结构 3.1数据库集簇 3.2Parser查询分析流程 3.3内部查询树组成部分 3.3.1目标列表 3.4Optimizer查询优化流程 3.4.1查询计划 3.5非计划查询的SQL命令 写在前面 如有错误请指正&#xf…...

掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」

文章目录 掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」一、指南原则1: 使用明确和具体的指令原则2: 给模型思考的时间 二、迭代三、总结与提取四、局限与改善五、总结 掌握AI助手的魔法工具:解密Prompt&#x…...

git svn:使用 git 命令来管理 svn 仓库

git-svn 使用教程 参考以下: https://cloud.tencent.com/developer/article/1415892 # 在SVN仓库上使用Git 源 https://blog.csdn.net/jiejie11080/article/details/106917116 # git svn clone速度慢的解决办法 http://blog.chinaunix.net/uid-11639156-id-30774…...

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现

软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术...

GeoHash之存储篇

前言: 在上一篇文章GeoHash——滴滴打车如何找出方圆一千米内的乘客主要介绍了GeoHash的应用是如何的,本篇文章我想要带大家探索一下使用什么样的数据结构去存储这些Base32编码的经纬度能够节省内存并且提高查询的效率。 前缀树、跳表介绍: …...

后端项目开发:集成接口文档(swagger-ui)

swagger集成文档具有功能丰富、及时更新、整合简单&#xff0c;内嵌于应用的特点。 由于后台管理和前台接口均需要接口文档&#xff0c;所以在工具包构建BaseSwaggerConfig基类。 1.引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>…...

代码随想录训练营29天|●* 491.递增子序列 * 46.全排列 * 47.全排列 II

class Solution {vector<vector<int>>res;vector<int>vec;void backing(vector<int>& nums,int index){if(vec.size()>2&&is(vec)){res.push_back(vec);}unordered_set<int> uset; // 使用set对本层元素进行去重for(int iindex;i…...

uniapp日期选择组件优化

<uni-forms-item label="出生年月" name="birthDate"><view style="display: flex;flex-direction: row;align-items: center;height: 100%;"><view class="" v-...

AI驱动的大数据创新:探索软件开发中的机会和挑战

文章目录 机会数据驱动的决策自动化和效率提升智能预测和优化个性化体验 挑战数据隐私与安全技术复杂性数据质量和清洗伦理和社会问题 案例&#xff1a;智能代码生成工具总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…...

国产化-银河麒麟V10系统及docker的安装

一、最近在研究国产化操作系统&#xff0c;“银河麒麟V10”&#xff0c; 在我电脑本机vmware 15的虚拟机中进行安装测试&#xff1b; 1.点击这里提交产品试用申请&#xff0c;不过只需要随便输入&#xff0c;手机号验证码验证后方可跳转至下载地址产品试用申请国产操作系统、银…...

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…...

CircuitPython硬件编程在Linux单板机上的实现:以ODROID C2为例

1. 项目概述&#xff1a;当CircuitPython遇见Linux单板机如果你玩过树莓派Pico或者Adafruit的Feather开发板&#xff0c;肯定对CircuitPython不陌生。它让Python跑在了微控制器上&#xff0c;用几行代码就能点亮LED、读取传感器&#xff0c;对硬件新手和快速原型开发来说&#…...

基于Arduino HID与红外解码的遥控键鼠系统设计与实现

1. 项目概述如果你曾经想过&#xff0c;能不能用一个电视遥控器来控制电脑的鼠标光标&#xff0c;或者快速触发一些键盘快捷键&#xff0c;那么这个项目就是为你准备的。我最近基于Arduino平台&#xff0c;成功搭建了一个红外遥控鼠标和键盘系统&#xff0c;它不仅能让你在沙发…...

终极指南:使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件

终极指南&#xff1a;使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli XNB文件是星露谷物语等XNA游戏引擎使用…...

700MHz 5G网络DTMB干扰实战:从测量到规避的完整解决方案

1. 项目概述&#xff1a;直面700MHz网络中的DTMB干扰挑战在5G网络的深度覆盖战役中&#xff0c;700MHz频段因其卓越的穿透能力和广阔的覆盖范围&#xff0c;被寄予厚望&#xff0c;成为解决偏远地区和室内深度覆盖难题的“黄金频段”。然而&#xff0c;理想很丰满&#xff0c;现…...

基于Code Llama的本地AI编程助手:VSCode插件部署与优化实战

1. 项目概述&#xff1a;为什么我们需要一个更聪明的代码助手&#xff1f;在VSCode的插件市场里搜索“AI代码补全”&#xff0c;结果可能会让你眼花缭乱。从基于GPT的Copilot到各种开源模型驱动的工具&#xff0c;选择很多&#xff0c;但痛点也很明显&#xff1a;要么需要稳定的…...

微软UFO项目:统一AI模型调用的抽象层设计与工程实践

1. 项目概述&#xff1a;当“统一”成为AI开发的新范式最近在折腾大模型应用开发的朋友&#xff0c;可能都绕不开一个痛点&#xff1a;模型太多&#xff0c;工具链太杂。想用闭源的GPT-4处理文本&#xff0c;用开源的Llama搞本地推理&#xff0c;再用DALL-E 3生成图片&#xff…...

纯文本CRM:用Markdown与Git构建极简客户关系管理系统

1. 项目概述与核心价值最近在开源社区里&#xff0c;我注意到一个名为anthroos/plaintext-crm的项目&#xff0c;它提出了一种非常规的客户关系管理&#xff08;CRM&#xff09;思路。简单来说&#xff0c;这个项目主张用纯文本文件&#xff08;如 Markdown、TXT&#xff09;来…...

对比直接使用原厂 API 体验 Taotoken 在模型选型上的便捷性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用原厂 API 体验 Taotoken 在模型选型上的便捷性 当开发者需要评估不同大模型的能力以适配具体项目时&#xff0c;通常会…...

Python异步编程中的上下文管理:Ctxo工具的设计原理与实战应用

1. 项目概述&#xff1a;一个轻量级、高可用的上下文管理工具最近在折腾一个需要处理大量异步任务和复杂状态流转的后台服务&#xff0c;遇到了一个老生常谈但又很棘手的问题&#xff1a;如何在不同的函数调用、异步协程之间&#xff0c;安全、高效地传递和共享一些“上下文”信…...

AI LED调光驱动电源智能功率 MOSFET 完整选型方案

随着 AI 技术在智能照明系统中的深度渗透&#xff08;如自适应调光、场景联动、色温调节&#xff09;&#xff0c;LED驱动电源对功率 MOSFET 提出更高要求&#xff1a;高效率、高精度PWM响应、高可靠性及小型化。微碧半导体&#xff08;VBsemi&#xff09;基于先进的 Trench 工…...