某一天我对服务器进行了重启,重启以后发现通过Docker运行的服务无法访问了,然后查看原因,发现Docker服务没有开机自启,启动了Docker以后发现容器又没有自动启动。
1.设置Docker开机自启我们可以直接通过chkconfig命令来设置Docker开启自启:
chkconfig docker执行成功如下:
2.设置容器随Docker启动我们要让容器随Docker启动,就必须设置容器的重启策略为always,我们通过docker compose来运行容器时可以在yml里面指定。打开docker-compose.override.yml文件,添加配置:
restart: always完整的配置示例:
version: '3' services: alipay.demo.pcpayment: restart: always environment: - ASPNETCORE_ENVIRONMENT=Production ports: - "32775:80" 七.Docker的重启策略 1.设置容器重启策略这里讲的设置容器重启策略主要是通过命令来进行交互,并非第六节讲的通过docker compose来设置重启策略,是对第六节的一个扩展阅读。
我们可以在使用docker run命令时通过--restart参数来设置重启策略:
docker run -d --restart=always alipaydemo docker run -d --restart=on-failure:10 alipaydemo第一条命令代表容器退出时总是重启容器,第二条代表在容器非正常退出时重启容器,最多重启10次。
对于已经运行的容器可以通过docker update命令来指定:
docker update --restart=always alipaydemo 2.Docker容器的重启策略Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。
Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。
Docker容器的重启策略如下:
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
3.Docker容器的退出状态码docker run的退出状态码如下:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
参考资料:https://blog.csdn.net/taiyangdao/article/details/73076019
八.设置自动交互我们在编写Dockerfile时,可以通过RUN命令来运行一些命令,由此我们可以通过运行apt-get等命令,将一些必要的组件安装到我们的镜像之中,比如lsof等。我们有如下配置:
RUN apt-get install lsof但是我们在安装一个组件时,非常有可能遇到交互操作,比如“Dou you want to xxx?[y/n]”等,遇到这种将会中断我们的Docker镜像构建过程,那么如何解决呢?我们可以给命令指定--assume-yes来实现自动交互:
RUN apt-get install lsof --assume-yes持续集成自动化构建过程中,如若不设置自动交互将会被中断:
使用apt-get install命令以前,最好使用apt-get update更新一下,避免出现问题。
九.ASP.NET Core 生成图片问题大家应该知道目前.NET Core(2.0)还是没有System.Drawing程序集,如果我们要使用Image等对象来完成生成图片验证码、图片二维码等操作只有通过第三方编写的组件,ZKWeb.System.Drawing便是其中一个,我们使用它以后,我们在windows上运行良好,无需其他额外的操作。但是我们一到Linux运行或者使用Docker(dotnet镜像使用的是ubantu环境)运行时,会发现程序无法正常生成图片,会出现异常,这是因为我们的zk在Linux/Docker下运行需要安装一个名为 libgdiplus 的组件,我们在构建Docker镜像的时候可以通过RUN命令使用apt-get命令进行安装:
RUN apt-get update RUN apt-get install libgdiplus --assume-yes RUN cd /usr/lib RUN ln -s libgdiplus.so gdiplus.dllapt-get update是非常有必要的