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