使用docker安装mysql, redis, kafka等各类服务

前言

大致说来,docker的作用如下

绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用。

用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会需要消耗更多的硬件资源,不会明显降低性能。也就是实现了标准化、集装箱

文章比较长,想要搜寻特定的服务的docker安装,善用左侧目录

如果想要简单使用,可以看答主的这一片文章:

https://blog.csdn.net/2301_76154806/article/details/128781197

持续更新中 ...

笔墨不易,赠人玫瑰,手留余香

1. mysql

确定好安装哪一个mysql版本,5版本和8版本的驱动名称不同

1.1 默认配置安装

1. 下载镜像

docker pull mysql:版本号

版本号: 一般是5.7或者8
5版本的安装比较简单, 不用手动即可远程访问

2. 创建应用容器docker run --name some-mysql -d -t -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:版本号

'my-secret-pw'是你设置的mysql的root用户的密码

1.2 自定义配置安装

如果需要配置mysql的一些运行参数,可以参考下面的两种方式.

1. [推荐]带着配置参数创建应用容器

docker run --name some-mysql -d -t -p 3306:3306 -e 参数名称1=参数名称1的值 -e 参数名称2=参数名称2的值 mysql:版本号 --character-set-server=utf8mb4

例: docker run --name some-secret-mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

常见参数 - 强制参数 1. MYSQL_ROOT_PASSWORD=root

将mysql的root用户密码设置为root

mysql8版本的docker安装==========

docker pull mysql:8.0.18

docker run -di --name=mysql8 -p 3306:3306 -v /usr/local/tmp:/etc/mysql/tmp --privileged=true -e MYSQL_ROOT_PASSWORD=xxx mysql:8.0.18

docker exec -it mysql8 /bin/bash

mysql -uroot -pxxx

use mysql;

select host,user from user; 让root能远程连接,host修改为"%",如果是的就不用修改了

navicate for mysql 远程连接
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

修改密码为用不过期

    ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;

修改密码并指定加密规则为 mysql_native_password

    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

刷新权限

    FLUSH PRIVILEGES;

这样就可以远程连接数据库了;

  • 可选参数

  • MYSQL_DATABASE=mydb 在mysql容器创建之后,在mysql中新建一个名称为mydb的database

  • MYSQL_USER=selton MYSQL_PASSWORD=seltonpassword 创建一个名为selton的mysql用户,并设置他的密码为seltonpassword,这个用户对所有由MYSQL_DATABASE参数创建出来的database具有管理员权限

  • --character-set-server=utf8mb4 相当于我们在mysql的cnf配置文件中的一些键值对的配置,这里就是将character-set-server,也就是mysql创建默认字符集选为utf8mb4,如果使用navicat连接工具创建数据库,没有选择创建的数据库字符类型,将采用上面设置的utf8mb4字符类型

  • --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 在5.7版本默认有一个sql_mode里带有only_full_group_by的配置,这个配置强制要求在带有groupby的查询语句中,select的列必须在groupby的结果列之内,否则会失败,这个条件太严格,一般情况下不加,所以一般情况下是需要加上上面这个配置的.

  • 如果想要查看完整的可配置参数,运行如下命令,记得将tag替换成你下载的mysql版本

docker run -it --rm mysql:tag --verbose --help

2. 将本地的配置文件映射到应用容器中

docker run --name some-mysql-p 3306:3306-v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

在容器的宿主机中新建这样一个配置文件my.cnf(名字就用这个),然后将/my/custom替换成这个宿主机中的my.cnf配置文件所在的文件夹的绝对路径,这样mysql容器在创建的时候就会使用my.cnf中的所有配置来创建mysql,同样,这些在my.cnf中的配置,都可以使用-e 参数1=参数1的值的方式来配置

: mysql常见配置

port = 3306 #默认
pid-file =  /data/mysql/mysql.pid
basedir =  /usr/local/mysql/ #程序安装目录
symbolic-link = 0  #多客户访问同一数据库,该选项默认开启
tmpdir =  /usr/local/mysql/tmp/ #此目录被 MySQL用来保存临时文件
open_files_limit = 65535 #打开时,和max_connections对比,取大数
datadir = /var/lib/mysql  #数据库目录
log-error = /var/lib/mysql/error.log
slow_query_log=on   #开启慢查询日志相关
long_query_time=2   #默认10秒
slow_query_log_file = /var/log/mysql/slow_query.log  #慢查询日志路径
log-queries-not-using-indexes = 1   #记录没有使用索引的sql

socket=/var/lib/mysql/mysql.sock  #该条配置需在[client]段同时配置
default_storage_engine=InnoDB
innodb_file_per_table = on     #InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间
innodb_buffer_pool_size=4G     #生产中要改,建议为操作系统内存的70%-80%,需重启服务生效
skip_name_resolve = on         #忽略主机名解析,提高访问速度(注意配置文件中使用主机名将不能解析)
lower_case_table_names = 1     #忽略表单大小写
character-set-server=utf8mb4   #设定默认字符为utf8mb4

注意: 如果使用了数据卷映射数据文件, 此时mysql的大部分配置包括密码都是跟着数据文件走的,docker创建的命令不再起作用

2. tomcat

应用(java)服务器

2.1 安装

1.下载镜像docker pull tomcat:版本号

7,8,9版本现在较为常用

2.创建应用容器

如果你想测试一下,运行如下命令,访问ip:8080,你会访问到tomcat的首页

docker run --name some-tomcat -p 8080:8080 -d -t tomcat:版本号

不过,一般tomcat都是用来发布一个webapp的,所以,如果你想发布一个webapp,如下

如果你得到的是war,请解压为文件夹,然后将文件夹重命名为ROOT

docker run --name some-tomcat -p 8080:8080 -d -t -v /root/selton/mywebapp:/usr/local/tomcat/webapps tomcat:版本号

/root/selton/mywebapp, 这个文件夹里面有你的ROOT文件夹

自定义配置

如果你需要修改tomcat的conf目录的一些配置文件,需要将一份tomcat原本含有的

3. gogs

git私服

新建文件docker-compose.yml

输入内容

version: '2' services: Mysql: image: gogs/gogs:0.11.79 container_name: gogs ports: - "9876:22" - "9092:3000"

然后docker-compose up -d启动

访问本机ip:8080

这个设置

ports:
  - "8070:22"
  - "8080:3000"

将容器中的22,3000端口分别映射为了宿主机器的8070和8080端口

也就是,我们需要保证宿主机器,也就是本机,生成docker-compose.yml的机器的端口 8070和8080没有被占用

gogs采用的是在网页端配置 -- 值得借鉴

将3000端口用docker映射为80端口有风险问题 具体就是重启的时候报错 无法启动 bind 80 permission denied

此时ini配置文件里面的port其实应该是3000 然后docker将宿主机80映射到这个3000 而内部不应该是80

gogs docker版 配置文件路径 /data/gogs/conf/app.ini

https://github.com/gogs/gogs/issues/3503

安装界面

首先是

数据库设置

直接看到数据库名称

我们需要有一个可以外部访问的数据库连接,并且有一个数据库,就用例子的名称->gogs,我们需要在数据库连接中新建一个叫gogs的数据库

如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集

需要修改数据库主机ip,127.0.0.1改为数据库暴露的ip

填写数据库的用户密码

接下来是应用基本设置

修改域名为我们刚才的安装gogs的机器的ip

接下来修改url

修改应用url的localhost为安装gogs机器的ip

注意,如果这里使用了docker做了端口映射,将3000改为映射的端口

接下来就是可选设置部分

邮件服务设置不管

点开服务器和其他服务设置

取消勾选 启用验证码服务

勾选 禁止用户自主注册 启动登录访问限制

取消用户自主注册,那么一定意为着,我们需要一个超级用户,由超级用户创建帐号并分发

点开管理员帐号设置

输入基本信息,邮箱可以随便输入

大功告成,点击立即安装

version: '2'
services:
  Mysql:
    image: mysql:5.6
    container_name: gogsMysql5.6
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - /root/gogs/mysqlConf:/etc/mysql/conf.d
      - /root/gogs/createSh:/docker-entrypoint-initdb.d
  Gogs:
    depends_on:
      - Mysql
    image: gogs/gogs:0.11.79
    container_name: gogs
    ports:
      - "8070:22"
      - "8080:3000"
    volumes:
      - /var/gogs:/data

4. jira

从日志 2019-12-09 10:25:49,214 JIRA-Bootstrap INFO [c.a.j.config.database.SystemDatabaseConfigurationLoader] Reading database configuration from /var/jira/dbconfig.xml

可以看到jira启动会从这个配置中读取数据库配置

在宿主机中新建配置文件

<?xml version="1.0" encoding="UTF-8"?>
<jira-database-config>
<name>defaultDS</name>
<delegator-name>default</delegator-name>
<database-type>mysql</database-type>
<jdbc-datasource>
<url>jdbc:mysql://10.2.132.13:3306/jira?useUnicode=true&amp;characterEncoding=UTF8&amp;sessionVariables=storage_engine=InnoDB
</url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<username>root</username>
<password>root</password> 
<!--以下参数可以不用配置 -->
<pool-min-size>20</pool-min-size>
<pool-max-size>20</pool-max-size>
<pool-max-wait>30000</pool-max-wait>
<validation-query>select 1</validation-query>
<min-evictable-idle-time-millis>60000</min-evictable-idle-time-millis>
<time-between-eviction-runs-millis>300000
</time-between-eviction-runs-millis>
<pool-max-idle>20</pool-max-idle>
<pool-remove-abandoned>true</pool-remove-abandoned>
<pool-remove-abandoned-timeout>300</pool-remove-abandoned-timeout>
<pool-test-while-idle>true</pool-test-while-idle>
<validation-query-timeout>3</validation-query-timeout>
</jdbc-datasource>
</jira-database-config>

修改相关数据库配置

docker run -p 10909:8080 --name some-jira -d -e TZ='Asia/Shanghai' -v /my/conf: haxqer/jira

5. clickhouse

clickhouse在dockerhub的官网

docker run -dit --name some-clickhouse -e CLICKHOUSE_DB=test1 -e CLICKHOUSE_USER=root -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=hexin -p 9000:9000 -p 8123:8123 clickhouse/clickhouse-server
用户名root,密码hexin,连接端口8123

6. redis

在Reids 4.x之后,Redis新增了模块功能特性,通过外部拓展,可以实现新的Redis命令,通过写c语言并编译出.so文件,可实现代码执行漏洞。

针对未授权或弱口令的Redis服务,攻击者通过构造特定请求,成功利用漏洞可在目标服务器上执行任意命令,风险极大。攻击者常常使用这个漏洞将用户的服务器变为"肉鸡","矿机"

修复的方式有很多种, 最有效的方式是redis仅在内网环境中使用,最简单的方式是redis连接的时候指定密码

下面是docker创建redis容器并指定密码

尽管现在已经有了6.x版本,但是它是redis有史以来最大的一个版本,所以即使它是稳定的,也要小心,在投入生产之前测试工作负载
docker pull redis
docker run --name some-redis -d -it -p 16379:6379 redis --requirepass "u}J#D=>MryWf" --appendonly yes

如果想要持久化redis中的数据,添加数据卷映射

docker run --name some-redis -d -it -v /your/host/want/store/redisdata/path:/data -p 16379:6379 redis --requirepass "u}J#D=>MryWf" --appendonly yes

7. zookeeper

docker pull zookeeper
docker network create app-bridge --driver bridge
docker run --name some-zookeeper --network app-bridge -e ALLOW_ANONYMOUS_LOGIN=yes -d -it -p 2181:2181 bitnami/zookeeper

8. kafka

注意: 此kafka的安装依赖与zookeeper的安装
#节点1 
docker run -d --name=kafka2 \
 -p 9092:9092 \
 --network app-bridge \
 -e ALLOW_PLAINTEXT_LISTENER=yes \
 -e KAFKA_CFG_ZOOKEEPER_CONNECT=81.70.199.213:2181 \
 -e KAFKA_BROKER_ID=2 \
 -e KAFKA_HEAP_OPTS="-Xmx180m -Xms180m" \
 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://81.70.199.213:9092 \
 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092  \
 bitnami/kafka

 # 节点2
 docker run -d --name=kafka3 \
 -p 9093:9092 \
 --network app-bridge \
 -e ALLOW_PLAINTEXT_LISTENER=yes \
 -e KAFKA_CFG_ZOOKEEPER_CONNECT=81.70.199.213:2181 \
 -e KAFKA_BROKER_ID=3 \
  -e KAFKA_HEAP_OPTS="-Xmx180m -Xms180m" \
 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://81.70.199.213:9093 \
 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092  \
 bitnami/kafka

ALLOW_PLAINTEXT_LISTENER=yes:允许使用PLAINTEXT侦听器

KAFKA_CFG_ZOOKEEPER_CONNECT:zookeeper集群地址,多节点,分割

KAFKA_BROKER_ID:节点id,用来指定 Kafka 集群中 broker 的唯一标识,默认值为 -1。如果没有设置,那么 Kafka会自动生成一个

KAFKA_ADVERTISED_LISTENERS:绑定公网 IP 供外部客户端使用

KAFKA_LISTENERS:绑定私网 IP 地址供 broker 间通信使用

9. dubbo-admin

docker run --name some-dubbo-admin -p 8080:8080 -d -it -e admin.registry.address=zookeeper://selton.cn:2181 -e admin.config-center=zookeeper://selton.cn:2181 -e admin.metadata-report.address=zookeeper://selton.cn:2181  apache/dubbo-admin 

10. sonar

docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube

注意: 保持服务器剩余内存足够,默认情况下,sonarqube大约占用1.5G内存

打开http://yourhost:900/,点击"Log in"

登录账号:admin 密码:admin

11. flink

docker-compose.yml

version: "2.2"
services:
  jobmanager:
    image: flink:latest
    ports:
      - "18001:8081"
    command: jobmanager
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager

  taskmanager:
    image: flink:latest
    depends_on:
      - jobmanager
    command: taskmanager
    scale: 1
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager
        taskmanager.numberOfTaskSlots: 8

12. postgres

docker run --name some-postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d postgres

13. fastDFS

docker pull delron/fastdfs
docker run -d --network=host --name some-tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

#注意: 需要暴露22122端口 23000 否则下面的创建会有问题 8888端口也需要暴露 将来通过这个端口访问图片
#selton.cn替换成你的公网host或者局域网host

docker run -d --network=host --name some-storage -e TRACKER_SERVER=selton.cn:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

14. solr

在宿主机中执行如下命令

mkdir solrdata

sudo chmod 777 solrdata

docker run --name mall-solr -d -p 8983:8983 -v "$PWD/solrdata:/var/solr" solr:8

// 参数详解

run 运行容器

-d 后台运行

-p 容器端口和宿机端口映射

– name 容器名称

创建一个名为mall_core的核心

docker exec -it mall-solr bin/solr create_core -c mall_core

这个命令是在宿主机上执行的, 会让宿主机向容器发送一条指令
bin/solr create_core -c mall_core
这个指令,是使用solr的脚本, 创建一个名称为mall_core的核心

出现 Created new core ‘' 即创建

docker exec --user=root -it mall-solr bash

cp /opt/solr-8.10.1/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.10.1.jar /opt/solr-8.10.1/server/solr-webapp/webapp/WEB-INF/lib

在宿主机的solrdata中

vi /data/mall_core/conf/managed-schema

<fieldType name="smartcn" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
         <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
  </fieldType>

重启docker

猜你喜欢

转载自blog.csdn.net/2301_76154806/article/details/128781183