docker和docker-compose的安装步骤可以参考我的另外一篇文章

CentOS7安装部署docker和docker-compose

首先,找个合适的地方,新建一个docker-compose.yml文件。内容我先贴上我的,下面在解释

version: '3'
services:
# MySql配置
  mysql:
    # 随容器启动而启动
    restart: always
    image: [你的镜像拉取地址]
    # 容器别名
    container_name: mysql
    # 端口映射
    ports:
      - "3506:3306"
    # 设置网卡信息
    networks:
      - autoconnect-parent
    command:
      # MySQL5.0以后的,都加上这句
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      # 指定mysql启动后的初始化脚本
      --init-file=/docker-entrypoint-initdb.d/init.sql
    environment:
      TZ: Asia/Shanghai
      # 设置mysql的root密码
      MYSQL_ROOT_PASSWORD: "你的mysql密码"
      # 设置mysql使用的数据库
      MYSQL_DATABASE: 你的数据库名
    volumes:
      # 磁盘挂载,将mysql的数据存在宿主机的/data/mysql/data目录
      - /data/mysql/data:/var/lib/mysql
      # 指定初始化脚本存放目录(容器内目录),这里和指定初始化脚本文件相呼应
      - /data/mysql/init.d:/docker-entrypoint-initdb.d

# Mongo配置
  mongo:
    privileged: true
    restart: always
    image: [你的镜像拉取地址]
    container_name: mongo
    environment:
      TZ: Asia/Shanghai
      MONGO_INITDB_DATABASE: autoconnect
      MONGO_INITDB_ROOT_USERNAME: itd
      MONGO_INITDB_ROOT_PASSWORD: vendeitd002
    ports:
      - "29107:27017"
    networks:
      - autoconnect-parent
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/mongo/data:/data/db
      # 指定初始化脚本所在目录,这里我写了,但是没卵用。后面再解释
      - /data/mongo/init.d:/docker-entrypoint-initdb.d

# Redis配置
  redis:
    restart: always
    container_name: redis
    image: [你的镜像拉取地址]
    ports:
      - "16379:6379"
    networks:
      - autoconnect-parent
    # 使用配置文件启动,这里我没挂载,因为提前把修改好的conf文件打进了镜像中。这里直接使用
    command: redis-server /etc/redis/redis.conf

# Nginx配置
  nginx:
    restart: always
    image: [你的镜像拉取地址]
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    networks:
      - autoconnect-parent
    # 这的配置是指nginx要和下面这些个容器有通信
    links:
      - admin
      - exporter
      - worker
      - job
    # 这个是指的,启动顺序,nginx要在下面这些容器启动好了以后才启动
    depends_on:
      - admin
      - exporter
      - worker
      - job

# 项目
  openjdk:
    image: [你的镜像拉取地址]
    restart: always
    container_name: openjdk

  admin:
    restart: always
    image: [你的镜像拉取地址]
    container_name: admin
    ports:
      - "8109:8109"
    networks:
      - autoconnect-parent
    volumes:
      - /data/autoconnect:/mnt/autoconnect
    links:
      - mysql
      - mongo
      - redis
    depends_on:
      - openjdk
      - mysql
      - mongo
      - redis

  worker:
    restart: always
    image: [你的镜像拉取地址]
    container_name: worker
    ports:
      - "8201:8201"
    networks:
      - autoconnect-parent
    links:
      - mysql
      - mongo
      - redis
    depends_on:
      - openjdk
      - mysql
      - mongo
      - redis

  exporter:
    restart: always
    image: [你的镜像拉取地址]
    container_name: exporter
    ports:
      - "8200:8200"
    networks:
      - autoconnect-parent
    links:
      - mysql
      - mongo
      - redis
    depends_on:
      - openjdk
      - mysql
      - mongo
      - redis

  job:
    restart: always
    image: [你的镜像拉取地址]
    container_name: job
    ports:
      - "9202:9202"
    networks:
      - autoconnect-parent
    links:
      - mysql
      - mongo
      - redis
    depends_on:
      - openjdk
      - mysql
      - mongo
      - redis

# 设置一个虚拟网卡,把要相互通信的容器,都放在同一个网络里才能实现相互通信
networks:
  autoconnect-parent:

Q1. 容器间的相互通信问题

同时部署这么多应用,肯定会有相互通信的,比如应用需要访问数据库,nginx需要转发请求到应用接口等等。

首先,需要确保相互通信的容器都在同一个网络。这就是为什么要新建一个名为autoconnect-parent的networks并把相互通信的容器都放在这个网卡里的原因。

其次需要打开容器允许远程访问的配置,比如mongo需要注释掉/etc/mongod.conf.orig文件里的bindIp配置。redis需要注释掉redis.conf文件里的# bind 127.0.0.1。mysql需要保证user的root用户的host存在%这个值等等。

在然后,容器内访问地址修改。比如应用需要访问mysql,那么application.yml里的mysql链接串就应该是:url: jdbc:mysql://mysql:[容器内端口号]。相同的nginx里转发的配置就要变成:proxy_pass http://admin:8102。

Q2. mongo初始化的问题

第一个问题就是,它不能像mysql一样指定用哪个脚本文件来初始化,只能配置初始化脚本所在目录。

第二个问题就是,我写的初始化脚本,它压根儿就不执行。

基于这两个问题,我只能先启动容器,在进入mongo容器去手动执行。DMT。