首页 > 经验记录 > 分享下个人开发常用的 docker-compose 模板文件 (Tomcat、Redis、ZK、MySQL、Rabbit、Mongo)

分享下个人开发常用的 docker-compose 模板文件 (Tomcat、Redis、ZK、MySQL、Rabbit、Mongo)

现在各种工具、中间件都是在用docker部署了。 安装了docker后 一行run命令就搞定了,确实也方便。

不过有点难受的是有些中间件的配置, 主要是环境变量我根本就不记得。 最近又要在别的服务器上用 docker 部署几个东西, 我就想着每次都临时去自己的旧记录(我有个文档记录) 里翻配置也怪麻烦的。

想了想终归还是写篇博客纯当记录, 虽说是纯使用向没什么内涵, 但多少还是有些价值的。 找这些配置实在是麻烦。 我这 docker-compose 模板文件都给你安排的明明白白了。

都是经过验证的模板编排文件, ctrl c+ctrl v 然后改下 .env 环境变量就能直接启起来,还是很香的。

注: 这篇文章排版有点奇怪的, 因为这是我用Markdown写的然后复制到WP里的, 显示的会有点诡异。 代码指定不了样式, 就这样吧 (摊手)。

环境:

docker 使用阿里云(其他的也可以, 反正最好是国内的) 镜像加速的命令 (ubuntu/centos 限定)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://2pcnubsp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

也可以不用命令,手动创建 /etc/docker/daemon.json 文件, 复制这个json进去也行

{
  "registry-mirrors": ["https://2pcnubsp.mirror.aliyuncs.com"]
}

docker-compose install:

# 先下载下来,用的是国内的源
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 加权限
sudo chmod +x /usr/local/bin/docker-compose

说明

  • docker-compose 命令格式:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
  • -f 可以指定使用的 Compose 模板文件,默认为 docker-compose.yml ; 为了方便,我都用的默认的。
  • docker-compose 执行的命令默认都是以当前所在文件夹为环境的, 所以每个容器都建个单独的文件夹
  • Compose 模板文件支持读取主机的系统环境变量和当前目录下的 .env 文件中的变量。为了方便换配置,我每个模板都使用了 .env 文件

例子(bash操作):

#查看当前目录,确保是在对的目录里
1:pwd
/opt/dockercompose/mysql
#查看文件, 确保模板文件和.env都在。  要用 `ls -a` 查看, 因为.env会被隐藏
2:ls -a
docker-compose.yml .env
# 检查模板文件正确性,正确会打出配置(注入变量后的) 错误就会提示, 可以跳过这部分, 反正写的是正确的
3:docker-compose config
# 使用当前目录下的模板文件启动容器, 没有的镜像都会去下载,映射的目录没有都会自动创建
# 加上-d 就是后台启动, 不然ctrl+c 启动的容器就会被关闭。 可以先普通启动看看效果, 正确就关掉重新后台启动
4:docker-compose up [-d]
# 停止容器并删除容器
5:docker-compose down

注:

  • 文件放好后,整个启停流程里就只涉及到 4/5 这两个命令来回用了
  • docker的命令 start | stop | rm | logs | ps 之类的 docker-compose 都可以用。 好处是不用指定容器名字/hash, 只要在那个目录里边就行了。
  • 不过 docke-compose 命令他操作的是模板文件描述的所有容器。比如你这个docker-compose.yml 创建了个zookeeper集群总共3个容器, 你用 docker-compose logs -f 会同时看到这三个容器的日志(会有颜色区分) 使用 docker-compose stop 会把这三个容器都停掉。 如果只想处理单个, 还是得用 docker 命令指定容器

Compose 模板文件

mysql:

  • docker.compose.yml
version: '3.7'
services:
  mysql:
    image: "mysql:5.7"
      network_mode: "${DOCKER_NETWORK}"
      container_name: "${NAME}"
    hostname: "${NAME}"
      environment:
        MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      restart: always
      volumes:
        - "${DIR_MYSQL_CONF}:/etc/mysql/conf.d"
        - "${DIR_MYSQL_DATA}:/var/lib/mysql"
        - "${DIR_MYSQL_INIT_SCRIPTS}:/docker-entrypoint-initdb.d/"
      ports:
        - "${MYSQL_PORT_MAPPING}:3306"
  • .env:
DOCKER_NETWORK=bridge
NAME=mysql-m1
# MYSQL_VERSION=5.7 写死了5.7版本 避免路径映射不对
MYSQL_ROOT_PASSWORD=root
MYSQL_PORT_MAPPING=3306
DIR_MYSQL_CONF=/opt/dockerdata/mysql/conf
DIR_MYSQL_DATA=/opt/dockerdata/mysql/data
# 这个目录里的.sql/.sh 文件会在容器启动时被扫描执行
DIR_MYSQL_INIT_SCRIPTS=/opt/dockerdata/mysql/init

redis

  • docker.compose.yml
version: "3.7"
services:
  redis:
    image: redis:5
    network_mode: "${DOCKER_NETWORK}"
    container_name: "${NAME}"
    hostname: "${NAME}"
    restart: always
    command: redis-server
    # 设置密码和开启AOF
    #command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
    volumes:
      - "${DIR_REDIS_DATA}:/data"
    ports:
      - "${REDIS_PORT_MAPPING}:6379"
  • .env:
DOCKER_NETWORK=bridge
NAME=redis-r1
# REDIS_VERSION=5
REDIS_PASSWORD=pass
REDIS_PORT_MAPPING=6379
DIR_REDIS_DATA=/opt/dockerdata/redis/data

zookeeper

  • docker.compose.yml
version: '3.7'
services:
  zoo1:
    image: zookeeper:3.4.14
    network_mode: "${DOCKER_NETWORK}"
    container_name: "${ZOO1_NAME}"
    hostname: "${ZOO1_NAME}"
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "5"
    ports:
      - "${REDIS_PORT_MAPPING}:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=${ZOO1_NAME}:2888:3888
    volumes:
      - "${DIR_ZOO_DATA}:/data"
  • .env:
DOCKER_NETWORK=bridge
ZOO1_NAME=zoo-z1
# ZOO_VERSION=3.4.14
REDIS_PORT_MAPPING=2181
DIR_ZOO_DATA=/opt/dockerdata/zookeeper/data
  • 上边是基本的 zookeeper 单机, 我这还有个以前用过的伪集群模板,也给放上来
version: '3.7'
services:
  zoo1:
    image: zookeeper:3.4.14
    restart: always
    network_mode: zookeeper-service
    container_name: zoo1
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  zoo2:
    image: zookeeper:3.4.14
    restart: always
    network_mode: zookeeper-service
    container_name: zoo2
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
  zoo3:
    image: zookeeper:3.4.14
    restart: always
    network_mode: zookeeper-service
    container_name: zoo3
    hostname: zoo3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888

RabbitMQ

  • docker-compose.yml
version: '3.7'
services:
  rabbit:
    image: rabbitmq:3.7.7-management
    network_mode: "${DOCKER_NETWORK}"
    container_name: "${NAME}"
    hostname: "${NAME}"
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "5"
    ports:
      - "${RABBIT_PORT_MAPPING}:5672"
      - "${RABBIT_MANAGEMENT_PORT_MAPPING}:15672"
    environment:
      - "RABBITMQ_DEFAULT_VHOST=${RABBITMQ_DEFAULT_VHOST}"
      - "RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}"
      - "RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}"
    volumes:
      - "${DIR_RABBIT_DATA}:/var/lib/rabbitmq"
  • .env
# RABBIT_VERSION=3.7.7
NAME=rabbit-r1
DOCKER_NETWORK=bridge
RABBIT_PORT_MAPPING=5672
RABBIT_MANAGEMENT_PORT_MAPPING=15672
RABBITMQ_DEFAULT_VHOST=/
RABBITMQ_DEFAULT_USER=rabbit
RABBITMQ_DEFAULT_PASS=rabbit
DIR_RABBIT_DATA=/opt/dockerdata/rabbitmq/data

MongoDB

  • docker-compose.yml
version: '3.7'
services:
  mongo:
    image: 'mongo:${MONGO_VERSION}'
    network_mode: "${DOCKER_NETWORK}"
    container_name: "${NAME}"
    hostname: "${NAME}"
    restart: always
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "5"
    environment:
      - "MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE}"
      - "MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}"
      - "MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}"
    volumes:
      - "${DIR_MONGO_DATA}:/data/db"
      - "${DIR_MONGO_INIT_SCRIPTS}:/docker-entrypoint-initdb.d/"
    ports:
      - "${MONGO_PORT_MAPPING}:27017"
    #这是覆盖掉默认启动命令让mongo不用认证。 如果用这个命令启动上边的超级用户配置要先删掉,不然启动报错
    #command: ["mongod","--noauth"]
  • .env
NAME=mongo
DOCKER_NETWORK=bridge
MONGO_VERSION=latest
MONGO_PORT_MAPPING=27017
MONGO_INITDB_DATABASE=db1
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
DIR_MONGO_DATA=/opt/dockerdata/mongo/data
# 这个目录里的.js/.sh 文件会在容器启动时被扫描执行
DIR_MONGO_INIT_SCRIPTS=/opt/dockerdata/mongo/init

Tomcat

docker-compose.yml

version: '3.7'
services:
  tomcat:
    image: "tomcat:${TOMCAT_VERSION}"
    network_mode: "${DOCKER_NETWORK}"
    container_name: "${NAME}"
    hostname: "${NAME}"
    restart: always
    #容器内存限制、空间限制、CPU资源限制。
    #mem_limit: 1024m
    #memswap_limit: 1024m
    #cpu_quota: 30000
    logging:
      driver: "json-file"
      options:
        max-size: "1024k"
        max-file: "5"
    environment:
      - "TZ=Asia/Shanghai"
      #- JAVA_OPTS=
      #- CATALINA_OPTS=
    volumes:
      - "${DIR_TOMCAT_WEBAPPS}:/usr/local/tomcat/webapps"
      - "${DIR_TOMCAT_LOGS}:/usr/local/tomcat/logs"
      # 不能映射配置文件,启动时会找不到配置报错。想映射的话先起一个临时的tomcat然后把配置复制出来再映射
      # - "${DIR_TOMCAT_CONF}:/usr/local/tomcat/conf"
    ports:
      - "${TOMCAT_PORT_MAPPING}:8080"

.env

NAME=tomcat9
DOCKER_NETWORK=bridge
TOMCAT_VERSION=9.0
TOMCAT_PORT_MAPPING=8080
DIR_TOMCAT_WEBAPPS=/opt/dockerdata/tomcat9/webapps
DIR_TOMCAT_LOGS=/opt/dockerdata/tomcat9/logs
#DIR_TOMCAT_CONF=/opt/dockerdata/tomcat9/conf
           


2 COMMENTS

  1. zhangxin2020-06-29 10:55

    大佬太棒了,看了的博客感觉自己还有好多的东西需要学习,感谢分享,顺便问下大佬我现在php也做了4年了,现在感觉有点迷茫了,不知道怎么办,感觉自己还是会点东西,但是看了你的 感觉自己又啥都不会样,是不是分布式的都必须要学习啊,我现在感觉除了分布式的微服务其它的感觉都还可以样,但是感觉又差一点,求大佬指教

    • skypyb2020-06-29 22:44

      PHP我不太明白。不过4年了 分布式的该会的东西起码还是都得知道的。起码锁、事务、ID、Session、定时任务、限流的分布式解决方案基本都得知道吧= = java得会这么多纯粹是因为卷的厉害, 国内开发者想找到好工作 java 的面试难度是地狱级的。

EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00