ZHE知识库 ZHE知识库
首页
JAVA
中间件
易学
小说漫画
其他
Source (opens new window)
首页
JAVA
中间件
易学
小说漫画
其他
Source (opens new window)
  • 首页
  • 记事本
  • 笔记杂项
  • GIT版本控制
  • 操作系统笔记

  • Docker笔记

    • 常用命令笔记
    • 常见环境部署
      • 开发环境
        • Java
        • MySQL
        • Redis
        • Nginx
        • Minio
        • ElasticSearch
        • RabbitMQ
        • InfluxDB 2
      • SpringCloud
        • Nacos
        • Sentinel
        • Seata
      • 科学上网
        • 内网穿透FRP
        • 内网穿透NPS
        • WireGuardVPN
      • PHP-FPM
      • Typecho
      • 青龙面板
      • EasyImage
  • 首页
  • Docker笔记
张涵哲
2023-10-17
目录

常见环境部署

这里整理记录一些我个人常用的环境部署的docker run命令,随时用到新的随时补充,这里说几点注意事项

  1. 命令涉及到:绑定默认左侧物理机右侧容器
# 个人习惯将容器都放在网桥上,在创建容器之前应该先创建网桥,启动容器时使用--network指定网桥
$ docker network create mynet
$ docker run --network mynet ....
  1. 容器可能面对时区问题,可在创建容器时通过环境变量指定时区,如果无效就使用物理机的时区文件覆盖掉容器内的时区文件
# 环境变量指定时区
$ docker run -e TZ=Asia/Shanghai ...

# CentOS发行版的命令
$ docker run -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro ...

# Ubuntu发行版的命令
......
  1. 命令中如有涉及裸启容器后拷贝文件后删除的步骤,请容器裸启后稍等片刻在进行拷贝,部分设备/容器启动速度较慢请给予充足的初始化时间

# 开发环境

# Java

启用jar包的命令

docker run --name practice \
   --restart always \
   -e TZ=Asia/Shanghai \
   -p 8080:8080 \
   -v ./practice:/app \
   -d openjdk:8 java -jar -Xmx128m /app/practice.jar
# doker compose
services:
  practice:
    image: openjdk:8
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "8080:8080"
    volumes:
      - ./practice:/app
    command: java -Xmx128m -jar /app/practice.jar

# MySQL

代码块中使用的是MySQL5版本,MySQL8同理,经测试8.0.36-debian按照这个流程同样可以成功

# 下载镜像
$ docker pull mysql:5.7.41

# 初始化目录
$ mkdir -p ./mysql

# 裸启动
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.41

# 拷贝文件
$ docker cp mysql:/etc/mysql ./mysql/conf
$ docker cp mysql:/var/lib/mysql ./mysql/data

# 删除后重启容器
$ docker rm -f mysql
$ docker run --name mysql \
   --restart always \
   -e TZ=Asia/Shanghai \
   -p 3306:3306 \
   -v ./mysql/data:/var/lib/mysql \
   -v ./mysql/logs:/var/log/mysql \
   -v ./mysql/conf:/etc/mysql \
   -d mysql:5.7.41
# docker compose
services:
  mysql:
    image: mysql:5.7.41
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql

这里补充一个可能会用到的操作,使用 MySQL Dump + FTP 进行数据导出导入

数据导出

# 进入到MySQL容器中
$ docker exec -it mysql /bin/bash

# 将数据库库导出为SQL文件到指定位置,推荐/var/lib/mysql/,因为与宿主机做了目录映射
$ mysqldump -u [用户名] -p [数据库名] > /var/lib/mysql/文件名.sql

数据导入

# 进入到MySQL容器中
$ docker exec -it mysql /bin/bash

# 先创建数据库,如果数据库已存在可跳过该步骤
$ mysql -u [用户名] -p -e "CREATE DATABASE [数据库名] CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"

# 执行SQL文件还原数据库
$ mysql -u [用户名] -p [数据库名] < /var/lib/mysql/文件名.sql

# Redis

Redis镜像中并没有提供配置文件,想自定义配置需手动下载配置文件后上传到服务器,可自行选择国内下载 (opens new window)和国外下载 (opens new window)

# 在执行命令前请先将配置文件上传至服务器
# 注意修改配置文件中的bind与requirepass
# 设置bind为0.0.0.0为允许外网访问,requirepass为访问密码

# 下载镜像
$ docker pull redis:7.4.2-alpine

# 初始化目录,将redis.conf配置文件上传至./redis/conf/redis.conf
$ mkdir -p ./redis/conf

# 启动容器
$ docker run --name redis \
   --restart always \
   -e TZ=Asia/Shanghai \
   -p 6379:6379 \
   -v ./redis/data:/data \
   -v ./redis/conf:/opt/conf \
   -d redis:7.4.2-alpine redis-server /opt/conf/redis.conf
# docker compose
services:
  redis:
    image: redis:7.4.2-alpine
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - "6379:6379"
    volumes:
      - "./redis/data:/data"
      - "./redis/conf:/opt/conf"
    command: redis-server /opt/conf/redis.conf

# Nginx

# 下载镜像
$ docker pull nginx:1.22.0

# 初始化目录
$ mkdir -p ./nginx/ssl

# 裸启动
$ docker run -d --name nginx nginx:1.22.0

# 拷贝文件
$ docker cp nginx:/etc/nginx ./nginx/conf
$ docker cp nginx:/usr/share/nginx ./nginx/webs

# 删除裸启的容器
$ docker rm -f nginx

# 正式启动容器
$ docker run --name nginx \
   --restart always \
   -e TZ=Asia/Shanghai \
   -p 80:80 \
   -p 443:443 \
   -v ./nginx/conf/:/etc/nginx \
   -v ./nginx/webs/:/usr/share/nginx \
   -v ./nginx/logs/:/var/log/nginx \
   -v ./nginx/ssl/:/ssl \
   -d nginx:1.22.0
services:
  nginx:
    image: nginx:1.22.0
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./nginx/conf/:/etc/nginx"
      - "./nginx/webs/:/usr/share/nginx"
      - "./nginx/logs/:/var/log/nginx"
      - "./nginx/data/:/data"

# Minio

高版本 Minio 将管理地址和 API 请求地址分开了,需要在运行容器时指定端口号才能映射,console-address 为管理地址,address 为 API 请求地址

# 下载镜像
$ docker pull minio/minio:latest

# 启动容器
$ docker run --name minio \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e MINIO_ACCESS_KEY=admin \
   -e MINIO_SECRET_KEY=123456789 \
   -p 9000:9000 \
   -p 9001:9001 \
   -v ./minio/data:/data \
   -v ./minio/conf:/root/.minio \
   -d minio/minio:latest server /data --console-address ":9000" --address ":9001"

# ElasticSearch

# 下载镜像
$ docker pull elasticsearch:7.12.1

# 初始化目录
$ mkdir ./es

# 裸启动
$ docker run --name es \
   -e TZ=Asia/Shanghai \
   -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
   -e "discovery.type=single-node" \
   -d elasticsearch:7.12.1

# 拷贝文件
$ docker cp es:/usr/share/elasticsearch/data ./es
$ docker cp es:/usr/share/elasticsearch/plugins ./es

# 删除后重启容器
$ docker rm -f es

$ docker run --name es \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
   -e "discovery.type=single-node" \
   -p 9200:9200 \
   -p 9300:9300 \
   -v ./es/data:/usr/share/elasticsearch/data \
   -v ./es/plugins:/usr/share/elasticsearch/plugins \
   -d elasticsearch:7.12.1

Kibana

$ docker run --name kibana \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e ELASTICSEARCH_HOSTS=http://192.168.1.10:9200 \
   -p 5601:5601 \
   -d kibana:7.12.1

# RabbitMQ

# RabbitMQ配置文件参考地址
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/docs/rabbitmq.conf.example

# 裸启容器
$ docker run --name rabbitmq --hostname rabbitmq -d rabbitmq:3.8.34-management

# 拷贝配置文件
$ mkdir -p ./rabbitmq
$ docker cp rabbitmq:/etc/rabbitmq ./rabbitmq/conf
$ docker cp rabbitmq:/var/lib/rabbitmq ./rabbitmq/data

# 删除裸启的容器
$ docker rm -f rabbitmq

# 启动RabbitMQ
$ docker run --name rabbitmq \
   --hostname rabbitmq \
   --restart always \
   -e RABBITMQ_DEFAULT_USER=guest \
   -e RABBITMQ_DEFAULT_PASS=guest \
   -p 5672:5672 \
   -p 15672:15672 \
   -v ./rabbitmq/conf:/etc/rabbitmq \
   -v ./rabbitmq/data:/var/lib/rabbitmq \
   -d rabbitmq:3.8.34-management

# 启用管理地址,镜像以management结尾表示自带管理地址,如果没有管理地址可执行该命令启动插件
$ docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
端口 作用
15672 管理界面UI使用的端口
15671 管理监听端口
5672,5671 AMQP 0-9-1 without and with TLS client 端通信口
4369 ( epmd ) 代表 Erlang 端口映射守护进程,erlang 发现口
25672 ( Erlang distribution ) server 间内部通信口

# InfluxDB 2

待补充
待补充
https://www.cnblogs.com/juanxincai/p/16964391.html

# 备份数据
$ influx backup \
   /var/lib/influxdb/backup/backup_$(date '+%Y-%m-%d_%H-%M') \
   --host http://127.0.0.1:8086 \
   --org orgName --bucket bucketName \
   -t tokenzhelitianinfluxdbdetoken

# 还原数据
influx restore \
   /var/lib/influxdb/backup/backup_2025-03-10_10-14 \
   --host http://127.0.0.1:8086 \
   --org orgName --bucket bucketName \
   --new-bucket bucketName \
   -t tokenzhelitianinfluxdbdetoken

# SpringCloud

# Nacos

单机模式 连接MySQL 鉴权启动

# 下载镜像
$ docker pull nacos-server:v2.2.0.1

# 启动容器,访问地址为http://ip:8848/nacos
$ docker run --name nacos \
   --restart always \
   -e JVM_XMS=256m \
   -e JVM_XMX=256m \
   -e MODE=standalone \
   -e NACOS_AUTH_IDENTITY_KEY=serverIdentity
   -e NACOS_AUTH_IDENTITY_VALUE=security
   -e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
   -e SPRING_DATASOURCE_PLATFORM=mysql
   -e MYSQL_SERVICE_HOST=mysql
   -e MYSQL_SERVICE_PORT=3306
   -e MYSQL_SERVICE_DB_NAME=nacos
   -e MYSQL_SERVICE_USER=root
   -e MYSQL_SERVICE_PASSWORD=123456
   -p 8848:8848 \
   -p 9848:9848 \
   -v ./nacos/conf:/home/nacos/conf \
   -v ./nacos/data:/home/nacos/data \
   -v ./nacos/logs:/home/nacos/logs \
   -d nacos/nacos-server:v2.2.0.1
services:
  nacos:
    image: nacos/nacos-server:v2.2.0.1
    restart: always
    environment:
      - PREFER_HOST_MODE=ip
      - MODE=standalone
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
    ports:
      - "8848:8848"
      - "9848:9848"
    volumes:
      - ./nacos/standalone-logs/:/home/nacos/logs

# Sentinel

官方貌似没有提供 Sentinel 的 Docker 镜像,这里使用openjdk:8手动运行

docker run --name sentinel \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e auth.enabled=true \
   -e sentinel.dashboard.auth.username=sentinel \
   -e sentinel.dashboard.auth.password=sentinel123 \
   -p 8080:8080 \
   -v ./sentinel:/app \
   -d openjdk:8 java -Dproject.name=sentinel -jar /app/sentinel-dashboard-1.8.6.jar
# docker compose
services:
  sentinel:
    image: openjdk:8
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
      - "auth.enabled=true"
      - "sentinel.dashboard.auth.username=sentinel"
      - "sentinel.dashboard.auth.password=sentinel123"
    ports:
      - "8080:8080"
    volumes:
      - "./sentinel:/app"
    command: java -Dproject.name=sentinel -jar /app/sentinel-dashboard-1.8.6.jar

# Seata

seata 由阿里巴巴团队开发,后交给 apache 进行管理,新版下载apache/seata-server,旧版下载seataio/seata-server

  • 7091 端口用于 Seata 集群内部通信
  • 8091 端口为 Seata 服务主端口
# 下载镜像
$ docker pull seataio/seata-server:1.6.1

# 初始化目录
$ mkdir -p ./seata

# 裸启动
$ docker run --name seata -d seataio/seata-server:1.6.1

# 拷贝文件
$ docker cp seata:/seata-server/resources ./seata/config

# 删除后重启容器
$ docker rm -f seata
$ docker run --name seata \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e SEATA_IP=192.168.1.106 \
   -e SEATA_PORT=8091 \
   -p 8091:8091 \
   -v ./seata/config:/seata-server/resources \
   -d seataio/seata-server:1.6.1
# docker compose
services:
  seata:
    image: seataio/seata-server:1.6.1
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
      - "SEATA_IP=192.168.1.106"
      - "SEATA_PORT=8091"
    ports:
      - "8091:8091"
    volumes:
      - "./seata/config:/seata-server/resources"

# 科学上网

# 内网穿透FRP

服务端 frps

# 创建 frps 目录作为工作空间
$ mkdir frps

# 创建服务端配置文件
$ vim frps/frps.toml

# 启动服务端 frps
$ docker run --name frps \
   --restart always \
   --network host \
   -e TZ=Asia/Shanghai \
   -v ./frps/frps.toml:/etc/frps/frps.toml \
   -d fatedier/frps:v0.61.2 -c /etc/frps/frps.toml
# 服务器信息
bindAddr = "公网IP"
bindPort = 7000

# 服务端控制面板
webServer.addr = "公网IP"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "123456"

# 配置服务端的鉴权
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 只打印warn级别的日志
log.level = "warn"
# log.to = "/opt/frps/frps.log"

客户端 frpc

# 创建 frpc 目录作为工作空间
$ mkdir frpc

# 创建服务端配置文件
$ vim frpc/frpc.toml

# 启动客户端 frpc
$ docker run --name frpc \
   --restart always \
   -e TZ=Asia/Shanghai \
   -v ./frpc/frpc.toml:/etc/frpc/frpc.toml \
   -d fatedier/frpc:v0.61.2 -c /etc/frpc/frpc.toml
# 与服务端建立连接
serverAddr = "服务端IP地址"
serverPort = 7000

# 配置Token鉴权
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 配置日志信息
log.level = "warn"
# log.to = "/opt/frpc/frpc.log"

# 内网穿透隧道
[[proxies]]
name = "SSH"
annotations = {title = "SSH远程连接"}
type = "tcp"
localIP = "192.168.137.10"
localPort = 22
remotePort = 8001

# 内网穿透NPS

# WireGuardVPN

# PHP-FPM

# 下载镜像
$ docker pull php:7.2-fpm

# 初始化目录
$ mkdir -p ./php

# 裸启容器
$ docker run -d --name php php:7.2-fpm

# 拷贝配置文件
$ docker cp php:/usr/local/etc/php ./php/conf

# 删除裸启的容器
$ docker rm -f php

# 正式启动容器
$ docker run -d --name php \
   --restart always \
   -e TZ=Asia/Shanghai \
   -p 9000:9000 \
   -v ./nginx/webs:/var/www/html \
   -v ./php/conf:/usr/local/etc/php \
   php:7.2-fpm

# Typecho

第三方镜像 80x86 轻量级

# 下载镜像
$ docker pull 80x86/typecho:v1.2.1-rc.2-amd64

# 裸启容器
$ docker run --name typecho -d 80x86/typecho:v1.2.1-rc.2-amd64

# 拷贝数据,data对应typecho的usr,app对应typecho的根目录,因为镜像内对usr做了软连接,所以这里需要分别映射出来
$ docker cp typecho:/data ./typecho/data
$ docker cp typecho:/app ./typecho/app

# 删除裸启的容器
$ docker rm -f typecho

# 启动容器
$ docker run --name typecho \
   --restart always \
   -e PHP_TZ=Asia/Shanghai \
   -e PHP_MAX_EXECUTION_TIME=600 \
   -p 80:80 \
   -v ./typecho/app:/app \
   -v ./typecho/data:/data \
   -d 80x86/typecho:v1.2.1-rc.2-amd64

官方镜像

# 下载镜像
$ docker pull joyqi/typecho:1.2.1-php7.3-apache

# 裸启容器
$ docker run --name typecho \
   -e TIMEZONE=Asia/Shanghai \
   -e TYPECHO_SITE_URL=https://typecho.hanzhe.site \
   -d joyqi/typecho:1.2.1-php7.3-apache

# 拷贝数据
$ docker cp typecho:/app/usr ./typecho

# 删除后重启容器
$ docker rm -f typecho
$ docker run --name typecho \
   -e TIMEZONE=Asia/Shanghai \
   -e TYPECHO_SITE_URL=https://typecho.hanzhe.site \
   -p 80:80 \
   -v ./typecho:/app/usr \
   -d joyqi/typecho:1.2.1-php7.3-apache
# docker compose
services:
  typecho:
    image: joyqi/typecho:1.2.1-php7.3-apache
    restart: always
    environment:
      - "TIMEZONE=Asia/Shanghai"
      - "TYPECHO_SITE_URL=https://typecho.hanzhe.site"
    ports:
      - "80:80"
    volumes:
      - "./typecho:/app/usr"

# 青龙面板

2.16.5 及以前的版本

$ docker run --name ql \
   --restart always \
   -p 5700:5700 \
   -v ./ql:/ql/data \
   -dit whyour/qinglong:2.16.5
# docker compose
services:
  ql:
    image: whyour/qinglong:2.16.5
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
    volumes:
      - "./ql:/ql/data"

2.18.1

$ docker run --name ql \
   --restart always \
   --hostname qinglong \
   -e QlBaseUrl="/" \
   -e QlPort="5700" \
   -p 5700:5700 \
   -v ./ql:/ql/data \
   -d whyour/qinglong:2.18.1
# docker compose
services:
  ql:
    image: whyour/qinglong:2.18.1
    container_name: ql
    restart: always
    networks:
      - channel
    hostname: qinglong
    environment:
      - "TZ=Asia/Shanghai"
      - "QlBaseUrl=/"
      - "QlPort=5700"
    volumes:
      - "./ql:/ql/data"

# EasyImage

$ docker run --name easyimage \
   --restart always \
   -e TZ=Asia/Shanghai \
   -e PUID=1000 \
   -e PGID=1000 \
   -e DEBUG=false \
   -v ./easyimage/config:/app/web/config \
   -v ./easyimage/i:/app/web/i \
   -itd ddsderek/easyimage:v2.8.4
# docker compose
services:
  easyimage:
    image: ddsderek/easyimage:v2.8.4
    restart: always
    environment:
      - "TZ=Asia/Shanghai"
      - "PUID=1000"
      - "PGID=1000"
      - "DEBUG=false"
    volumes:
      - "./easyimage/config:/app/web/config"
      - "./easyimage/i:/app/web/i"
上次更新: 2025-03-15, 18:19:38
常用命令笔记

← 常用命令笔记

Theme by Vdoing | Copyright © 2023-2025 Zhe | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式