Docker Compose问题
1.容器启动不了
docker-compose.yml中,使用dockerfile配置的容器,总是启动不了,使用docer start命令启动容器,一会就直接停止了,使用 docker logs 查看日志,也没有报错。
1 | # 基础镜像 |
【尝试】
1.尝试单独使用 docker start 也是无法启动
2.尝试在dockerfile 文件所在的文件夹,直接使用build构建镜像,然后使用 run 命令运行容器,最后使用 exec 进入容器没有问题。
1 | ## 构建镜像 |
3.尝试查看端口占用,发现没有端口占用
1 | sudo lsof -i:端口号 |
4.在docker-compose.yml中,添加:command: “tail -f /dev/null” 这句话。倒是成功启动了。
1 | version : '3.8' |
5.尝试查看日志,发现日志里面并没有什么东西
1 | ## 直接输出日志,没有内容 |
6.尝试重启电脑,无济于事
【问题】
出问题的docker-compose.yml文件竟然不是我自己写的,是另外的配置。
1 | version : '3.8' |
让我很头大的是,本来两个配置都无法启动,但是后来不知道改了哪里,竟然其中的一个配置竟然可以启动了。
1.而且我发现了,在使用docker-compose.yml构建的时候,command会覆盖掉dockerfile文件中定义的 ENTRYPOINT。
2.如果 ENTRYPOINT 有问题的时候,也是无法启动的。
3.当使用 docker ps -a 查看未启动的容器的时候,显示了 COMMAND,只有一个 bash,而其他的启动的 容器的command都不是这么显示的
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
4.docker-compose.yml中的服务名,不能是phems,可以是ph-phems,可以是hems,就是不能是phems。这个问题我暂时不清楚为什么,但是就我的测试中,确实如此,一旦定义了phems,就是无法使用:docker-compose up -d启动容器。就算是修改了文件夹的名字改为了kkk,也不行,service就是不能定义为phems,但是可以定义为kkk这种没有意义的名字,我真是醉了。
不可以启动的service定义
1 | phems: |
可以启动的service定义
1 | ph-phems: |
【解决】
docker-compose.yml中的 services,不能定义为 phems。 docker-compose.yml中的 services,不能定义为 phems。docker-compose.yml中的 services,不能定义为 phems。下面的phems容器启动不了,为什么?为什么?为什么呢?没有一篇文章说过这个问题啊,我真的不理解啊,我真的不理解
1 | version : '3.8' |
最终方案
我多次尝试之后,我发现了奇怪的问题,就是这个command有时候并不是我真的写在dockerfile中的命令,我怀疑是缓存的问题。接下来请看第二章的解决方法,这一章就先这样了。
1.docker 没有错误日志,镜像服务却启动不成功的,问题排查方式 在最下面添加一行:command: “tail -f /dev/null”
2.解决docker容器启动不了的问题
3.Docker无法正常启动的原因及解决办法 内存不够,端口冲突问题
4.docker如何进入一个运行失败的container查看数据卷
5.Docker实践(二):容器的管理(创建、查看、启动、终止、删除) docker create:创建容器,处于停止状态。docker run:创建并启动容器。
6.dockerfile 构建springboot镜像并启动 这里有使用dockerfile构建容器的方法
7.docker-compose up 无法启动容器,但是手动创建镜像,在启动容器就是正常的 这篇文章跟我说的情况一模一样:使用docker-compose up 部署两个容器,但使用Dockerfile构建的,镜像可以构建成功,但是容器无法启动! 但是先docker build,然后docker run就没有问题。
8.Shell/Bash - docker-compose 清除缓存
9.docker-compose的简单命令
2.docker-compose up 重新构建不更新代码
我修改了构建的dockerfile文件,但是最后生成的docker容器的命令,并不是我设定的dockerfile中的命令:ENTRYPOINT [“./jar/start.sh”],而是我很久之前的一个同名的容器的dockerfile文件中的命令:ENTRYPOINT [“java -jar ruoyi-gateway”],我已经使用docker rm和docker-compose rm删除过相关的容器了。
【尝试】
1 | ## 查看卷 |
【解决】
如果修改了dockerfile之后,要重新进行镜像的构建,docker-compose只是启动容器,而不是重新进行构建。
1 | docker rmi $(docker images -aq) |
1.docker-compose up 重新构建不更新代码? 弄明白了,是因为共享卷在宿主机还留有缓存的原因,其实每次构建完了如果发现不对应该使用
docker-compose down -v
在停止容器和的同时删除生成的共享卷,或者通过docker volume ls
查看并删除冗余的卷。删除完毕之后再使用docker-compose up
构建起来的镜像就是最新的了!2.清理Docker的container,image与volume
3.容器端口映射无法访问
我在本机进行开发,将nginx的端口映射到主机,结果死活都是无法访问,使用系统80端口的时候,可以访问 http://localhost
,但是换成了6000,就无法访问了nginx了,http://localhost:6000
,换成3000,或者是其他的端口,在浏览器中又可以访问了。
1 | version : '3.8' |
【解决】
我怀疑是浏览器的缓存导致的,因为我使用的是Deepin自带的浏览器,在使用火狐浏览器的时候,访问 http://localhost:6000
,出现了:此网址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求,这个问题还是我第一次遇到过,简直让我抓狂啊。
最后换一个端口就好了。
4.部署容器占用内存过大
在阿里云上部署docker应用,使用docker-compose进行配置,本地运行没有问题,但是部署到服务器上4核8G到机器上,总是出现整个服务器卡住的情况,通过阿里云控制台的监控,看到了CPU总是满的,后来我优化了程序之后,因为阿里云监控看不到内存情况,整个系统还是直接卡掉了,连ssh都连接不上了。
除了优化本身的java应用程序之外,还可以对docker使用的内存和cpu进行限制。
1.Docker项目部署内存占用过高的问题解决
2.docker中部署Java服务占用内存过大问题 ENTRYPOINT [“java”,”-jar”,”-Xmx400m”,”-Duser.timezone=GMT+08”,”-Dloader.path=lib”,”test-spring.jar”]
3.10.3.Docker中的Java内存消耗优化以及我们如何使用Spring Boot RSS = Heapsize + MetaSpace + OffHeap size
4.docker-compose限制内存, cpu资源以及固定ip写法