Docker 運行鏡像時發現容器是運行起來了,但是容器的應用服務還是在關閉狀態,沒有開啟。每次容器運行時還要進入正在運行的容器內啟動應用服務。進入正在運行的容器中執行以下命令:
$ docker exec -it -d XXX /bin/bash
其中:
-d 后台運行
XXX 容器的名字
/bin/bash 以交互的方式運行容器
測試環境安裝的是lnmp環境,采用LNMP一鍵安裝包LNMP鏡像
安裝過程如下:
第一步:拉取centos,獲取的是官方最新centos
$ docker pull centos
第二步: 以交互的方式進入容器內
docker run -it -d centos:latest /bin/bash
第三步: 在centos容器中執行LNMP一鍵安裝包
第四步:安裝完成后退出容器,將剛剛的容器制作成鏡像
$ docker commit -m="AA-BB" -a="roon" 7485859a46ad lnmp:v1
其中:
-m:提交的描述信息
-a:指定鏡像作者
7485859a46ad:容器ID
lnmp:v1:指定要創建的目標鏡像名
到此lnmp 鏡像制作完畢
$ docker images
會發現剛剛制作好的鏡像
運行LNMP鏡像
$ docker run -it -d -p 9508:80 lnmp:v1
-p 9508:80 將服務器9508端口映射到lnmp:v1容器的80端口
在瀏覽器輸入
http://ip:9508
其中也可以輸入域名
發現連接不上
查找問題:
容器已經在運行中了,端口也映射了,怎么就不能訪問呢,
進入容器中看看
$docker exec -it -d XXX /bin/bash
運行
$ netstat -nutlp
此命令是查看所有進程端口情況
what 應用服務器沒有啟動,所有端口都沒有在運行,在容器中執行:
$ lnmp start
再次查看進程端口情況,發現所有端口運行起來了
在瀏覽器中再次訪問,發現訪問成功了
但是每次容器啟動的時候都要進入容器內操作應用服務器的開啟,有沒有什么好的方法容器啟動的時候,容器內的應用服務器也啟動。網上查資料,還真的有這方面的資料。但是發現好多都是類似的內容,不知道真假。自己嘗試應用。
第一步:進入容器
在容器的根目錄下創建start.sh腳本
網上參考的命令
#!/bin/sh
/bin/serviceA start #啟動服務
/bin/bash #保留一個終端,防止容器自動退出
這個命令不符合自己的實際需要,於是進行改寫
#!/bin/sh
lnmp start #啟動lnmp服務器的命令
/bin/bash
保存退出,重新創建lnmp鏡像:lnmp:v2
如下命令啟動鏡像
$ docker run -it -d -p 9508:80 lnmp:v2 /start.sh
發現還是出錯,錯誤如下:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/start.sh\": permission denied": unknown.
原來是沒有給start.sh權限,再次進入容器修改start.sh權限:
$ chmod 777 start.sh
將最終版本的容器重新制作成鏡像:lnmp:v3
$ docker run -it -d -p 9508:80 lnmp:v3 /start.sh
這次啟動成功了,在進入容器查看端口運行情況發現容器內的應用服務器已經運行起來了。
在瀏覽器訪問9508端口也運行成功了,到此容器內應用服務自啟動設置完畢
測試過程中遇到的其他問題:
1.端口9508有時因為運行其他內容而占用了,這時候可以殺死進程或者更換其他可用的端口,殺死端口的命令
$ kill 9508
2.start.sh腳本的命令
本實例采用的是lnmp服務器,啟動的命令是:lnmp start,如啟動其他的進程,根據情況添加命令
如:啟動php,mysql:
service php-pfm start
service mysqld start
可以在start.sh添加
#!/bin/sh
service php-pfm start
service mysqld start
/bin/bash
--------------------------------------------------------------------------------------------------
原文鏈接:https://blog.csdn.net/wang_magento/article/details/100763622