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

09-docker镜像手动制作

文章目录

  • 一.手动制作单服务的nginx镜像
    • 1.启动一个基础容器,此处我使用的是centos7镜像。
    • 2.修改容器中的软件源
    • 3.安装nginx服务并启动nginx服务
    • 4.修复nginx的首页文件
    • 5.退出容器
    • 6.将退出的容器提交为镜像
    • 7.测试镜像的可用性
  • 二.手动制作多服务的nginx + sshd镜像
    • 1.启用一个基础容器,建议使用上一步安装好的镜像
    • 2.安装sshd服务
    • 3.安装依赖包
    • 4.生成主机的密钥对
    • 5.启动sshd服务
    • 6.修改容器的root密码
    • 7.在宿主机中验证容器的sshd服务是否可用
    • 8.退出容器
    • 9.把安装好的服务提交成镜像
    • 10.验证容器的启动,发现问题
    • 11.解决无法同时启动两个服务的思路(建议两种思路都尝试一下!)
    • 12.退出容器,再次提交镜像
    • 13.再次启动容器进行测试
    • 14.后记
  • 三.手动制作可道云镜像
    • 1.关于可道云
    • 2.可道云镜像文件的环境说明
    • 3.启动基础容器
    • 4.安装php依赖包
    • 5.修改nginx的配置文件
    • 6.修改php程序的运行用户
    • 6.运行php程序
    • 7.解压代码
    • 8.编写启动脚本
    • 9.提交镜像
    • 10.启动镜像
    • 11.登录可道云
  • 四.常见的报错汇总
    • 1.Failed to get D-Bus connection: Operation not permitted
    • 2./usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory

一.手动制作单服务的nginx镜像

1.启动一个基础容器,此处我使用的是centos7镜像。

[root@docker01 ~]# docker container run -it -p 80:80 centos:7 /bin/bash

2.修改容器中的软件源

[root@5de898783b49 /]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup ;  curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo ;sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repoyum 命令行补全
[root@5de898783b49 /]# yum install bash-completion -y
[root@5de898783b49 /]# source /etc/profile.d/bash_completion.shss,netstat命令安装
[root@5de898783b49 /]# yum install iproute -y
[root@5de898783b49 /]#  yum install net-tools -y

3.安装nginx服务并启动nginx服务

[root@e19bb4af59b9 /]# yum -y install nginx
[root@e19bb4af59b9 /]# 
[root@e19bb4af59b9 /]# nginx温馨提示:如下图所示,我们无法访问到nginx服务的首页文件,因为index.html指向的目标文件并不存在哟~

在这里插入图片描述

4.修复nginx的首页文件

[root@e19bb4af59b9 /]# rm -f /usr/share/nginx/html/index.html 
[root@e19bb4af59b9 /]# 
[root@e19bb4af59b9 /]# echo "<h1>buffes.com</h1>" > /usr/share/nginx/html/index.html 
[root@e19bb4af59b9 /]# cat /usr/share/nginx/html/index.html 温馨提示:如下图所示,由于默认的index.html文件存在问题,因此需要我们手动处理一下,就可以正常访问服务啦~

5.退出容器

[root@e19bb4af59b9 /]# exit 温馨提示:当我们退出容器后,则容器会跟随者退出了,这意味着在该容器中运行的nginx进程也跟随着退出程序了。综上所述,那么正在运行的程序产生的socket文件以及pid文件可能依旧保留在容器内,并没有对其进行删除!对于某些服务而言,如果pid文件存在的话,可能会对下一次启动服务造成影响,但对于咱们的案例来说并不会造成影响[root@docker01 ~]# docker container ps
[root@docker01 ~]# docker container ps -a

6.将退出的容器提交为镜像

[root@docker01 ~]# docker container commit 5de898783b49 buffes_nginx:v1温馨提示:镜像创建成功后,我们可以使用"docker images"进行查看。[root@docker01 ~]# docker images

7.测试镜像的可用性

[root@docker01 ~]# docker container run -it -d -p 89:80 buffes_nginx:v1 nginx -g 'daemon off;'
[root@docker01 ~]# docker container ps
[root@docker01 ~]# curl -v 172.200.1.201:8888温馨提示:(1)上课的时候需要演示出不执行nginx -g 'daemon off;'的效果,这样学员体验度更加;(2)如果启动咱们自己的镜像时不指定命令,则默认继承我们基于centos 7镜像的默认初始命令,即"/bin/bash";(3)手动制作镜像时貌似无法修改镜像的初始化命令,我们必须学习后面基于自动制作镜像的方式来指定初始化命令。

二.手动制作多服务的nginx + sshd镜像

1.启用一个基础容器,建议使用上一步安装好的镜像

我们想要手动制作多服务的nginx + sshd镜像,目前有两种访问:(1)基于centos7镜像,单独安装nginx和sshd服务;(2)基于我们上一步安装好的镜像,然后单独安装sshd服务;启动基础镜像:
[root@docker01 ~]# docker container run -it -p 90:80 -p 91:22 buffes_nginx:v1 /bin/bash
[root@docker01 ~]# which sshd
[root@docker01 ~]# rpm -qf /usr/sbin/sshd温馨提示:sshd的软件包名称为"openssh-server"。

2.安装sshd服务

[root@134453e5d289 /]# yum -y install openssh-server温馨提示:(1)如下图所示,要求咱们在启动sshd服务之前,得优先启动sshd服务;(2)由于我们的容器镜像比较干净,因此无法直接使用systemctl命令来启动sshd服务,这意味着我们需要手动来启动服务,还好可以参考默认的启动脚本参数;(3)在执行后续的步骤前,请先查看一下"/etc/ssh"目录下的文件。

在这里插入图片描述

3.安装依赖包

[root@134453e5d289 /]# yum -y install initscripts

在这里插入图片描述

4.生成主机的密钥对

[root@134453e5d289 /]# /usr/sbin/sshd-keygen 温馨提示:执行此步骤之前,建议先查看一下"ll /etc/ssh/"

在这里插入图片描述

5.启动sshd服务

[root@134453e5d289 /]# /usr/sbin/sshd

在这里插入图片描述

6.修改容器的root密码

[root@134453e5d289 /]# echo "123456" | passwd --stdin root

在这里插入图片描述

7.在宿主机中验证容器的sshd服务是否可用

[root@docker01 ~]# ssh 172.17.0.2温馨提示:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5914f6dffbca42f19a0e91b8a1a3a185.png)登录成功后,请在容器再次执行一次"ps -ef"这样能看到多出来一个"sshd: root@pts/1"和"-bash"的进程哟~

在这里插入图片描述在这里插入图片描述

8.退出容器

[root@134453e5d289 /]# exit 

在这里插入图片描述

9.把安装好的服务提交成镜像

[root@docker201 ~]# docker container commit 134453e5d289 centos7_nginx_sshd:v1温馨提示:提交成镜像后,请思考是否有给自己留坑,如果很自信,绝对没有问题,则请思考下一步的分析。

在这里插入图片描述

10.验证容器的启动,发现问题

[root@docker201 ~]# docker container run -d -p 8888:80 -p 9999:22 centos7_nginx_sshd:v1 nginx -g 'daemon off;'
docker container run -d -p 90:80 -p 91:22 centos7_nginx_sshd:v1.1 nginx -g 'daemon off;'[root@docker201 ~]# docker container run -d -p 18888:80 -p 19999:22 centos7_nginx_sshd:v1 /usr/sbin/sshd -D
docker container run -d -p 18888:80 -p 19999:22 centos7_nginx_sshd:v1.1 /usr/sbin/sshd -D温馨提示:不难发现,我们在测试镜像的时候发现了问题,如下所示,我们无法做到同时启动两个服务。

11.解决无法同时启动两个服务的思路(建议两种思路都尝试一下!)

思路一:如下图所示,我们可用编写一个脚本来帮咱们启动服务,但该脚本的最后启动的服务应该阻塞当前的容器,避免容器退出。[root@0636ae97b332 /]# vi /bufes_init.sh[root@0636ae97b332 /]# [root@0636ae97b332 /]# cat /buffes_init.sh#!/bin/bash# 启动nginx服务,该服务无需阻塞,否则我们就无法启动sshd服务啦!#nginx -g 'daemon off;'nginx# 启动sshd服务,但一定要阻塞当前终端,不能退出,否则容器也会退出,前面执行的命令我们无需阻塞住哟~/usr/sbin/sshd -D[root@0636ae97b332 /]# 思路二:启动容器时指定命令为: /bin/sh -c "nginx;/usr/sbin/sshd -D"温馨提示:容器是不走开机启动流程的,因此不要妄想将其写在"rc.local"配置文件中哟~

12.退出容器,再次提交镜像

[root@docker01 ~]# docker container commit 0636ae97b332 centos7_nginx_sshd:v2
[root@docker01 ~]# docker image ls

13.再次启动容器进行测试

[root@docker01 ~]# docker container run -d -p 172.200.1.201:8888:80 -p 172.200.1.201:9999:22 centos7_nginx_sshd:v2 /bin/bash -x /buffes_init.sh[root@docker01 ~]# docker container ps -a
[root@docker01 ~]# docker container logs 5482b93aed22
[root@docker01 ~]# curl 172.200.1.201:8888
[root@docker01 ~]# ssh root@172.200.1.201:9999
[root@docker01 ~]# ssh root@172.200.1.201 -p 9999docker container run -d -p 10.0.0.24:92:80 -p 10.0.0.24:93:22 centos7_nginx_sshd:v1.2 /bin/bash -x /buffes_init.sh
温馨提示:(1)启动容器时调用咱们的脚本;(2)可以使用logs查看容器的输出内容;(3)如下图所示,启动容器后,请用宿主机的IP地址及端口进行访问;

14.后记

nginx和ssh双服务镜像启动脚本制作:
[root@0d6e9daeea52 /]# cat /buffes-start-birds.sh 
#!/bin/bash# nginx -g "daemon off;"
nginx -g "daemon on;"# init root password
if [ -n "$1" ]; thenecho $1 | passwd --stdin root
elif [ -n "$BUFFES_ADMIN" ]; thenecho $BUFFES_ADMIN | passwd --stdin root
elseecho 321 | passwd --stdin root
fi# Background operation
/usr/sbin/sshd -D[root@0d6e9daeea52 /]# chmod +x /buffes-start-birds.sh [root@docker01 ~]# docker container commit d0b204844fb0 centos7_nginx_sshd_root:v1.4#密码优先级获取得到为 1111
[root@docker01 ~]# docker container run -itd -e BUFFES_ADMIN=4444 centos7_nginx_sshd_root:v1.4 /buffes_init.sh 1111[root@docker01 ~]# docker container ps -l
[root@docker01 ~]# docker container inspect 0d6e9daeea52#通过ssh连接进入,看不到密码的环境变量
[root@docker01 ~]# ssh 172.17.0.2
root@172.17.0.2's password: 1111
[root@0d6e9daeea52 ~]# 
[root@0d6e9daeea52 ~]# env#可以看到有密码的环境变量
[root@docker01 ~]# docker container exec -it fervent_lamport bash
[root@0d6e9daeea52 ~]# env

三.手动制作可道云镜像

1.关于可道云

可道云可以同步备份您的相册或重要资源, 随时随地查看、编辑、分享云端文件,轻松实现移动办公。官方地址:https://kodcloud.com/下载地址:https://kodcloud.com/download/

2.可道云镜像文件的环境说明

我们可以基于上面生成的nginx和ssh的容器继续制作可道云镜像,但可道云是一个PHP项目,因此得在咱们的容器里安装响应的php程序。本案例采用nginx 1.16,php 5.4版本即可。

3.启动基础容器

[root@docker01 ~]# docker container run -it centos7_nginx_sshd:v2 /bin/bash docker container run -it buffes_nginx:v2 /bin/bash 
温馨提示:容器启动成功后,我们可以安装咱们的kod啦~

4.安装php依赖包

[root@b33f88c4edfd /]# yum -y install php-fpm php-mbstring.x86_64 php-gd温馨提示:安装php程序的依赖包。

5.修改nginx的配置文件

(1)创建代码存放目录
[root@b33f88c4edfd /]# mkdir -pv /buffes/html  # 创建存放代码的目录
mkdir: created directory ‘/buffes’
mkdir: created directory ‘/buffes/html’
[root@b33f88c4edfd /]# 
[root@b33f88c4edfd /]# ll /buffes/html/ -d
drwxr-xr-x 2 root root 6 Jun 14 17:29 /buffes/html/
[root@b33f88c4edfd /]# (2)修改nginx的配置文件
[root@b33f88c4edfd /]# egrep -v "^$|^*#" /etc/nginx/nginx.conf.default > /etc/nginx/nginx.conf
[root@b33f88c4edfd /]# 
[root@b33f88c4edfd /]# vi /etc/nginx/nginx.conf
[root@b33f88c4edfd /]# 
[root@b33f88c4edfd /]# cat /etc/nginx/nginx.conf
worker_processes  1;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;location / {root   /buffes/html;index  index.php index.html index.htm;}location ~ \.php$ {root           html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /buffes/html$fastcgi_script_name;include        fastcgi_params;}}
}
[root@b33f88c4edfd /]# (3)测试nginx的配置文件是否正确
[root@b33f88c4edfd /]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@b33f88c4edfd /]# 温馨提示:
mkdir -pv /buffes/code/{bird,kod,wordpress}cat > /etc/nginx/conf.d/buffes-bird.conf <<EOFserver {listen       81;root        /buffes/code/bird;}
EOFcat > /etc/nginx/conf.d/buffes-kod.conf <<EOFserver {listen       82;root        /buffes/code/kod;location / {index  index.php index.html index.htm;}location ~ \.php$ {fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;# 注意下使用echo指令时对于特殊符号要使用转义符哟~否则将不识别.fastcgi_param  SCRIPT_FILENAME  /buffes/code/kod\$fastcgi_script_name;include        fastcgi_params;}}
EOF

6.修改php程序的运行用户

[root@b33f88c4edfd /]# vi /etc/php-fpm.d/www.conf温馨提示:如下图所示,我们只需修改运行php的用户名和组名即可。

在这里插入图片描述

6.运行php程序

[root@b33f88c4edfd /]# php-fpm -D

在这里插入图片描述

7.解压代码

(1)将下载的kod软件包上传到容器中
[root@docker01 ~]# docker container cp kodexplorer4.40.zip b33f88c4edfd:/buffes/html(2)安装unzip程序包
[root@b33f88c4edfd /]# yum -y install unzip(3)解压软件包
[root@b33f88c4edfd ~]# cd /oldboyedu/html
[root@b33f88c4edfd html]# 
[root@b33f88c4edfd html]# unzip kodexplorer4.40.zip (3)修改文件权限
[root@b33f88c4edfd html]# chown -R nginx:nginx .

在这里插入图片描述

8.编写启动脚本

[root@b33f88c4edfd html]# vi /buffes_init.sh 
[root@b33f88c4edfd html]# 
[root@b33f88c4edfd html]# 
[root@b33f88c4edfd html]# cat /buffes_init.sh 
#!/bin/bash# 启动nginx服务,该服务无需阻塞,否则我们就无法启动sshd服务啦!
#nginx -g 'daemon off;'
nginx# 启动php程序
php-fpm -D# 启动sshd服务,但一定要阻塞当前终端,不能退出,否则容器也会退出,前面执行的命令我们无需阻塞住哟~
/usr/sbin/sshd -D
[root@82d86b64d693 /]# chmod +x /buffes_init.sh 

9.提交镜像

[root@docker01 ~]# docker image ps -a
[root@docker01 ~]# docker container commit b33f88c4edfd buffes_kod:v1
[root@docker01 ~]# docker image ls

10.启动镜像

[root@docker01 ~]# docker container run -d -p 8888:80 buffes_kod:v1 /bin/bash -x /buffes_init.shdocker container run -d -p 8888:80 buffes_kod:v1 /bin/bash -x /buffes_init.sh
温馨提示:(1)我这里只需要访问80端口,因此我启动容器的时候就只暴露了80端口哟;(2)访问宿主机的8888端口,就可以访问到容器的80端口了,可以访问如下图所示的界面,输入管理员密码即可;

11.登录可道云

在这里插入图片描述

如上图所示,用户默认是"admin",我们使用初始化指定的管理员密码进行登录。登录成功后的界面如下图所示。

在这里插入图片描述

四.常见的报错汇总

1.Failed to get D-Bus connection: Operation not permitted

问题描述:如下图所示,在启动sshd服务时,抛出了"Failed to get D-Bus connection: Operation not permitted"异常。问题原因:未运行"/usr/bin/dbus-daemon"进程。解决方案:方案一:运行"/usr/bin/dbus-daemon"进程,但需要对其进行一定的了解。方案二:手动启动ssh服务。

在这里插入图片描述

[root@docker01 ~]# docker container ps
[root@docker01 ~]# ps -ef | grep -i bus

2./usr/sbin/sshd-keygen: line 10: /etc/rc.d/init.d/functions: No such file or directory

问题描述:手动运行"/usr/sbin/sshd-keygen"脚本时报错。问题原因:该脚本调用系统函数库"functions"。解决方案:yum provides /etc/rc.d/init.d/functions  # 查看该文件被哪个依赖包产生。yum -y install initscripts  # 根据上一步结果得到该步骤。

在这里插入图片描述

http://www.dtcms.com/a/326743.html

相关文章:

  • PG靶机 - Flu
  • 常见鱼饵制作方式
  • 在 X86_64(amd64) 平台上的docker支持打包构建多环境镜像并推送镜像到Harbor
  • AI Coding 概述及学习路线图
  • uploader组件,批量上传怎么设置实时滚动
  • Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation
  • 2.一维码+二维码+字符识别
  • OpenHarmony概述与使用
  • 基于大数据的个性化学习环境构建的研究与应用
  • Java前后端交互核心技术:Servlet与JSP深度解析
  • 【Altium designer】一键给多个器件添加参数
  • 2025年渗透测试面试题总结-13(题目+回答)
  • 如何选择一家靠谱的开发公司开发项目呢?
  • sql select语句
  • Python 高阶函数:filter、map、reduce 详解
  • WebMCP 技术文档——让 AI 助手与 Web 应用无缝交互的轻量级框架
  • 基于cursor工具与AI大模型,规范驱动的全自然语言软件开发工作流实现路径
  • 导入CSV文件到MySQL
  • webpark》》
  • STM32CubeMX + HAL 库:用硬件IIC接口实现AT24C02 EEPROM芯片的读写操作
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 【OpenGL】LearnOpenGL学习笔记06 - 坐标系统、MVP变换、绘制立方体
  • 用 t-SNE 把 KSC 高光谱“变成可转动的 3D 影像”——从零到会,逐段读懂代码并导出旋转 GIF
  • 二叉树进阶 之 【模拟实现二叉搜索树】(递归、非递归实现查找、插入、删除功能)
  • 跨平台RTMP推流SDK vs OBS:技术差异与行业落地解析
  • 01数据结构-十字链表和多重邻接表
  • Lwip深度阅读-网络架构
  • 【代码随想录day 17】 力扣 654.最大二叉树
  • 贪心----2.跳跃游戏
  • 区块链技术原理(5)-网络