docker compose使用

一年 / 2023-08-17 / 原文

前置

初始化文件夹,网络。
init_dir.sh

#!/bin/env bash
# 生成默认配置

HOME=$(pwd)

# docker network free

init_network(){
    NETWORK_NAME="free"
    CREATED=$(docker network ls -f name=${NETWORK_NAME} | wc -l)
    if [ '2' -ne ${CREATED} ]
    then
        docker network create ${NETWORK_NAME}
        echo  created docker network ${NETWORK_NAME}
    fi
}

# nginx
init_nginx(){
    APP_NAME="nginx"
    if [ -e ${APP_NAME} ];then return;fi
    cd ${HOME}
    mkdir ${APP_NAME} && cd ${APP_NAME}
    if [ ! -e etc_nginx ];then mkdir etc_nginx;fi
    # 创建软连接,方便静态资源管理
    # ln -s target_dir link_name
    docker run --name tmp-container-nginx -d nginx:stable-alpine
    docker cp tmp-container-nginx:/etc/nginx/nginx.conf $(pwd)/etc_nginx/nginx.conf
    docker cp tmp-container-nginx:/etc/nginx/conf.d $(pwd)/etc_nginx/conf.d/
    docker rm -f tmp-container-nginx
}

# mysql
init_mysql(){
    APP_NAME="mysql"
    if [ -e ${APP_NAME} ];then return;fi
    cd ${HOME}
    mkdir ${APP_NAME} && cd ${APP_NAME}
    if [ ! -e etc ];then mkdir etc;fi
    if [ ! -e var_lib_mysql ];then mkdir var_lib_mysql;fi
    docker run --rm --name tmp-container-mysql -d -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
    docker cp tmp-container-mysql:/etc/my.cnf $(pwd)/etc/my.cnf
    sed -i "s@/var/run/mysqld/mysqld.sock@/var/lib/mysql/mysql.sock@g" etc/my.cnf
    docker rm -f tmp-container-mysql
}

# seata
init_seata(){
    APP_NAME="seata"
    if [ -e ${APP_NAME} ];then return;fi
    cd ${HOME}
    mkdir ${APP_NAME} && cd ${APP_NAME}
    docker run --rm --name tmp-container-seata -d seataio/seata-server:1.7.0
    docker cp tmp-container-seata:/seata-server/resources/application.yml .
    docker rm -f tmp-container-seata
}

init_nginx
init_mysql
# 手动修改配置yml文件,把seata的registry配置为nacos
init_seata
init_network

启动脚本

常用容器 docker-compose.yml

version: "3"
services:
  nginx:
    container_name: nginx
    image: nginx:stable-alpine-slim
    ports:
      - "443:443"
    networks:
      - free
    volumes:
      - ./nginx/etc_nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/etc_nginx/nginx.conf:/etc/nginx/nginx.conf:rw
      # - ./nginx/js:/js
    mem_limit: 32m

  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
    networks:
      - free
    volumes:
      - ./mysql/var_lib_mysql:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    mem_limit: 1024m

  redis:
    container_name: redis
    image: redis:7.0-alpine
    ports:
      - "6379:6379"
    networks:
      - free
    volumes:
      - ./redis/data:/data
    command: --appendonly yes --requirepass "123456"
    mem_limit: 128m

  # postgres:
  #   container_name: postgres
  #   image: postgres:alpine
  #   ports:
  #     - '5432:5432'
  #   environment:
  #     - POSTGRES_PASSWORD=123456
  #     - TZ=Asia/Shanghai
  #   networks:
  #     - free
  #   volumes:
  #     - ./postgres/var_lib_postgresql_data:/var/lib/postgresql/data
  #   mem_limit: 1024m
  
  mongo:
    container_name: mongo
    image: mongo:6.0
    ports:
      - "27017:27017"
    networks:
      - free
    volumes:
      - ./mongo/data:/data/db
      - ./mongo/configdb:/data/configdb
    mem_limit: 512m
    command: --auth

  nacos:
    container_name: nacos
    image: nacos/nacos-server:v2.2.1-slim
    ports:
      - "8848:8848"
      - "9848:9848"
    environment:
      - MODE=standalone
      - NACOS_AUTH_ENABLE=true
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    networks:
      - free
    volumes:
      - ./nacos/home_nacos_data:/home/nacos/data
    mem_limit: 1024m

  seata:
    container_name: seata
    image: seataio/seata-server:1.7.0
    ports:
      - "7091:7091"
      - "8091:8091"
    networks:
      - free
    volumes:
      - ./seata/application.yml:/seata-server/resources/application.yml
    mem_limit: 1024m
    depends_on:
      - nacos

  mqnamesrv:
    container_name: mqnamesrv
    image: apache/rocketmq:4.9.4
    ports:
      - "9876:9876"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
    networks:
      - free
    mem_limit: 256m
    command: ./mqnamesrv
  
  mqbroker:
    container_name: mqbroker
    image: apache/rocketmq:4.9.4
    ports:
      - "10909:10909"
      - "10911:10911"
      - "10912:10912"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    networks:
      - free
    mem_limit: 512m
    command: ./mqbroker -n mqnamesrv:9876
    depends_on:
      - mqnamesrv

  mqng:
    container_name: mqng
    image: styletang/rocketmq-console-ng
    ports:
      - "9877:8080"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS=-Drocketmq.namesrv.addr=mqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
    networks:
      - free
    mem_limit: 1024m
    depends_on:
      - mqnamesrv
      - mqbroker



networks:
  free:
    name: free
    # 使用已有网络
    external: true
# networks:
#   free:
#     name: tmp

其他

更新镜像

docker compose pull

启动

docker compose up -d

停止

docker compose stop

如果配置文件有更新,不能直接docker compose restart需要先stopup

nacos经常有破坏性更新,需要更新配置文件才能正常启动,建议固定好版本号。
其他几个经常保持最新版,未发现问题。