从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容器就完成了

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

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

相关文章

C++-list实现相关细节和问题

前言:C中的最后一个容器就是list,list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…

【面试经典150题】买卖股票的最佳时期 JavaScript版

题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

力扣:77. 组合(Python3)

题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平…

方面级别情感分析之四元组预测

情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a,意见术语(也叫观点术语)o, 方面类别ac&#xff0c…

0基础学习VR全景平台篇 第93篇:智慧景区教程

一、上传素材 1.上传全景素材 第一步:进入【素材管理】 第二步:选择【全景图智慧景区】分类 第三步:选择相对景区作品分组,上传全景素材 2.素材标注 第一步:选择上传成功后素材,点击【未标注】 第二步&…

15-数据结构-二叉树的遍历,递归和非递归

简介: 本文主要是代码实现,二叉树遍历,递归和非递归(用栈)。主要为了好理解,直接在代码处,加了详细注释,方便复习和后期默写。主要了解其基本思想,为后期熟练应用…

VMware 设置仅主机模式无法访问外网的问题说明

参考链接 VMware仅主机模式访问外网 如果根据以上参看仍旧无法访问物理机网段其他设备以及无法访问外网,可以尝试在虚拟机上根据 vmnet1 网卡设置的 ip 地址添加默认路由,如下图所示: 首先查看对应网卡设置的 ip 地址 然后在虚拟机上执行如…

Android学习之路(6) 其他UI控件

ImageView(图像视图) RadioButton(单选按钮)&Checkbox(复选框) 开关按钮ToggleButton和开关Switch ProgressBar(进度条) SeekBar(拖动条) RatingBar(星级评分条) ScrollView(滚动条)

为什么别的职业都是越老越值钱,唯独程序员越老越容易失业?

因为其他职业都是技术稀缺型产业,而程序员却是技术密集型产业。 那些越老越值钱的职业有一个特征:越资深越稀缺,靠技术经验积累或是人脉资源吃饭,如医生、律师、老师等,而程序员这一职业的技术经验、人脉资源的积累相对…

使用Axios中的onUploadProgress实现显示文件上传进度

onUploadProgress 是 Axios 这个 JavaScript 库中用于处理 HTTP 请求的一个配置选项之一。Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中进行 HTTP 请求。 onUploadProgress 允许指定一个回调函数,在上传进度发生变化时被调用。这…

jeecgboot vue3使用DatePicker组件设置可用日期

文档: Ant Design Vue文档 设置不能选择今天之前的日期 (1)使用表单的formSchema中的componentProps组件属性通过disabledDate设置 import dayjs, {Dayjs} from "dayjs";{label: 日期,field: guidDate,component: DatePicker,dy…

git-tf clone 路径有空格处理方案

git-tf clone 路径存在空格情况下,运行命令报错; 需要对路径进行双引号处理

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号

首先要安装 TortoiseSVN, 并确保TortoiseSVN的bin目录被加入到系统环境变量Path中。 1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion(&quo…

MySQL 日期格式 DATETIME 和 TIMESTAMP

MySQL日期格式介绍 存储日期的方式mysql中存储日期的格式datetimetimestampDatetime和Timestamp的比较相同点:不同点: 数值型时间戳(INT)DATETIME vs TIMESTAMP vs INT,怎么选? 存储日期的方式 字符串Date…

EasyAVFilter的初衷:把ffmpeg.c当做SDK来用,而不是当做EXE来用

之前我们做一个视频点播的功能,大概的流程就是将上传上来的各种格式的视频,用FFmpeg统一进行一次转码,如果probe到视频的编码格式是H.264就调用-vcodec copy,如果probe到视频的编码格式不是H.264就调用-vcodec libx264&#xff0c…

SSH远程连接macOS服务器:通过cpolar内网穿透技术实现远程访问的设置方法

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

kali的学习

网络配置 1.kali的网络设置 首先我们了解kali的网络设置 DHCP:动态主机配置协议 是一个局域网的协议 使用UDP 协议工作静态IP:用于大部分的中小型网络 通过网络管理员手动分配IP原理进程 /etc 系统大部分服务启动过程都要访问该目录 我们直接去看看…

算法笔记:球树

1 KD树的问题 算法笔记:KD树_UQI-LIUWJ的博客-CSDN博客 在kd树中,导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体,而求最近邻时使用的是欧式距离(超球)。超方体与超球体相交的可能性是极高…

keepalived + lvs (DR)

目录 一、概念 二、实验流程命令 三、实验的目的 四、实验步骤 一、概念 Keepalived和LVS(Linux Virtual Server)可以结合使用来实现双机热备和负载均衡。 Keepalived负责监控主备服务器的可用性,并在主服务器发生故障时,将…

ASP.NET Core 中基于 Minimal APIs 的Web API

基于 Minimal APIs 的Web API Minimal APIs 是ASP.NET Core中快速构建 REST API 的方式,可以用最少的代码构建全功能的REST API。比如下面三行代码: var app WebApplication.Create(args); app.MapGet("/", () > "Hello World!&quo…