文章目錄 一.手動制作單服務的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 # 根據上一步結果得到該步驟。