同福

使用Dockerfile搭建TFLinux的MySQL+Redis+MongoDB+Elasticsearch环境【20210524】

介绍

介绍

前面福哥已经教给大家使用Dockerfile安装各种服务器软件的方法了,今天福哥要带着大家把TFLinux服务器上的软件都转移到Docker容器里面。使用Docker容器搭建服务器环境是现如今部署服务器环境的主流方式,福哥顺应潮流将Docker这种部署方式教给大家,活到老学到老嘛~~

这次福哥整理的服务器软件包括MySQL、Redis、MongoDB、Elasticsearch, 本节课不包括PHP、Apache以及Nginx软件的部署,福哥将在后面详细介绍~~

MySQL

直接部署

福哥直接部署的MySQL的路径是/tongfu.net/env/mysql-5.7.28/,福哥使用了同样的版本的MySQL的Docker镜像避免了数据库数据的兼容问题。现在只需要将当前直接部署的MySQL的数据指向给Docker容器使用就可以了。

Docker部署

直接部署的MySQL的数据路径是/tongfu.net/env/mysql-5.7.28/data/,福哥使用数据卷映射的方式将这个路径映射到MySQL的镜像里面。

Dockerfile

my-extra.cnf

# server id
server_id = 131415926

# log bin
log-bin=mysql-bin
binlog-do-db=tfapi_utf8
expire_logs_days=10
max_binlog_size=1G
binlog-format=row

# performance
max_allowed_packet=104857600

# innodb
innodb_flush_log_at_trx_commit = 2 # 0 - no writen, 1 - writen everytimes, 2 - writen per second

# sql
sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

Dockerfile

FROM mysql:5.7

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER http://docker.tongfu.net

EXPOSE 3306

# local mirror
RUN sed -i 's/deb.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list \
&& sed -i 's/security.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list

# timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone

# config
ADD my-extra.cnf /tmp/my-extra.cnf
RUN cat /tmp/my-extra.cnf >> /etc/mysql/mysql.conf.d/mysqld.cnf

# clear
RUN rm -f /tmp/my-extra.cnf

测试

创建镜像

docker build -f Dockerfile -t tflinux-mysql5.7 ./

授权数据卷

我们映射到容器里面的目录的所有者还是宿主机的,为了避免启动容器后出现权限问题,我们需要在启动容器之前将宿主机的目录所有者改成容器里面的。

好在容器启动后的用户ID、组ID都不会变,福哥查到了mysql:5.7的镜像里面的mysql用户ID是999、组ID是999。

chown 999 -R /tongfu.net/env/mysql-5.7.28/data/
chgrp 999 -R /tongfu.net/env/mysql-5.7.28/data/

启动容器

docker run -tid \
--name tflinux-mysql5.7 \
-h tflinux-mysql5.7 \
-p 10.16.1.1:3306:3306 \
-v /tongfu.net/env/mysql-5.7.28/data/:/var/lib/mysql/ \
tflinux-mysql5.7

home/topic/2021/0524/15/d7d86e916da62da04e9d40fbaa0c0d43.png

Redis

直接部署

福哥直接部署的Redis的路径是/tongfu.net/env/redis-4.0.10/,福哥使用了同样的版本的Redis的Docker镜像避免了数据库数据的兼容问题。现在只需要将当前直接部署的Redis的数据和日志指向给Docker容器使用就可以了。

Docker部署

直接部署的Redis的数据路径是/tongfu.net/env/redis-4.0.10/data/,直接部署的Redis的日志路径是/tongfu.net/env/redis-4.0.10/logs/,福哥使用数据卷映射的方式将这两个路径映射到Redis的镜像里面。

Dockerfile

redis.conf

# host and port
bind 0.0.0.0
port 6379

# data
maxmemory 268435456
dbfilename dump.rdb
dir /var/lib/redis

# logs
logfile /var/log/redis/redis.log

# security
requirepass tongfu.net

Dockerfile

FROM redis:6.0-buster

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER http://docker.tongfu.net
MAINTAINER 2021/5/25
MAINTAINER v1.0.0

EXPOSE 6379

# local mirror
RUN sed -i 's/deb.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list \
&& sed -i 's/security.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list

# timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone

# config
RUN mkdir /usr/local/etc/redis
ADD redis.conf /usr/local/etc/redis/redis.conf

# run by redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

测试

创建镜像

docker build -f Dockerfile -t tflinux-redis6.0 ./

授权数据卷

我们映射到容器里面的目录的所有者还是宿主机的,为了避免启动容器后出现权限问题,我们需要在启动容器之前将宿主机的目录所有者改成容器里面的。

好在容器启动后的用户ID、组ID不会变,福哥查到了redis:6.0-buster的镜像里面的redis用户ID是999、组ID是999。

chown 999 -R /tongfu.net/env/redis-4.0.10/data/
chown 999 -R /tongfu.net/env/redis-4.0.10/logs/
chgrp 999 -R /tongfu.net/env/redis-4.0.10/data/
chgrp 999 -R /tongfu.net/env/redis-4.0.10/logs/

启动容器

docker run -tid \
--name tflinux-redis6.0 \
-h tflinux-redis6.0 \
-p 10.16.1.1:6379:6379 \
-v /tongfu.net/env/redis-4.0.10/data/:/var/lib/redis/ \
-v /tongfu.net/env/redis-4.0.10/logs/:/var/log/redis/ \
tflinux-redis6.0

home/topic/2021/0525/11/9d0833f9ce23f1c71367faab6eff40ee.png

MongoDB

直接部署

福哥直接部署的MongoDB的路径是/tongfu.net/env/mongodb-4.2.2/,福哥使用了同样的版本的MongoDB的Docker镜像避免了数据库数据的兼容问题。现在只需要将当前直接部署的MongoDB的数据和日志指向给Docker容器使用就可以了。

Docker部署

直接部署的MongoDB的数据路径是/tongfu.net/env/mongodb-4.2.2/data/,直接部署的MongoDB的日志路径是/tongfu.net/env/mongodb-4.2.2/logs/,福哥使用数据卷映射的方式将这两个路径映射到MongoDB的镜像里面。

Dockerfile

mongod.conf

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

Dockerfile

FROM mongo:4.2-bionic

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER http://docker.tongfu.net
MAINTAINER 2021/5/25
MAINTAINER v1.0.0

EXPOSE 27017

# local mirror
RUN sed -i 's/deb.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list \
&& sed -i 's/security.debian.org/ftp.cn.debian.org/g' /etc/apt/sources.list

# timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone

# config
ADD mongod.conf /etc/mongod.conf

测试

创建镜像

docker build -f Dockerfile -t tflinux-mongo4.2 ./

授权数据卷

我们映射到容器里面的目录的所有者还是宿主机的,为了避免启动容器后出现权限问题,我们需要在启动容器之前将宿主机的目录所有者改成容器里面的。

好在容器启动后的用户ID、组ID不会变,福哥查到了mongo:4.2-bionic的镜像里面的mongodb用户ID是999、组ID是999。

chown 999 -R /tongfu.net/env/mongodb-4.2.2/data/
chown 999 -R /tongfu.net/env/mongodb-4.2.2/logs/
chgrp 999 -R /tongfu.net/env/mongodb-4.2.2/data/
chgrp 999 -R /tongfu.net/env/mongodb-4.2.2/logs/

启动容器

docker run -tid \
--name tflinux-mongo4.2 \
-h tflinux-mongo4.2 \
-p 10.16.1.1:27017:27017 \
-v /tongfu.net/env/mongodb-4.2.2/data/:/var/lib/mongodb/ \
-v /tongfu.net/env/mongodb-4.2.2/logs/:/var/log/mongodb/ \
tflinux-mongo4.2 \
-f /etc/mongod.conf

home/topic/2021/0525/11/14cf5b47f8e3b50d0c695c87ca83e71f.png

Elasticsearch

直接部署

福哥直接部署的Elasticsearch的路径是/tongfu.net/env/elasticsearch-6.5.2/,福哥使用了同样的版本的Elasticsearch的Docker镜像避免了数据库数据的兼容问题。现在只需要将当前直接部署的Elasticsearch的数据和日志指向给Docker容器使用就可以了。

Docker部署

直接部署的Elasticsearch的数据路径是/tongfu.net/env/elasticsearch-6.5.2/data/,直接部署的Elasticsearch的日志路径是/tongfu.net/env/elasticsearch-6.5.2/logs/,福哥使用数据卷映射的方式将这两个路径映射到Elasticsearch的镜像里面。

Dockerfile

elasticsearch.yml

# elasticsearch.yml

# host and port
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.port: 9200

# data
path.data: /var/lib/elasticsearch

# logs
path.logs: /var/log/elasticsearch

Dockerfile

FROM elasticsearch:6.8.15

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER http://docker.tongfu.net
MAINTAINER 2021/5/25
MAINTAINER v1.0.0

EXPOSE 9200

# timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone

# config
COPY elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml

测试

创建镜像

docker build -f Dockerfile -t tflinux-es6.8.15 ./

授权数据卷

我们映射到容器里面的目录的所有者还是宿主机的,为了避免启动容器后出现权限问题,我们需要在启动容器之前将宿主机的目录所有者改成容器里面的。

好在容器启动后的用户ID、组ID不会变,福哥查到了elasticsearch:6.8.15的镜像里面的elasticsearch用户ID是1000、组ID是1000。

chown 1000 -R /tongfu.net/env/elasticsearch-6.5.2/data/
chown 1000 -R /tongfu.net/env/elasticsearch-6.5.2/logs/
chgrp 1000 -R /tongfu.net/env/elasticsearch-6.5.2/data/
chgrp 1000 -R /tongfu.net/env/elasticsearch-6.5.2/logs/

启动容器

docker run -tid \
--name tflinux-es6.8.15 \
-h tflinux-es6.8.15 \
-p 10.16.1.1:9200:9200 \
-v /tongfu.net/env/elasticsearch-6.5.2/data/:/var/lib/elasticsearch/ \
-v /tongfu.net/env/elasticsearch-6.5.2/logs/:/var/log/elasticsearch/ \
tflinux-es6.8.15

home/topic/2021/0525/13/1b9eb6717150710cecab007fc2c7a1f0.png

总结

今天福哥带着童鞋们将之前学习的使用Dockerfile搭建各种服务器软件的技巧综合了一下,使用这些技巧将我们的TFLinux服务器上面直接部署的MySQL、Redis、MongoDB、Elasticsearch都转移到了Docker里面,利用Docker的数据卷映射技术保留了我们的TFLinux服务器软件的数据。

这一课的内容比较多,大家在实践的时候要仔细一点,不要将TFLinux服务器上的直接部署的软件的数据弄丢了!

下一课福哥会带着大家把TFLinux服务器上面直接部署的PHP的环境转移到Docker里面,届时大家可以学到php-apache转php-fpm的相关技术,敬请期待~~