文章目录 一.手动制作单服务的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温馨提示:登录成功后,请在容器再次执行一次"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 # 根据上一步结果得到该步骤。