【docker-compose】安装及配置

目录

安装

前提:!注意先安装docker

在线安装

bash 复制代码
# 下载某版本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文件

bash 复制代码
# 授执行权限
chmod +x docker-compose
# 移动至/usr/bin
cp docker-compose /usr/bin
# 查看是否安装成功
docker-compose -V

配置

mysql5.7

  • !!!注意需要给/docker_mysql/data目录授读写权限 , 例如chmod 777 data
  • version23时都可以
yaml 复制代码
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 777 data
  • bitnami版配置version必须为2时以下配置才会生效
  • version3时容器虽然运行成功,但密码等配置都无法生效
  • 官网文档
yaml 复制代码
version: '2'
services:
  mysql:
    image: bitnami/mysql:8.3
    container_name: mysql8
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_USER=prism
      - MYSQL_PASSWORD=123456
      - MYSQL_DATABASE=mydatabase
    ports:
      - 3307:3306
    volumes:
      - ./docker_mysql/data:/bitnami/mysql/data

redis

  • /docker_redis目录下放入配置文件redis.conf

    yaml 复制代码
    #开启远程可连接
    #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 密码测试自定义密码是否生效

yaml 复制代码
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镜像制成

  • version2时需要增加links配置才能将后端服务web-server传入前端服务web-front内部的nginx配置用于反向代理,为3时不需要links配置即可实现
  • 若后端程序连接的mysql也是通过该docker-compose部署的,则可在配置里不使用ip端口而是直接使用服务名
  • 也可以不在同一个docker-compose.yml配置,但要确保在同一网络,例如yml文件放在同一个目录下
yaml 复制代码
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配置必须使用引号''
  • 需通过docker-compose --compatibility up -d启动才能生效
  • 可通过docker stats --no-stream查看内存及cpu使用情况
yaml 复制代码
version: '3'
services:
  web-server:
    image: 127.0.0.1:5000/web-server
    container_name: web-server
    restart: always
    deploy:
      resources:
        limits:
          memory: 256M
          cpus: '1'
  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: 64M
          cpus: '0.5'

nacos+sentinel+gateway

  • docker-compose可以通过服务名访问服务,避免了每次修改ip和端口,便于移植
yaml 复制代码
version: '3'
networks: #自定义网络myapp,为了只有这些服务可以在该网络内相互访问
  myapp:
    driver: bridge
services: #将容器抽象成服务
  nacos: #注册中心(官方镜像)
    image: nacos/nacos-server:latest
    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关闭,则会报错
解决:启动防火墙,并一定注意开放平台访问的端口

bash 复制代码
systemctl start firewalld.service
firewall-cmd --zone=public --add-port=[port]/tcp --permanent
firewall-cmd --reload

docker-compose.yml修改mysql密码,重启后不生效

描述 :修改后的密码无法连接mysql,但旧密码依然可以
问题 :因为带有旧有登录信息的卷依然在
解决docker volume ls 找到旧卷,docker volume rm删除旧卷
注意!!!千万不要移除mysql容器重启,虽然密码生效了,但是删库,所有数据都没了

相关推荐
ALex_zry11 分钟前
跨Linux发行版CPU指令集兼容性深度解析与实践指南
linux·运维·服务器
Harbor Lau1 小时前
Linux常用中间件命令大全
linux·运维·中间件
漫谈网络1 小时前
基于 Netmiko 的网络设备自动化操作
运维·自动化·netdevops·netmiko
꧁坚持很酷꧂2 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
时迁2472 小时前
【k8s】k8s是怎么实现自动扩缩的
云原生·容器·kubernetes·k8s
小诸葛的博客3 小时前
详解Linux中的定时任务管理工具crond
linux·运维·chrome
一默19913 小时前
CentOS 7.9升级OpenSSH到9.9p2
linux·运维·centos
BranH4 小时前
Linux系统中命令设定临时IP
linux·运维·服务器
极小狐5 小时前
极狐GitLab 项目功能和权限解读
运维·git·安全·gitlab·极狐gitlab
宁酱醇5 小时前
GitLab_密钥生成(SSH-key)
运维·ssh·gitlab