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 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐