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

news2026/4/2 19:09:12

文章目录

    • 摘要
    • 一、环境准备
        • 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-ce
 systemctl 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.6

COPY ./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.so

COPY ./package/php5 /usr/local/
COPY ./dockerphp5/usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php-fpm.conf

RUN 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 9000

CMD ["/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容器就完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/936935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARP欺骗】嗅探流量、限速、断网操作

【ARP欺骗】 什么是ARP什么是ARP欺骗ARP欺骗实现ARP断网限制网速嗅探流量 什么是ARP ARP(Address Resolution Protocol,地址解析协议)是一个TCP/IP协议,用于根据IP地址获取物理地址。在计算机网络中,当一个主机需要发…

查看windows当前占用的所有端口、根据ipt终止任务进程、OS、operatingSystem

文章目录 查询端口查询指定端口根据进程pid查询进程名称查看所有进程名称根据pid终止任务进程根据进程名称终止任务 查询端口 netstat -ano查询指定端口 netstat -ano | findstr "80"根据进程pid查询进程名称 tasklist | findstr "660"查看所有进程名称 ta…

从哈希表到红黑树:探讨 epoll 是如何管理事件的?

揭开pkill的秘密:在Linux中杀死进程的完整指南 一、引言二、 传统事件管理的局限性三、epoll 概述3.1、epoll 的基本概念和工作原理3.2、epoll 在 Linux 内核中的实现方式 四、哈希表在事件管理中的挑战五、 红黑树在 epoll 中的应用六、epoll 中的事件注册与触发七…

TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?

先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间通信的性质以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS&#xf…

strcpy函数

目录 函数介绍: 函数声明: 具体使用: 情况一: 情况二: 注意事项: 1.源字符必须以 \0结束: 2.目标空间必须足够大,以确保能放源字符串: 3.目标空间必须可变&…

阿里2面:你们部署多少节点?1000W并发,当如何部署?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 1000W并发,需部署多少个节点?如何觉得部署多少…

<八> objectARX开发:动态拖动Jig创建自定义实体

1、介绍 接上一篇文章,在某些情况下,CAD中的实体对象初始参数并不是固定的,我们需要通过jig动态拖动方式来绘制自定义实体,下面就用一个简单的例子来介绍一下自定义实体动态绘制。   实体形状:包括实体夹点和文字夹点拖动实现。 2、效果 3、源码 static void RYMyGrou…

软考:中级软件设计师:无线网,网络接入技术,ipv6

软考:中级软件设计师:无线网 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &#x…

退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法

本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,…

1. import pandas as pd 导入库

【目录】 文章目录 1. import pandas as pd 导入库1. pandas库的概念2. 导入pandas库2.1 常规导入2.2 别名导入 3. 别名的作用4. 课堂练习 【正文】 1. import pandas as pd 导入库 【学习时间】 10分钟 1. pandas库的概念 pandas:熊猫panda的复数, …

基于体素形态学测量分析(VBM)的工具包比较及其在年龄预测中的应用

摘要 基于体素的形态学测量分析(VBM)通常用于灰质体积(GMV)的局部量化。目前存在多种实现VBM的方法。然而,如何比较这些方法及其在应用中的效用(例如对年龄效应的估计)仍不清楚。这会使研究人员疑惑他们应该在其项目中使用哪种VBM工具包。本研究以用户为中心&#…

【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用

**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三…

百万级数据导入导出

导入 引入easyexcel <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>总结有三种导出方式&#xff1a; 单行读取&#xff0c;单行导入。这种方案最简单…

涛然自得周刊(第06期):韩版苏东坡的突围

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后&#xff0c;丁被大自然环境疗愈&#…

自定义温度显示控件(四) — 终结篇

概述 详细讲述自定义温度控件的实现 详细 前言 在之前的文章中&#xff0c;已经讲到了自定义温度显示控件一步步进化的历程&#xff0c;大家有兴趣的话可参考以下文章&#xff1a; 自定义温度显示控件(一) 自定义温度显示控件(二) 自定义温度显示控件(三) 今天讲温度实现效…

CPU深度解析

操作系统课程 计算机组成 ALU:计算单元(运算器)PC:pc寄存器存执行指令Registers:寄存器存数据MMU:控制器程序的构成:指令+数据 总线:一个程序读入内存,全是由0和1构成,从内存读取到cpu计算,需要通过总线。一段01数据段是指令还是数据是通过来源总线区分的。总线分…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

9 串口通信(三)

9.4 USART串口数据包 HEX数据包 1&#xff09;固定包长&#xff0c;含包头包尾 例如陀螺仪的数据&#xff0c;需要XYZ坐标一起打包 2&#xff09;可变包长&#xff0c;含包头包尾 如果定义的包头包尾刚刚好也是数据&#xff0c;这样容易混淆&#xff0c;解决的办法&#x…

java-Optional 类详解

目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法&#xff1a; get用法&#xff1a; filter用法&#xff1a; orElse用法&#xff1a; orElseGet用法 orElseThrow用法 map用法 flatMap用法&#xff1a; 前言 Optional 类是java8的新特性&#xff0…