【Docker】Docker 配置实战案例

安装 Docker

Docker官网: https://www.docker.com/; Docker中文网站: https://www.docker-cn.com/; Docker Hub官网:https://hub.docker.com/

  1. CentOS 7 安装 Docker:
1
yum install -y docker
  1. 开启 Docker 服务:
1
systemctl start docker.service
  1. 查看安装结果:
1
docker version
  1. 设置开机启动:
1
systemctl enable docker.service
  1. 配置 docker 镜像下载加速。编辑配置⽂件:
1
vim /etc/docker/daemon.json

在其中加入加速镜像源地址即可(https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors):

1
2
3
{
"registry-mirrors": ["https://gc2odbl5.mirror.aliyuncs.com"]
}

加完加速地址后,重新加载配置⽂件,重启docker 服务即可:

1
2
systemctl daemon-reload
systemctl restart docker.service

Docker Hub 镜像仓库地址:https://hub.docker.com/

Docker 安装 MySQL

  1. 下载镜像文件
1
$ docker pull mysql:5.7
  1. 创建实例并启动
1
2
3
4
5
6
7
8
9
10
11
12
13
# --name指定容器名字 -v目录挂载 -p指定端口映射  -e设置mysql参数 -d后台运行
$ sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

# 参数说明
-v 将对应文件挂载到主机
-e 初始化对应
-p 容器端口映射到主机的端口
-d 后台运行
  1. 添加 MySQL 配置
1
$ vi /mydata/mysql/conf/my.cnf # 创建&修改该文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
# skip-grant-tables 取消权限认证

启动后,可以使用 telnet 命令测试 mysql 能否被顺利连接:

1
telnet 47.98.120.35 3306

https://www.jianshu.com/p/b0abc38aa601

如果不能连通,可能的原因:

  • 防火墙没有开启 3306 端口
  • 云服务器的安全组没有开通 3306 端口
  • docker 内的 mysql 只允许其所在的服务器连接,不能被其他主机访问。此时需要在 mysql 服务器上设置一下允许的 ip 权限:
1
2
3
4
5
6
# root表示mysql的一个用户名  '%'表示所有远程ip  '123456'是密码
# 该命令的意思是任何公网IP的都可以通过用户名为root 密码为123456 访问改数据库
grant all privileges on *.* to root@'%' identified by 'zhaoyuyun' with grant option;

# 使其立即生效
flush privileges;

Docker 安装 Redis

  1. 下载镜像文件
1
docker pull redis
  1. 创建实例并启动
1
2
3
4
5
6
7
8
9
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf

# 启动,同时映射到对应文件夹,并设置密码
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--requirepass "mypassword"
  1. 使用 redis 镜像执行 redis-cli 命令连接
1
docker exec -it redis redis-cli
  1. 开启 redis 持久化
1
2
3
4
vim /mydata/redis/conf/redis.conf

# 插入下面内容
appendonly yes

Docker 安装 Nginx

由于先拉取镜像然后再生成的 nginx 实例里没有包含配置文件,因此需要先直接启动一个 nginx 实例,并将其内生成的配置文件拷贝到宿主服务器中,然后再删掉这个启动的实例,重新按照标准流程生成一个 nginx 实例并挂载到宿主服务器的指定目录下。

  1. 先直接启动一个 nginx 实例,为了将其自动生成的配置文件复制出来
1
docker run -p80:80 --name nginx -d nginx:1.10   
  1. 将容器内自动生成的配置文件拷贝到宿主服务器
1
docker container cp nginx:/etc/nginx /mydata/
  1. 将拷贝出的文件夹/mydata/nginx 重命名为 /mydata/conf,并创建文件夹 /mydata/nginx,将 /mydata/conf 文件夹移动到 /mydata/nginx 文件夹内
1
2
3
4
5
6
7
8
# 重命名
mv /mydata/ngnix/ /mydata/conf

# 创建新的nginx文件夹
mkdir /mydata/nginx

# 移动到新的nginx文件夹下
mv /mydata/conf /mydata/nginx/
  1. /mydata/nginx 目录下新建两个文件夹分别存放网页和日志
1
2
3
4
5
mkdir -p /mydata/nginx/html
mkdir -p /mydata/nginx/logs

# 在html文件夹下创建 index.html 文件即可作为默认的nginx首页
vim /mydata/nginx/html/index.html
  1. 停止并删除之前创建的 nginx 实例
1
2
docker stop nginx
docker rm nginx
  1. 启动新的 nginx 实例,并进行挂载,此时就完成了配置文件的初始化
1
2
3
4
5
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/:/etc/nginx \
-d nginx:1.10
  1. 设置自启动
1
docker update nginx --restart=always

关于 Nginx 的详细配置方法见文章:http://blog.yuyunzhao.cn/2021/07/26/【Nginx】Nginx/

注意事项

  • 若在 Docker 中安装 Nginx,则在做动静分离时,指定的资源目录必须是在 Docker 容器中的目录而不能是宿主机的目录
  • 如果两个不同 server 的块中配置的 server_name 相同,则二者的 location 必须配置相同路径,否则会出现问题。如果必须配置不同的路径,则这两个 server 块中的 server_name 必须设置不同(可以一个 localhost,一个写 ip 地址)

查看 Nginx 的报错信息方法:docker logs nginx

Docker 安装 ElasticSearch

  1. 下载镜像文件
1
2
3
docker pull elasticsearch:7.4.2

docker pull kibana:7.4.2
  1. 配置
1
2
3
4
5
mkdir -p /mydata/elasticsearch/config  # 存放配置文件
mkdir -p /mydata/elasticsearch/data # 存放数据
mkdir -p /mydata/elasticsearch/plugins # 存放插件
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml # 允许任何机器访问
chmod -R 777 /mydata/elasticsearch/ ## 设置elasticsearch文件可读写权限,否则将无法启动
  1. 启动(9300 端口为 Elasticsearch 集群间组件的通信端口, 9200 端口为浏览器访问的 HTTP 请求端口)
1
2
3
4
5
6
7
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
  1. 设置自启动
1
docker update elasticsearch --restart=always
  1. 启动 Kibana
1
2
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://yuyunzhao.cn:9200 -p 5601:5601 -d kibana:7.4.2
# http://xxx:9200 改成自己 Elasticsearch 的地址

在浏览器访问 5601 端口即可进入到界面

安装 ik 分词器

https://github.com/medcl/elasticsearch-analysis-ik/releases 下载 ik 分词器并拷贝解压到 /mydata/elasticsearch/plugins 目录下即可。

自定义词库

  1. 修改 /mydata/elasticsearch/plugins/ik/config 目录下的 IKAnalyzer.cfg.xml 文件,在其内写上远程字典地址:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://yuyunzhao.cn/es/fenci.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

其中,远程字典文件 /es/fenci.txt 创建在了 nginx 的 /mydata/nginx/html 目录下,这样才可以被其他服务器访问到。

  1. 在词典中添加自定义的分词:
1
乔碧萝
  1. 添加了分词后记得重新启动 elasticsearch 服务:
1
docker restart elasticsearch
  1. 这样在检索时就可以指定分词器为 ik 分词器:
1
2
3
4
5
POST _analyze
{
"analyzer": "ik_max_word", # 还有 ik_smart 等分词器
"text": ["乔碧萝殿下"]
}

Docker 安装 RabbitMQ

RabbitMQ 的镜像有多种类型,我们选择带有 “mangement” 的版本(包含web管理页面)。

  1. 下载镜像(也可以直接运行 run,其会自动下载镜像)
1
docker pull rabbitmq:management
  1. 运行 rabbitmq:management
1
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

其中:

  • 4369,25672(Erlang 发现 & 集群端口)
  • 5672,5671(AMQP 端口)
  • 15672(web 管理后台端口)
  • 61613,61614(STOMP 协议端口)
  • 1883,8883(MQTT 协议端口)
  1. 设置自动启动
1
docker update rabbitmq --restart=always

访问服务器的 15672 端口即可访问后台管理页面:

img