docker 容器内服务随容器自动启动

news2025/2/25 15:56:55

docker 容器内服务随容器自动启动

  • 1. 背景
  • 2. 准备工作
  • 3. 方式一,直接修改.bashrc文件(简单粗暴)
  • 4. 方式二,编写启动脚本加入.bashrc文件(文明一点)
  • 5. 导出容器制作镜像
  • 6. 测试导出容器,nginx服务随容器自动启动
  • 7. 方式三,修改镜像默认值,COMMIT生成新镜像(正规方式)
  • 8. 方式四,与方案三类似
  • 9. 方式五,使用DOCKERFILE重新BUILTD新镜像(永久使用方式)
  • 总结:

1. 背景

使用docker运行带有nginx服务的容器。容器启动后,每次都需要手动进入容器内启动nginx服务。修改容器,让nginx服务随容器自动启动。

2. 准备工作

  • 使用原nginx-sj: latest镜像文件运行一个容器
    nginx-sj: latest 是我之前使用,已修改的官方nginx镜像文件。
[root@centos7-10 ~]# docker run -it nginx-sj:latest /bin/bash
root@4eb5280856a3:/# 
  • 查看用户目录下.bashrc文件
root@4eb5280856a3:~# pwd
/root
root@4eb5280856a3:~# ls -a
.  ..  .bash_history  .bashrc  .profile  .viminfo

3. 方式一,直接修改.bashrc文件(简单粗暴)

  • 直接将服务启动命名写入.bashrc文件,见下
root@4eb5280856a3:~# vim /root/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want 'ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "$(dircolors)"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

############################################
# start nginx 
if [ -f /etc/init.d/nginx ]; then
        /etc/init.d/nginx start
fi

4. 方式二,编写启动脚本加入.bashrc文件(文明一点)

  • 编辑一个start_nginx.sh文件
root@4eb5280856a3:/# vim /root/start_nginx.sh
  • 写入以下内容,并保存
#!/bin/bash

service nginx start 
#service mysql start    //也可以添加其它服务
  • 添加start_nginx.sh脚本执行权限
root@4eb5280856a3:/# chmod +x /root/start_nginx.sh
  • 将启动脚本写入.bashrc文件
root@4eb5280856a3:~# vim /root/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want 'ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "$(dircolors)"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'

############################################
# start nginx 
if [ -f /root/start_nginx.sh ]; then
        /root/start_nginx.sh
fi

5. 导出容器制作镜像

  • 将当前容器(4eb5280856a3)导出成文件nginx-sj_20240222.tar
root@4eb5280856a3:~# exit
exit
[root@centos7-10 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND       CREATED          STATUS          PORTS     NAMES
4eb5280856a3   nginx-sj:latest   "/bin/bash"   32 minutes ago   Up 30 minutes             vibrant_mcnulty
[root@centos7-10 ~]# docker export -o nginx-sj_20240222.tar 4eb5280856a3
[root@centos7-10 ~]#
  • 删除当前容器(4eb5280856a3)
[root@centos7-10 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND       CREATED          STATUS          PORTS     NAMES
4eb5280856a3   nginx-sj:latest   "/bin/bash"   34 minutes ago   Up 32 minutes             vibrant_mcnulty
[root@centos7-10 ~]# docker stop 4eb5280856a3
4eb5280856a3
[root@centos7-10 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4eb5280856a32b83046e8e3be0393028a1a3f328887a11c0ccff15384660f86e

Total reclaimed space: 7.293kB
[root@centos7-10 ~]# 
  • 删除旧nginx-sj:latest镜像
[root@centos7-10 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
nginx-sj     latest    3e97da40406a   About an hour ago   216MB
ubuntu22     latest    caac235feb32   About an hour ago   338MB
busybox      latest    beae173ccac6   2 years ago         1.24MB
redis        latest    7614ae9453d1   2 years ago         113MB
[root@centos7-10 ~]# docker rmi nginx-sj:latest 
Untagged: nginx-sj:latest
Deleted: sha256:3e97da40406a0daaa4d8c0d948b4c3a8a3d099b3aadb0d9fe8a2be4389bd52e6
[root@centos7-10 ~]# 
  • 导入创建新nginx-sj: latest镜像,新镜像ID:283bb24f8ff4
[root@centos7-10 ~]# docker import nginx-sj_20240222.tar nginx-sj:latest
sha256:283bb24f8ff40c67a5ff9d33386847182567f688d7b1b4b109c17054e661b947
[root@centos7-10 ~]# docker images -a nginx-sj:latest 
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
nginx-sj     latest    283bb24f8ff4   About a minute ago   216MB
[root@centos7-10 ~]# 

6. 测试导出容器,nginx服务随容器自动启动

  • 启动容器,宿主机发布端口:9090,容器内服务端口:80
[root@centos7-10 ~]# docker run -itd --rm  -p 9090:80 nginx-sj:latest /bin/bash
562e64af48bbb26f95f3bf3fd01a3550898ca05292f8d95b9bf604c2000d2953
CONTAINER ID   IMAGE             COMMAND       CREATED         STATUS         PORTS                                   NAMES
562e64af48bb   nginx-sj:latest   "/bin/bash"   3 minutes ago   Up 3 minutes   0.0.0.0:9090->80/tcp, :::9090->80/tcp   nervous_golick
[root@centos7-10 ~]# 
  • 宿主机已监听端口9090
  • 宿主机IP 10.211.55.10
[root@centos7-10 ~]# netstat -ntlp | grep 9090
tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      17044/docker-proxy  
tcp6       0      0 :::9090                 :::*                    LISTEN      17050/docker-proxy  
[root@centos7-10 ~]# ip a show enp0s5
2: enp0s5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:1c:42:ae:b6:41 brd ff:ff:ff:ff:ff:ff
    inet 10.211.55.10/24 brd 10.211.55.255 scope global noprefixroute dynamic enp0s5
       valid_lft 1140sec preferred_lft 1140sec
    inet6 fdb2:2c26:f4e4:0:233e:38df:2cbd:cec1/64 scope global noprefixroute dynamic 
       valid_lft 2591662sec preferred_lft 604462sec
    inet6 fe80::7e0c:1902:e1ca:4324/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::567a:248b:5e94:5d19/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  • 访问宿主机HTTP://10.211.55.10:9090,成功!
    在这里插入图片描述

7. 方式三,修改镜像默认值,COMMIT生成新镜像(正规方式)

修改镜像默认值,方式详见官方文档:Overriding image defaults

  • 修改镜像Cmd默认值(之前是null)
    • nginx -g “daemon off;”
[root@centos7-10 ~]# docker run -itd -p 9090:80 nginx-sj:latest  nginx -g "daemon off;"
c90c3a7d8e56ea15017fdfa2dfe9b88d398dcfe16f76b9723f0eb884208d6999
  • 提交生成新镜像:nginx-sj:1
[root@centos7-10 ~]# docker commit -m "nginx start" c9 nginx-sj:1
sha256:94fa4087e73dd3c5440f7538d57dcd2f80938e0f9e8f87d48a866f7542f3d685
[root@centos7-10 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx-sj     1         94fa4087e73d   12 seconds ago   216MB
nginx-sj     2         355dbfe22182   30 minutes ago   216MB
nginx-sj     latest    283bb24f8ff4   25 hours ago     216MB
  • 查看新镜像nginx-sj:1信息
    • “Cmd”: [ “nginx”, “-g”, “daemon off;” ],
[root@centos7-10 ~]# docker image inspect nginx-sj:1
[
    {
        "Id": "sha256:94fa4087e73dd3c5440f7538d57dcd2f80938e0f9e8f87d48a866f7542f3d685",
        "RepoTags": [
            "nginx-sj:1"
        ],
        "RepoDigests": [],
        "Parent": "sha256:283bb24f8ff40c67a5ff9d33386847182567f688d7b1b4b109c17054e661b947",
        "Comment": "nginx start",
        "Created": "2024-02-23T09:55:38.972444927Z",
        "Container": "c90c3a7d8e56ea15017fdfa2dfe9b88d398dcfe16f76b9723f0eb884208d6999",
        "ContainerConfig": {
            "Hostname": "c90c3a7d8e56",
......
        "Config": {
            "Hostname": "c90c3a7d8e56",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": null,
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx-sj:latest",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
 ......
        }
    }
]
  • 运行容器进行验证
[root@centos7-10 ~]# docker run -itd -p 9000:80 nginx-sj:1 
eae91339bf57739cec9fbbd63890afd8949977eae0a561226109b1f02fd66051
[root@centos7-10 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS                                   NAMES
eae91339bf57   nginx-sj:1   "nginx -g 'daemon of…"   5 seconds ago   Up 4 seconds   0.0.0.0:9000->80/tcp, :::9000->80/tcp   modest_cartwright
  • 宿主机已经监听9000端口–>容器内nginx服务80端口
[root@centos7-10 ~]# netstat -ntlp | grep 9000
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      14995/docker-proxy  
tcp6       0      0 :::9000                 :::*                    LISTEN      15001/docker-proxy  
  • 外部访问HTTP://10.211.55.10:9000,成功。
    在这里插入图片描述

8. 方式四,与方案三类似

  • 修改镜像默认值,也可以组合修改ENTRYPOINT 和 CMD。修改方式如下:
[root@centos7-10 ~]# docker run -itd --entrypoint /usr/sbin/nginx nginx-sj:latest -g "daemon off;"

ENTRYPOINT 与 CMD 关系及使用方式详见官方文档:Understand how CMD and ENTRYPOINT interact

  • 生存新镜像方式同方案三

说明:因为docker run 命令中–entrypoint 只支持string,所以建议将服务启动命令写成shell脚本(同方案二),然后使用–entrypoint 引入更合理

9. 方式五,使用DOCKERFILE重新BUILTD新镜像(永久使用方式)

  • 创建一个dockerfile文件
[root@centos7-10 ~]# mkdir nginx-sj
[root@centos7-10 ~]# cd nginx-sj
[root@centos7-10 ~]# vim dockerfile-nginx
  • 输入以下内容并保存
    • FROM nginx-sj:latest # 基础镜像
    • MAINTAINER # 维护信息
    • CMD [“nginx”,“-g”,“daemon off;”] # 容器启动执行的默认命令
FROM nginx-sj:latest
MAINTAINER shijin
CMD ["nginx","-g","daemon off;"]
~
~
wq!
  • 使用dockerfile文件创建新镜像
    • -f dockerfile-nginx dockerfile文件名称(注意路径,测试在当前目录下)
    • -t nginx-sj:2024022601 镜像的名称与tag
    • . 指定镜像构建过程中的上下文环境
[root@centos7-10 ~]# docker build -f dockerfile-nginx -t nginx-sj:2024022601 .
  • 查看构建镜像结果
[root@centos7-10 nginx-sj]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED          SIZE
nginx-sj     2024022601   64b3c38d4483   36 minutes ago   216MB
[root@centos7-10 nginx-sj]# docker history  nginx-sj:2024022601 
IMAGE          CREATED          CREATED BY                         SIZE      COMMENT
64b3c38d4483   53 minutes ago   CMD ["nginx" "-g" "daemon off;"]   0B        buildkit.dockerfile.v0
<missing>      53 minutes ago   MAINTAINER shijin                  0B        buildkit.dockerfile.v0
<missing>      53 minutes ago                                      216MB     Imported from -

总结:

  1. 如果临时使用,可以采用方式一、二,从容器中导出;
  2. 如果不频繁变更,可以采用方式三、四,直接commit生成新镜像;
  3. 如果要长期或永久使用,建议采用方式五,彻底重新build新镜像。

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

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

相关文章

动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】

动态规划动态规划之第 N 个泰波那契数/三步问题 动态规划LeetCode题目第 N 个泰波那契数求解1求解2&#xff08;滚动数组&#xff09; 三步问题求解1求解2&#xff08;滚动数组&#xff09; 动态规划 如果问题是由重叠的子问题构成的&#xff0c;那就可以用动态规划&#xff08…

python Matplotlib Tkinter-->tab切换3

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

云呐智能化运维技术支持是做什么的?运维监控一体化是什么

智能化运维技术支持的具体职责和工作内容&#xff0c;包括但不限于故障诊断、系统维护、数据分析等方面的任务。同时&#xff0c;阐述智能化运维监控一体化的概念&#xff0c;包括其目标、实现方式以及如何通过集成监控和管理流程来提高运维效率的优势。包含对智能化运维技术支…

【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一

重采样栅格像元匹配问题&#xff1a;不同空间分辨率栅格数据统一 原始数据数据1&#xff1a;GDP分布数据2.1&#xff1a;人口密度数据2.2&#xff1a;人口总数数据3&#xff1a;土地利用类型 数据处理操作1&#xff1a;将人口密度数据投影至GDP数据&#xff08;栅格数据的投影变…

ffmpeg 推流报错 Error writing trailer of rtmp:// End of file

推流一段时间以后就会报这个错误&#xff0c;有没有人知道怎么解决呢&#xff1f;

10 款数据恢复软件功能和有效性对比(2024 年更新)

数据丢失可能是一种痛苦的经历&#xff0c;无论是由于意外删除、硬件故障还是软件损坏。值得庆幸的是&#xff0c;数字时代带来了强大的数据恢复解决方案。 随着我们进入 2024 年&#xff0c;市场上充斥着旨在有效检索丢失数据的先进软件。在本文中&#xff0c;我们将探讨 2024…

【论文笔记】Slim-neck by GSConv

文章目录 前言1. 简介2. GSConv4. 为什么要在Neck中使用GSConv3. Slim-NeckSlim-Neck中的模块Slim-Neck针对YOLO系列的设计 一些问题总结References 前言 作者提出了一种新方法GSConv来减轻模型复杂度&#xff0c;保持准确性。GSConv可以更好地平衡模型的准确性和速度。并且&am…

JAVA学习笔记12

1.键盘输入语句 1.1 介绍 ​ *在编程中&#xff0c;需要接收用户输入的数据&#xff0c;就可以使用键盘输入语句来获取。 1.2 步骤 ​ 1.导入该类的所在包&#xff0c;java.util.* ​ 2.创建该类对象&#xff08;声明变量&#xff09; ​ 3.调用里面的功能 import java.…

后端:跨端轻量JavaScript引擎的实现与探索

一、JavaScript 1.JavaScript语言 JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。 ECMAScript发展史: 时间版本说明1997年7月ES1.0 发布当年7月&#xff0c;ECMA262 标准出台1998年6月ES2.0 发布该版本修改完全符合…

2024年sCrypt编程马拉松即将开幕

BSV区块链的建设者们&#xff0c;你们在哪&#xff1f;2024年sCrypt编程马拉松即将拉开帷幕&#xff01; 2024年3月16日至17日&#xff0c;我们将在旧金山市举办一场以比特币智能合约&#xff08;即 sCrypt&#xff09;和比特币通证&#xff08;如Ordinals&#xff09;相结合为…

快速搭建宠物医院服务小程序的步骤,无需编程经验

如果你是一家宠物医院或者宠物服务机构&#xff0c;想要拥有一款方便用户预约、查询信息的小程序&#xff0c;那么乔拓云网提供的轻应用小程序是你的不二选择。下面将为你详细介绍如何轻松打造宠物医院服务小程序。 1. 进入乔拓云网后台&#xff0c;点击【轻应用小程序】中的【…

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …

面试redis篇-08数据淘汰策略

原理 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key: noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是…

一款开源.NET WPF界面库介绍

一款开源.NET WPF界面库介绍 这是一个WPF版的Layui前端UI样式库&#xff0c;该控件库参考了Web版本的LayUI风格&#xff0c;利用该控件库可以完成现代化UI客户端程序&#xff0c;让你的客户端看起来更加简洁丰富又不失美感 如何使用 步骤一 : 添加LayUI.Wpf Nuget包; Inst…

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理)&#xff0c;此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号&#xff1a; 配置系统变量 因为在执…

备战蓝桥杯Day17 - 链表

链表 基本概念 链表是由一系列节点组成的元素集合。 每个节点包含两部分&#xff1a;数据域 item 、指向下一个节点的指针 next 通过节点之间的相互链接&#xff0c;形成一个链表 1. 链表的初始化 # 手动建立链表 # 链表的初始化 class Node(object):def __init__(self, …

消息中间件篇之Kafka-高性能设计

一、高性能设计 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据。 顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率。 页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把对磁盘的访问变为对内存的访问。 零拷贝&a…

互联网加竞赛 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

C#,动态规划(DP)N皇后问题(N Queen Problem)的回溯(Backtracking)算法与源代码

1 N皇后问题&#xff08;N Queen Problem&#xff09; 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。 2 回溯算法 回溯算法实际上一个类似枚…

水果FL Studio21.2.3.4004里的一个动态视觉插件Fruity Dance的教程

这是一篇关于水果&#xff08;FL Studio&#xff09;里的一个动态视觉插件Fruity Dance的教程。前部分较多地引用了FL的帮助文档&#xff0c;后部分结合了我操作的一些经验。 &#xff08;文中这种颜色的字可略过不看&#xff0c;属于一些基础操作的解释补充&#xff09; 准备材…