docker-compose是一个定义复杂应用的工具,我们平时使用docker,一般是docker run …

然而这样每次只能运行一个镜像,而且不能保证各个容器之间是能够正常通信的,如果想要用docker做到这种容器之间相互通信,要么你每次的命令加上一大串的参数,比如说同一个网络名字啊,link啊,dependon啊,如此之类的,然而单单跑一个容器的命令的够长了,这个容器要是和4、5个其他的容器通信,那怎么写?

这就引出了我们的第二种方法:docker-compose,
关于这个工具我们需要下载,如果我们使用的是docker-desktop这种可视化客户端,那么他已经安装好了:怎么判断自己是不是已经完成了docker-compose的下载?

docker-compose -v   即可

博主跑一个微服务的项目一般喜欢先把环境搭好,然后在测试我么的项目正确性。
所以这里就分成了两个docker-compose文件,一个是env,一个是我们的项目app。

这里先介绍一下docker-compse的用法。
我们写好一个yml文件,然后docker-compose命令去执行,而这个文件就相当于pom配置文件。
具体举个例子:

docker-compose -f XXXX.yml up 要是路径上面只有一个docker-compose.yml文件那么
-f也可以不加上去,反正就是寻找的意思。

先介绍docker-compose-env.yml, 这里截取一部分,来讲一讲都是什么含义

services:
  mysql:
    image: mysql:8.0.26
    container_name: mysql
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 185450844 #设置root帐号密码
    ports:
      - 3307:3306
    volumes:
      - /Users/csen/dockerProject/mydata/mysql/data/db:/var/lib/mysql #数据文件挂载
      - /Users/csen/dockerProject/mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载
      - /Users/csen/dockerProject/mydata/mysql/log:/var/log/mysql #日志文件挂载
  • command:声明启动参数
  • image:你docker里面的镜像名字
  • container_name:启动后的容器名字
  • environment:设置容器中的环境变量
  • privileged:用来给容器root权限,不安全的
  • network_mode: 设置容器的网络模式
  • ports:端口
  • volumes:挂载,这个大家都没说清楚,就是用冒号前面的路径代替后面,这样一些数据啊配置啊就可以跟着你的要求走。前面的是自己的,后面的是容器的。

下面介绍docker-compose-app.yml

version: '3'
services:
  XXXX:
    image: XXXX:latest
    container_name: XXXX
    ports:
      - 8081:8081
    volumes:
      - /Users/csen/dockerProject/XXXX/logs:/var/logs
      - /etc/localtime:/etc/localtime
    environment:
      - 'TZ="Asia/Shanghai"'
    external_links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
      - mysql:db #可以用db这个域名访问mysql服务
      - nacos-registry:nacos

和docker-compose-env很像,不过我只是用来启动我们的微服务项目,这里面关键就是external_links,我们在项目中使用的很多localhost要替换成这些域名。

这里的image是我们build好的项目镜像,这里就要提一嘴了。这个是我们build的镜像
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建