【docker-compose】安装及配置
centos7默认防火墙为firewalld,而不是iptables,而docker使用iptables来做端口映射,所以一旦将firewalld关闭,则会报错。千万不要移除mysql容器重启,虽然密码生效了,但是删库,所有数据都没了。:修改后的密码无法连接mysql,但旧密码依然可以。有一次离线部署,docker官方mysql镜像。:启动防火墙,并一定注意开放平台访问的端口。主要借助docker
目录
安装
前提:!注意先安装docker
在线安装
# 下载某版本docker-compose文件并改名docker-compose移动至/usr/local/bin
curl -L "https://github.com/docker/compose/releases/download/1.28.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权docker-compose可执行
chmod +x /usr/local/bin/docker-compose
# 查看是否安装成功
docker-compose -v
离线安装
需要先下载好docker-compose
文件
# 授执行权限
chmod +x docker-compose
# 移动至/usr/bin
cp docker-compose /usr/bin/
# 查看是否安装成功
docker-compose -v
配置
mysql5.7
- !!!注意需要给/docker_mysql/data目录授读写权限, 例如
chmod -R 755 /docker_mysql/data
version
为2
和3
时都可以
version: '3'
services:
mysql57:
image: mysql:5.7
container_name: mysql5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
MYSQL_USER: test
MYSQL_PASSWORD: Test@123456
# 指定启动命令和配置参数
# command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 --max_allowed_packet=128M --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
ports:
- 3307:3306
volumes:
- ./docker_mysql/log:/var/log/mysql
- ./docker_mysql/data:/var/lib/mysql
- ./docker_mysql/conf:/etc/mysql/conf.d
bitnami/mysql8.3
有一次离线部署,docker官方mysql镜像
docker load
无法成功,改为bitnami版才成功
- !!!注意需要给/docker_mysql/data目录授读写权限, 例如
chmod -R 755 /docker_mysql/data
- bitnami版配置
version
必须为2
时以下配置才会生效 version
为3
时容器虽然运行成功,但密码等配置都无法生效- 官网文档
- 生产环境部署时,由于服务器问题,必须增加
privileged: true
配置,否则启动时报/bitnami/mysql/data
相关错误。 - 如果需要自定义配置,可增加配置文件
my_custom.cnf
,并映射
version: '2'
services:
mysql:
image: bitnami/mysql:8.3
container_name: mysql8
restart: always
# privileged: true
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_USER=prism
- MYSQL_PASSWORD=123456
- MYSQL_DATABASE=mydatabase
ports:
- 3307:3306
volumes:
- ./docker_mysql/data:/bitnami/mysql/data
# - ./docker_mysql/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro
redis
- /docker_redis目录下放入配置文件
redis.conf
#开启远程可连接 #bind 127.0.0.1 #自定义密码 requirepass 123456 #指定 Redis 监听端口(默认:6379) port 6379 #客户端闲置指定时长后关闭连接(单位:秒。0:关闭该功能) timeout 0 #是否压缩数据存储(默认:yes。Redis采用LZ 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大) rdbcompression yes #指定本地数据文件名(默认:dump.rdb) dbfilename dump.rdb #指定本地数据文件存放目录 dir /data #指定日志文件位置(如果是相对路径,redis会将日志存放到指定的dir目录下) logfile "redis.log"
- 启动后,可进入容器通过
redis-cli
测试,例如auth 密码
测试自定义密码是否生效 - !!!注意,如果是先启动的话会自动生成映射目录,其中redis.conf文件会被映射成为目录而不是文件,需要修改后重启
redis:
image: redis:6.2.6
container_name: redis
restart: always
volumes:
- ./docker_redis/redis.conf:/etc/redis/redis.conf
- ./docker_redis/data:/data
- ./docker_redis/logs:/logs
command: redis-server /etc/redis/redis.conf
ports:
- "6380:6379"
web前后台分离部署
后端镜像
web-server
基于openjdk:8-alpine
镜像制成,前端镜像web-front
基于nginx
镜像制成
version
为2
时需要增加links
配置才能将后端服务web-server
传入前端服务web-front
内部的nginx配置用于反向代理,为3
时不需要links
配置即可实现- 若后端程序连接的
mysql
也是通过该docker-compose部署的,则可在配置里不使用ip端口而是直接使用服务名 - 也可以不在同一个docker-compose.yml配置,但要确保在同一网络,例如yml文件放在同一个目录下
- 生产环境曾出现前端请求后端404,日志报错显示无法通过容器内部网关访问后端容器ip,该问题可通过重启docker服务解决。原因大概是开关防火墙firewalld影响到了所有容器网络。
version: '3'
services:
web-server:
image: 127.0.0.1:5000/web-server
container_name: web-server
restart: always
environment:
- spring.datasource.url=jdbc:mysql://【mysql服务名】/api?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTT
# - spring.datasource.url=jdbc:mysql://【ip】:【port】/api?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTT
- JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true
web-front:
image: 127.0.0.1:5000/web-front
container_name: web-front
restart: always
# links:
# - web-server
depends_on:
- web-server
ports:
- "8080:80"
前端https(SSL)配置
主要涉及签名证书通过volumes
映射,具体配置可见【docker-compose】【nginx】内网环境https配置
nginx动态传参
主要借助docker-compose的environment
、Dockerfile的envsubst
以及nginx配置文件模版实现,【docker-compose】【nginx】动态配置
资源限制:内存、cpu
- 使用
deploy
进行资源限制时version
必须为3
cpus
配置必须使用引号‘’
reservations
是限制最小使用,limits
限制最大使用- 需通过
docker-compose --compatibility up -d
启动才能生效 - 可通过
docker stats --no-stream
查看内存及cpu使用情况
version: '3'
services:
web-server:
image: 127.0.0.1:5000/web-server
container_name: web-server
restart: always
deploy:
resources:
limits:
memory: 8G
cpus: "4"
reservations:
memory: 2G
cpus: "2"
web-front:
image: 127.0.0.1:5000/web-front
container_name: web-front
restart: always
depends_on:
- web-server
ports:
- "8080:80"
deploy:
resources:
limits:
memory: 1G
cpus: "2.00"
reservations:
memory: 512M
cpus: "1.00"
nacos+sentinel+gateway
- docker-compose可以通过服务名访问服务,避免了每次修改ip和端口,便于移植
version: '3'
networks: #自定义网络myapp,为了只有这些服务可以在该网络内相互访问
myapp:
driver: bridge
services: #将容器抽象成服务
nacos: #注册中心(官方镜像)
image: nacos/nacos-server:1.4.1
container_name: nacos
restart: always
environment:
MODE: standalone
PREFER_HOST_MODE: ip
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 【ip地址】#数据库在外部
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: nacos
MYSQL_SERVICE_PASSWORD: Nacos@123456
# MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
volumes:
- ./docker_nacos/standalone-logs/:/home/nacos/logs
ports:
- "8848:8848"
networks:
- myapp
sentinel: #熔断限流(官方镜像)
image: bladex/sentinel-dashboard
container_name: sentinel-nacos
restart: always
depends_on:
- nacos
environment:
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
NACOS_NAMESPACE: public
NACOS_GROUP_ID: SENTINEL_GROUP
ports:
- "8858:8858"
networks:
- myapp
gateway: #网关(自制镜像)
image: nacos-gateway
container_name: nacos-gateway
restart: always
depends_on:
- nacos
ports:
- "18890:18890"
environment:
- spring.cloud.nacos.discovery.server-addr=nacos:8848
- spring.cloud.sentinel.transport.dashboard=sentinel:8858
networks:
- myapp
authserver: #认证中心(自制镜像)
image: nacos-authserver
container_name: nacos-authserver
restart: always
depends_on:
- nacos
environment:
- spring.datasource.url=jdbc:mysql://【mysql服务名】/oauth?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTT
- spring.cloud.nacos.discovery.server-addr=nacos:8848
- spring.cloud.sentinel.transport.dashboard=sentinel:8858
- JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true
networks:
- myapp
问题汇总
iptables No chain/target/match by that name
原因:centos7默认防火墙为firewalld,而不是iptables,而docker使用iptables来做端口映射,所以一旦将firewalld关闭,则会报错
解决:启动防火墙,并一定注意开放平台访问的端口
systemctl start firewalld.service
firewall-cmd --zone=public --add-port=[port]/tcp --permanent
firewall-cmd --reload
【mysql】docker-compose.yml修改mysql密码,重启后不生效
描述:修改后的密码无法连接mysql,但旧密码依然可以
问题:因为带有旧有登录信息的卷依然在
解决:docker volume ls
找到旧卷,docker volume rm
删除旧卷
注意:!!!千万不要移除mysql容器重启,虽然密码生效了,但是删库,所有数据都没了
【redis】启动redis失败
查看映射到宿主机的日志redis.log
Warning: Could not create server TCP listening socket 10.XX.XX.XX:6379: bind: Cannot assign requested address
1:M 16 May 2024 06:53:18.313 # Failed listening on port 6379 (TCP), aborting.
问题:端口并未占用,但绑定具体ip地址失败,具体原因不清楚
解决:将配置文件中的bind [ip地址]
改为bind 0.0.0.0
后启动成功
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)