注:本文中所有配置文件都是我用echo或者cat输入的,不全,最好用docker cp
如下面的diamagnetic就是将mysql-service容器内的配置文件复制到宿主机上
然后在第二次运行的时候再挂载
docker cp mysql-service:/etc/mysql/my.cnf /root/docker/mysql/conf
- 在Linux环境(虚拟机)下使用Docker配置NoSQL
- Docker
- MongoDB
- Redis
- Elasticsearch
- RabbitMQ
- RocketMQ
- Docker-Compose
- Mysql
- Minio
- Milvus
我的服务器是本地虚拟机,所以直接关了防火墙
具体要开的端口是
mongodb:27017
redis:6379
es + kibana:9200 9300 5601
rabbitmq 5672 15672
Docker
- 卸载(可选)如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine \ docker-ce
- 安装docker。服务器机器要能联网,安装yum工具
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken
- 更新本地镜像源,这里设为了阿里云的镜像
yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
- 安装docker社区版
yum install -y docker-ce
- 启动docker
systemctl start docker systemctl enable docker
- 查看docker版本,验证启动成功
docker -v
- 配置镜像加速。这里参考阿里云的镜像加速文档:加速文档,把文档里的代码直接全粘了运行docker官方镜像仓库网速较差,我们需要设置国内镜像服务。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ppztf0yr.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
docker常用命令
MongoDB
-
我是拉取最新版的
docker pull mongo
-
预先创建好被挂载的配置文件
mongodb.conf 配置文件详解mkdir -p /myData/mongo/conf mkdir -p /myData/mongo/data mkdir -p /myData/mongo/log cd /myData/mongo/conf cat > mongodb.conf <<EOF #端口 port=27017 #数据库文件存放目录 dbpath=/myData/mongo/data #日志文件存放路径 logpath=/myData/mongo/log #使用追加方式写日志 logappend=true #以守护线程的方式运行,创建服务器进程 fork=true #最大同时连接数 maxConns=100 #不启用验证 #noauth=true #每次写入会记录一条操作日志 journal=true #存储引擎有mmapv1、wiredTiger、mongorocks storageEngine=wiredTiger #访问IP bind_ip=0.0.0.0 #用户验证 auth=true EOF
-
新建一个名为mongo的容器运行该mongo镜像,映射宿主机的 27017 端口为容器服务的 27017 端口,并指定要验证才能使用服务
docker run \ --name mongo \ -p 27017:27017 \ -v /myData/mongo/data:/data/db -v /myData/mongo/conf:/data/conf -v /myData/mongo/log:/data/log \ -d mongo --auth
-
查看运行情况
-
进入容器
docker exec -it mongo mongo admin
接下来的角色权限配置可以参考MongoDB的角色创建及配置
-
创建用户
-
尝试登录该用户,输出1表示成功(同redis的auth)
用可视化工具连接时也是username和password都是root
-
退出
Redis
-
拉取
docker pull redis
-
预先创建好挂载目录及文件
注意daemonize不能为yes,因为docker run里的-d就是守护进程
参考自docker日记(二)–redismkdir -p /myData/redis/conf mkdir -p /myData/redis/data touch /myData/redis/conf/redis.conf cat > /myData/redis/conf/redis.conf <<EOF bind 0.0.0.0 protected-mode no appendonly yes requirepass root daemonize no EOF chmod -R 777 /myData/redis/
-
创建容器运行该镜像
-v /myData/redis/data:/data \【-v:目录挂载,将容器内部的data 文件夹挂载到Linux的/myData/redis/data目录里】
-V /myData/redis/conf/redis.conf:/etc/redis/redis.conf \【将/etc/redis/redis.conf挂载到Linux中指定目录下】
-d --restart=always 【配置开机启动】
TIMEZONE解决redis时区不同步问题
注意最后一行是用容器内配置文件启动redis服务端docker run -p 6379:6379 --name redis \ --sysctl net.core.somaxconn=1024 --privileged=true --restart=always \ -v /myData/redis/data:/data \ -v /myData/redis/conf/redis.conf:/etc/redis/redis.conf \ -e TIME_ZONE="Asia/Shanghai" -e TZ="Asia/Shanghai" \ -d redis redis-server /etc/redis/redis.conf
-
进入客户端
docker exec -it redis redis-cli
-
测试
注意下面这个root是我们之前配的密码,如果你想免密,就把那行删掉或注释掉auth root ping exit
返回
PONG
即成功
Elasticsearch
- 拉取
docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2
- 准备好外部挂在目录和文件,这里文件就用我给出的吧,别复制容器里的了,甚至都不如这里的全
mkdir -p /myData/elasticsearch/config mkdir -p /myData/elasticsearch/plugins mkdir -p /myData/kibana/config mkdir -p /myData/kibana/data cat > /myData/elasticsearch/config/elasticsearch.yml <<EOF http.host: 0.0.0.0 # Uncomment the following lines for a production cluster deployment #transport.host: 0.0.0.0 #discovery.zen.minimum_master_nodes: 1 #Password config #这一步是开启x-pack插件 xpack.security.enabled: true http.cors.enabled: true http.cors.allow-origin: "*" EOF cat > /myData/kibana/config/kibana.yml<<EOF server.name: kibana server.host: "0.0.0.0" elasticsearch.hosts: [ "http://es服务器的IP:9200" ] elasticsearch.username: "elastic" elasticsearch.password: "自己待会会设置的密码" i18n.locale: "zh-CN" EOF
- 新建容器运行该镜像
docker run -d -it --restart=always --privileged=true \ --name=elasticsearch -p 9200:9200 -p 9300:9300 -p 5601:5601 \ -e "discovery.type=single-node" -e "cluster.name=elasticsearch" \ -v /myData/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /myData/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -e ES_JAVA_OPTS="-Xms512M -Xmx512M" elasticsearch:7.6.2 #-e ES_JAVA_OPTS="-Xms4G -Xmx4G" 设置运行内存,这个内存不建议太大。因为es走的是直接内存也就是系统内存,所以要预留足够的系统内存。我这台服务器8核16G所以给了4G。如果系统内存预留不足,会导致以后检索时速度达不到预期速度。
- 进入es容器设置密码
docker exec -it elasticsearch /bin/bash cd bin #开启密码设置 elasticsearch-setup-passwords interactive
#输出 如下 Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. #输入Y Please confirm that you would like to continue [y/N]Y #依次设置密码 Enter password for [elastic]: Reenter password for [elastic]: Enter password for [apm_system]: Reenter password for [apm_system]: Enter password for [kibana_system]: Reenter password for [kibana_system]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Enter password for [beats_system]: Reenter password for [beats_system]: Enter password for [remote_monitoring_user]: Reenter password for [remote_monitoring_user]: Changed password for user [apm_system] Changed password for user [kibana_system] Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [beats_system] Changed password for user [remote_monitoring_user] Changed password for user [elastic]
- 重启es
docker restart elasticsearch
- 修改kibana.yml的配置
- 新建kibana容器(kibana是一个可视化es数据的管理平台)
docker run -itd -e ELASTICSEARCH_URL=http://ES服务器IP:9200 --name kibana \ -v /myData/kibana/config:/usr/share/kibana/config --network=container:elasticsearch kibana:7.6.2
- 测试
http://ES服务器IP:9200
如下面的效果并能正确登录说明成功了
注意用户名是elastic
http://kibana服务器IP:5601/
RabbitMQ
-
拉镜像
docker pull rabbitmq:management
-
准备好外部挂载目录
mkdir -p /myData/rabbitmq/{data,log,conf} chmod -R 777 /myData/rabbitmq
-
新建容器运行该镜像
docker run -d -p 5672:5672 -p 15672:15672 \ -v /myData/rabbitmq/data:/var/lib/rabbitmq -v /myData/rabbitmq/conf:/etc/rabbitmq -v /myData/rabbitmq/log:/var/log/rabbitmq \ --name rabbitmq --hostname=rabbitmq-1 --restart=always \ rabbitmq:management
-
进入容器
docker exec -it rabbitmq /bin/bash
-
启动可视化插件
rabbitmq-plugins enable rabbitmq_management
-
建立供外部访问的用户
先别急着退出来,还在这个容器里
添加账号 rabbitmqctl add_user 账号 密码
设置权限 rabbitmqctl set_permissions -p / 账号 ".*" ".*" ".*"
设置角色rabbitmqctl set_user_tags 账号 administrator
rabbitmqctl add_user root root rabbitmqctl set_permissions -p / root ".*" ".*" ".*" rabbitmqctl set_user_tags root administrator
-
测试
访问web界面
http://rabbitmq服务器的IP:15672/
有个默认账号和密码都是guest
当然也可以用我们刚创建的那一个
RocketMQ
- 创建namesrv服务
docker pull rocketmqinc/rocketmq mkdir -p /myData/rocketmq/data/namesrv/logs /myData/rocketmq/data/namesrv/store docker run -d \ --restart=always \ --name rmqnamesrv \ -p 9876:9876 \ -v /myData/rocketmq/data/namesrv/logs:/root/logs \ -v /myData/rocketmq/data/namesrv/store:/root/store \ -e "MAX_POSSIBLE_HEAP=100000000" \ rocketmqinc/rocketmq \ sh mqnamesrv
- 创建broke结点
mkdir -p /myData/rocketmq/data/broker/logs /myData/rocketmq/data/broker/store /myData/rocketmq/conf cat > /myData/rocketmq/conf/broker.conf <<EOF # 所属集群名称,如果节点较多可以配置多个 brokerClusterName = DefaultCluster #broker名称,master和slave使用相同的名称,表明他们的主从关系 brokerName = broker-a #0表示Master,大于0表示不同的slave brokerId = 0 #表示几点做消息删除动作,默认是凌晨4点 deleteWhen = 04 #在磁盘上保留消息的时长,单位是小时 fileReservedTime = 48 #有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制; brokerRole = ASYNC_MASTER #刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要; flushDiskType = ASYNC_FLUSH # 设置broker节点所在服务器的ip地址 brokerIP1 = IP自己填 EOF docker run -d \ --restart=always \ --name rmqbroker \ --link rmqnamesrv:namesrv \ -p 10911:10911 \ -p 10909:10909 \ -v /myData/rocketmq/data/broker/logs:/root/logs \ -v /myData/rocketmq/data/broker/store:/root/store \ -v /myData/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf \ -e "NAMESRV_ADDR=namesrv:9876" \ -e "MAX_POSSIBLE_HEAP=200000000" \ rocketmqinc/rocketmq \ sh mqbroker -c /opt/rocketmq/conf/broker.conf
- 创建rocketmq-console
docker pull pangliang/rocketmq-console-ng docker run -d \ --restart=always \ --name rmqadmin \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=IP:9876 \ -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 9111:8080 \ pangliang/rocketmq-console-ng
- 开放对应端口
firewall-cmd --permanent --zone=public --add-port=9876/tcp firewall-cmd --permanent --zone=public --add-port=10911/tcp firewall-cmd --permanent --zone=public --add-port=9111/tcp # 立即生效 firewall-cmd --reload
- 记得开放9876,10911,10912,10909、9111(自定义的控制台端口)五个端口
- 查看控制台
http://ip:9111
Docker-Compose
- 下载并到服务器上
mv docker-compose-linux-x86_64 docker-compose
chmod 777 docker-compose
mv docker-compose /usr/local/bin/
vim /etc/profile
、export PATH=$PATH:/usr/local/bin/
、source /etc/profile
docker-compose -v
Docker-compose安装
docker-compose up
docker-compose restart
docker-compose logs
docker-compose ps
docker-compose stop
docker-compose rm
Mysql
# 拉取
docker pull mysql
# 运行
docker run -p 3306:3306 --name mysql \
-e MYSQL\_ROOT\_PASSWORD=root \
-d mysql
# 进入容器测试
docker exec -it mysql bash
mysql -uroot -p
密码
在3307端口装一个5.7的mysql
docker run -p 3307:3306 --name mysql5.7 \
-e MYSQL\_ROOT\_PASSWORD=root\
-d mysql:5.7
MinIO
docker pull minio/minio
mkdir /myData
mkdir /myData/minio
mkdir /myData/minio/data
mkdir /myData/minio/config
docker run --name minio \
-p 9000:9000 \
-p 9999:9999 \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123" \
-e "MINIO_SERVER_URL=http://IP:9000" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server /data \
--console-address '0.0.0.0:9999'
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --reload
登录console
http://IP:9999
用户名和密码为
admin
admin123
Milvus
mkdir /usr/local/env/milvus
cd /usr/local/env/milvus
wget https://github.com/milvus-io/milvus/releases/download/v2.0.0-rc7/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker-compose up -d
docker-compose ps
Nginx
docker pull nginx
# 创建挂载目录
mkdir -p /mydata/nginx/conf
mkdir -p /mydata/nginx/log
mkdir -p /mydata/nginx/html
# 生成临时容器(复制完配置文件就删除)
docker run --name nginx -p 80:80 -d nginx
# 将容器中要被挂载的文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /mydata/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d /mydata/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html /mydata/nginx/
# 删除临时的
docker stop nginx
docker rm nginx
# 真正启动容器
docker run \
-p 80:80 \
--name nginx \
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /mydata/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /mydata/nginx/log:/var/log/nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx
PostgreSQL
docker pull postgres
mkdir /myData/postgresql
docker run --name postgres \
--restart=always \
-e POSTGRES_PASSWORD=root \
-p 5432:5432 \
-v /myData/postgresql:/var/lib/postgresql/data \
-d postgres
# 查看
docker ps