Docker容器启动时,容器内应用服务自启动设置

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 
### 设置Docker容器在系统启动时自动运行 为了使Docker容器能够在系统启动时自动运行,通常的做法是在启动Docker服务之后配置特定的容器随系统一同启动。这可以通过`docker update`命令结合`--restart-policy`选项来实现,也可以通过定义Docker Compose文件中的重启策略。 #### 方法一:使用 `docker run` 命令指定重启策略 当首次启动容器时,在`docker run`命令中加入`--restart unless-stopped`参数可以确保该容器会在主机重新启动后自动恢复运行[^1]: ```bash docker run --name my_container --restart unless-stopped -d my_image ``` 此命令会创建并命名一个新的名为`my_container`的容器实例,并应用了一个除非被手动停止否则总是尝试重启的策略。 #### 方法二:利用 Docker Compose 文件设定重启策略 对于更复杂的多容器应用程序部署场景,则推荐采用Docker Compose的方式来进行管理。编辑`docker-compose.yml`文件,为所需的服务添加`restart: unless-stopped`属性: ```yaml version: '3' services: webapp: image: "example/webapp" restart: unless-stopped ``` 保存更改后的YAML文件并通过执行`docker-compose up -d`命令来更新服务状态,这样就能保证所描述的服务将在下次开机时自启[^3]。 请注意,上述两种方法均依赖于Docker守护进程本身已经设置成开机即启动的状态。如果尚未完成这项工作,则需先按照如下指令操作以开启此项功能: ```bash systemctl start docker systemctl enable docker ``` 这些命令用于立即激活Docker服务以及将其设为默认引导加载项的一部分,从而保障后续任何基于它的自动化流程能够顺利运作。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值