Docker Compose问题

标签: 无 分类: 未分类 创建时间:2022-07-21 11:28:22 更新时间:2024-11-23 02:04:25

1.容器启动不了

docker-compose.yml中,使用dockerfile配置的容器,总是启动不了,使用docer start命令启动容器,一会就直接停止了,使用 docker logs 查看日志,也没有报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基础镜像
FROM openjdk:8-jre
# author
MAINTAINER phems

# 创建目录
RUN mkdir -p /home/phems
# 指定路径
WORKDIR /home/phems
## 复制jar文件到路径
COPY ./jar/*.jar /home/phems/
### 复制启动命令
COPY ./start.sh /home/phems/

【尝试】
1.尝试单独使用 docker start 也是无法启动
2.尝试在dockerfile 文件所在的文件夹,直接使用build构建镜像,然后使用 run 命令运行容器,最后使用 exec 进入容器没有问题。

1
2
3
4
5
6
## 构建镜像
docker build -t phems:v0.0.2 .
## 启动容器
docker run -itd f5e004c88dc3 /bin/bash
## 进入容器内部
docker exec -it 5a831b87e43c /bin/bash

3.尝试查看端口占用,发现没有端口占用

1
sudo lsof -i:端口号

4.在docker-compose.yml中,添加:command: “tail -f /dev/null” 这句话。倒是成功启动了。

1
2
3
4
5
6
7
8
9
10
11
12
version : '3.8'
services:
phems:
container_name: phems
build:
context: ./phems
dockerfile: dockerfile
ports:
- "8080:8080"
volumes:
- ./phems/**:/home
command: "tail -f /dev/null"

5.尝试查看日志,发现日志里面并没有什么东西

1
2
3
4
## 直接输出日志,没有内容
docker logs 容器id
## 查看日记文件,也没有内容
docker inspect --format '{{.LogPath}}' 容器id

6.尝试重启电脑,无济于事

【问题】
出问题的docker-compose.yml文件竟然不是我自己写的,是另外的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version : '3.8'
services:
ruoyi-nginx:
container_name: ruoyi-nginx
image: nginx
build:
context: ./nginx
ports:
- "80:80"
volumes:
- ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- phems
links:
- phems

让我很头大的是,本来两个配置都无法启动,但是后来不知道改了哪里,竟然其中的一个配置竟然可以启动了。

1.而且我发现了,在使用docker-compose.yml构建的时候,command会覆盖掉dockerfile文件中定义的 ENTRYPOINT。
2.如果 ENTRYPOINT 有问题的时候,也是无法启动的。
3.当使用 docker ps -a 查看未启动的容器的时候,显示了 COMMAND,只有一个 bash,而其他的启动的 容器的command都不是这么显示的

1
2
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS                    NAMES
4faafceabf3c docker_phems "bash" 43 seconds ago Exited (0) 42 seconds ago phems

4.docker-compose.yml中的服务名,不能是phems,可以是ph-phems,可以是hems,就是不能是phems。这个问题我暂时不清楚为什么,但是就我的测试中,确实如此,一旦定义了phems,就是无法使用:docker-compose up -d启动容器。就算是修改了文件夹的名字改为了kkk,也不行,service就是不能定义为phems,但是可以定义为kkk这种没有意义的名字,我真是醉了。

不可以启动的service定义

1
2
3
4
5
6
7
phems:
container_name: phems
build:
context: ./phems
dockerfile: dockerfile
ports:
- "8080:8080"

可以启动的service定义

1
2
3
4
5
6
7
ph-phems:
container_name: ph-phems
build:
context: ./phems
dockerfile: dockerfile
ports:
- "8080:8080"

【解决】
docker-compose.yml中的 services,不能定义为 phems。 docker-compose.yml中的 services,不能定义为 phems。docker-compose.yml中的 services,不能定义为 phems。下面的phems容器启动不了,为什么?为什么?为什么呢?没有一篇文章说过这个问题啊,我真的不理解啊,我真的不理解

1
2
3
4
5
6
7
8
9
version : '3.8'
services:
phems:
container_name: phems
build:docker
context: ./phems
dockerfile: dockerfile
ports:
- "8080:8080"

最终方案
我多次尝试之后,我发现了奇怪的问题,就是这个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
2
3
4
5
6
7
8
## 查看卷
docker volume ls
## 清理卷
docker volume prune
## 删除容器
docker-compose down -v
## 删除镜像
docker image prune -a

【解决】
如果修改了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version : '3.8'
services:
ph-nginx:
container_name: ph-nginx
build:
context: ./nginx
dockerfile: dockerfile
ports:
## - "6000:80"
- "80:80"
volumes:
- ./nginx/html:/home/phems-ui/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d

【解决】
我怀疑是浏览器的缓存导致的,因为我使用的是Deepin自带的浏览器,在使用火狐浏览器的时候,访问 http://localhost:6000 ,出现了:此网址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求,这个问题还是我第一次遇到过,简直让我抓狂啊。

最后换一个端口就好了。

参考文章:
1.解决Docker端口映射无法访问问题 阿里云的内网eth0 网段正好跟Docker 的虚拟网卡都是 172 网段,有冲突.
2.docker 端口映射 及外部无法访问问题

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写法
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。