常见环境部署
这里整理一些我个人常用的运行命令,随时补充,命令涉及到:
绑定默认左侧物理机右侧容器
# 个人习惯将容器都放在网桥上,在创建容器之前应该先创建网桥,启动容器时使用--network指定网桥
$ docker network create mynet
$ docker run --network mynet ....
容器可能面对时区问题,可在创建容器时通过环境变量指定时区,如果无效就使用物理机的时区文件覆盖掉容器内的时区文件
# 环境变量指定时区
$ docker run -e TZ=Asia/Shanghai ...
# CentOS发行版的命令
$ docker run -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro ...
# Ubuntu发行版的命令
......
# 开发相关
# 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
这里补充一个可能会用到的操作,例如我使用的是国外的服务器,国内访问延迟较高备份较慢,因为Navicat是依次获取每张表的表结构和数据,延迟较高时会影响效率,可以直接在远程服务器中使用dump
命令将数据库转存为SQL文件,然后使用FPT工具将SQL文件下载下来即可,这里记录一下操作命令
# 进入到MySQL容器中
$ docker exec -it mysql /bin/bash
# 将指定库导出SQL到指定位置,推荐`/var/lib/mysql/`目录下,因为与宿主机做了目录映射可以直接下载
$ mysqldump -u [用户名] -p [数据库名] > /var/lib/mysql/[文件名].sql
# Redis
Redis镜像中并没有提供配置文件,要想自定义配置需要手动下载配置文件 (opens new window),然后上传到服务器
# 在执行命令前请先将配置文件上传至服务器
# 注意修改配置文件中的bind与requirepass
# 设置bind为0.0.0.0为允许外网访问,requirepass为访问密码
# 下载镜像
$ docker pull redis:5.0.10
# 初始化目录,将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:5.0.10 redis-server /opt/conf/redis.conf
# docker compose
services:
redis:
image: redis:5.0.10
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"
# 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 8847: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:
- "8847:8080"
volumes:
- "./sentinel:/app"
command: java -Dproject.name=sentinel -jar /app/sentinel-dashboard-1.8.6.jar
# 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 间内部通信口 |
# 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"
# 青龙面板
# 下载镜像(新版本的青龙面板配置文件以及数据库目录发生改变,注意版本)
$ docker pull whyour/qinglong:2.16.5
# 启动容器(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"
# 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"
上次更新: 2024-09-24, 19:37:16