现在各种工具、中间件都是在用docker部署了。 安装了docker后 一行run命令就搞定了,确实也方便。
不过有点难受的是有些中间件的配置, 主要是环境变量我根本就不记得。 最近又要在别的服务器上用 docker 部署几个东西, 我就想着每次都临时去自己的旧记录(我有个文档记录) 里翻配置也怪麻烦的。
想了想终归还是写篇博客纯当记录, 虽说是纯使用向没什么内涵, 但多少还是有些价值的。 找这些配置实在是麻烦。 我这 docker-compose 模板文件都给你安排的明明白白了。
都是经过验证的模板编排文件, ctrl c+ctrl v 然后改下 .env
环境变量就能直接启起来,还是很香的。
注: 这篇文章排版有点奇怪的, 因为这是我用Markdown写的然后复制到WP里的, 显示的会有点诡异。 代码指定不了样式, 就这样吧 (摊手)。
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"] }
# 先下载下来,用的是国内的源 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 [-f=<arg>...] [options] [COMMAND] [ARGS...]
docker-compose.yml
; 为了方便,我都用的默认的。 .env
文件中的变量。为了方便换配置,我每个模板都使用了 .env
文件 #查看当前目录,确保是在对的目录里 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
docker-compose logs -f
会同时看到这三个容器的日志(会有颜色区分) 使用 docker-compose stop
会把这三个容器都停掉。 如果只想处理单个, 还是得用 docker 命令指定容器 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"
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
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"
DOCKER_NETWORK=bridge NAME=redis-r1 # REDIS_VERSION=5 REDIS_PASSWORD=pass REDIS_PORT_MAPPING=6379 DIR_REDIS_DATA=/opt/dockerdata/redis/data
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"
DOCKER_NETWORK=bridge ZOO1_NAME=zoo-z1 # ZOO_VERSION=3.4.14 REDIS_PORT_MAPPING=2181 DIR_ZOO_DATA=/opt/dockerdata/zookeeper/data
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"
# 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
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"]
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
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