最近在看docker,正好调试完了说一下遇到的坑,先上代码。
docker-compose.yml文件
#定义docker-compose的版本号,
version: "2.18"
#定义你所需要启动的服务
services:
#服务名称注意这个不会当做容器名称
smart-laboratory-mysql:
#依赖的镜像
image: mysql:8.0
#定义容器名称
container_name: mysql8.0
#这行代码解决mysql无法访问的问题
command: --default-authentication-plugin=mysql_native_password
#容器与宿主机的端口映射 格式为宿主机 : 容器
ports:
- 23306:3306
#将宿主机的一个目录挂载到容器中 这里我将/smart-laboratory-new/smart-laboratory-data挂在到容器中的目的是为了让写入的数据落盘否则容器一旦挂掉数据就全无
volumes:
- /smart-laboratory-new/smart-laboratory-data:/var/lib/mysql
#Mysql的相关配置
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_DATABASE: "smart_laboratory"
MYSQL_USER: "smart"
MYSQL_PASSWORD: "smart"
#定义所处的局域网,服务可以通过局域网互相访问会更快(其实我感觉作用不大因为在application.yml中我还是写的ip地址,而且有些公司mysql并不是装在服务器里的而是直接买的mysql服务)
networks:
- test
#服务名称
smart-laboratory:
#容器名称
container_name: smart-laboratory
#在容器内部指定主机名(目前没发现有什么用)
hostname: test
#指定容器启动时要去编译的dockerfile镜像文件地址,
build: ./
#容器与宿主机的端口映射
ports:
- 8088:9090
#将宿主机的一个目录挂载到容器中
#这里我将/smart-laboratory-new/smart-laboratory-new挂载进来是因为这个目录是放代码的目录,这样一来我测试环境发版就只需要进入容器进/smart-laboratory-new目录编译jar运行jar
volumes:
- /smart-laboratory-new/smart-laboratory-new:/smart-laboratory-new
#指定这个服务要在那些服务启动之后再启动这是一个数组可以往下写很多个服务但是这里指的服务是这个docker-compose中定义的服务
depends_on:
- smart-laboratory-mysql
- smart-laboratory-redis
#定义所处的局域网
networks:
- test
#定义局域网
networks:
test:
dockerfile文件
#指定依赖的镜像
FROM openjdk:8
#指定使用阿里云镜像仓库以为要去安装maven
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
#更新apt-get 与安装maven
RUN apt-get update && apt-get install -y maven
#挂载目录与docker-compose.yml中的volumes是一个意思
VOLUME /smart-laboratory-new
#让容器持续运行,即便容器没有运行服务也可以持续运行
CMD ["tail", "-f", "/dev/null"]
#暴露端口,根据服务而定
EXPOSE 9090
然后说一说踩的坑。
首先是docker-compose.yml中的command字段,如果你配置了这个字段,那么他会覆盖掉你dockerfile文件里的CMD或者 ENTRYPOINT命令,这直接导致了我一开始打算用来放spring boot 的容器一直起来就直接关掉了,因为我学的时候视频里dockerfile文件就是把jar包放进了容器里所以直接在command字段去运行了jar,而我希望像我这个进容器去编译再运行jar,所以自己改了一下,直接导致我容器一起来就关掉然后没有任何日志。
然后是mysql容器的volumes 我一开始以为只用写前面宿主机的目录就好了,导致我容器一关掉数据全无,然后就是command字段,这其实随便搜一下就能搜到。
我一开始还打算搞redis的但是搞了两天我使用自己redis的配置文件就是无法正常启动容器,如果不指定配置文件就能正常启动,如果后续我解决了会更新这篇文章,也希望大佬如果看见能帮我解决一下。
最后我也只是一个菜鸟,内容仅供参考,欢迎大家指出问题。