14

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

 4 years ago
source link: https://www.skypyb.com/2020/03/jishu/1422/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

现在各种工具、中间件都是在用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

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}:15672"
    #这是覆盖掉默认启动命令让mongo不用认证。 如果用这个命令启动上边的超级用户配置要先删掉,不然启动报错
    #command: ["mongod","--noauth"]
  • .env
NAME=mongo
DOCKER_NETWORK=bridge
 
MONGO_VERSION=latest
MONGO_PORT_MAPPING=15672
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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK