"[图片] 前言 最近好好学习了Docker,所以想把线上环境的所有组件替换为Docker部署,对于Solo这个个人博客系统,至少需要部署 3 个Docker容器。 MySQL Solo Nginx 其顺序也是从上倒下依次部署最为妥当,Docker部署简单,对初学者而言难其中一个难点就是网络通信,我这里就把各个过程做一个 .."

利用 docker 部署 solo 全套:MySQL+Nginx+Solo

前言

最近好好学习了Docker,所以想把线上环境的所有组件替换为Docker部署,对于Solo这个个人博客系统,至少需要部署 3 个Docker容器。

  1. MySQL
  2. Solo
  3. Nginx

其顺序也是从上倒下依次部署最为妥当,Docker部署简单,对初学者而言难其中一个难点就是网络通信,我这里就把各个过程做一个记录。

准备工作

因为部署了 3 个 docker 容器,那么他们要互相访问,就不能(更准确来讲 "不应该")通过传统的localhost或者127.0.0.1了。

官方也不再建议使用 --link了,那么使用什么了?

官方推荐的是建立一个 docker 的网络,代码如下所示,其中hicode是我定义的网络名,大家可以改成自己喜欢的:

docker network create -d bridge hicode

后续每一个容器在建立的时候,都应该加入这个网络hicode,然后容器和容器之间就可以通过容器名进行访问了。

MySQL

讲真,这个东西是最浪费时间。在Docker化之前,我服务器上用的是MySQL8,当时就折腾了不少时间,虽然最终也部署起来了,但是后面考虑了下还是放弃了 8 这个版本,原因主要是如下几点:

部署 MySQL 5.X 版本的指令如下所示

docker run --name mysql5.7 -p 3306:3306  \
--network hicode --privileged=true --restart=always \
-v /lcf/docker-data/mysql5.7/data:/var/lib/mysql \
-v /lcf/docker-data/mysql5.7/conf:/etc/mysql/conf.d \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=yourpwd -d mysql:5.7.26 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci \
--lower_case_table_names=1 --default-time_zone='+8:00' 

上述命令还是有几个细节的,如下所示:

对于mysql的配置文件,因为我们映射到了外部,所以mysql 没有自动创建。如果在不映射外部的情况下,去看看mysql的内部配置文件,你会发现 mysql 官方帮我们定义了 3 个配置文件

当然为了方便我们不需要这么麻烦,我们就合二为一创建一个mysql.cnf就够了,命令如下:

cd /lcf/docker-data/mysql5.7/conf
touch mysql.cnf

然后在mysql.cnf添加如下内容 (其实这部你省略也是没有问题的)

[mysql]
# 以下是 docker.cnf 的内容
skip-host-cache
skip-name-resolve
# 以下是 mysqldump.cnf 的内容
quick
quote-names
max_allowed_packet  = 16M
# 以下内容如有需要请自己添加

然后重启mysql就行了

docker restart mysql5.7

============= 以下步骤不需要,默认都可以访问 =========
如果你需要指定 mysql 所有 ip 都访问

docker exec -it mysql5.7 /bin/bash
mysql -h 127.0.0.1 -u root -p 
# 此时要求你输入 MySQL 密码

# 此处特别注意了,需要你替换'yourpwd'为你的密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;

============= 以上步骤不需要,默认都可以访问 =========

solo

solo 的安装注意 2 个细节即可,我们先看命令:

docker run -d  --restart=always --name solo \
    --network hicode\
    --env RUNTIME_DB="MYSQL" \
    --env JDBC_USERNAME="root" \
    --env JDBC_PASSWORD="yourpwd" \
    --env JDBC_DRIVER="com.mysql.jdbc.Driver" \
    --env JDBC_URL="jdbc:mysql://mysql5.7:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
    b3log/solo --listen_port=8080 --server_scheme=http --server_host=www.hicode.club

细节部分请注意了:

Nginx

首先创建 nginx 的配置文件nginx.conf

cd /lcf/docker-data/nginx/conf
touch nginx.conf

然后输入如下内容,很简单的nginx配置,不懂的可以百度

worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    default_type application/octet-stream;
    log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
    access_log /var/log/nginx/logs/access.log  main;
    sendfile on;
    #开启zeip压缩
    gzip on;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_min_length 256k;
    gzip_types text/plain application/javascript text/css application/json application/x-javascript text/xml application/xml text/javascript;
    
   	#后端的服务器
    upstream backend {
        server solo:8080 max_fails=3 fail_timeout=30s;
    }
    
#个人博客
    server {
        listen 80;
        server_name www.hicode.club;
        access_log /var/log/nginx/logs/hicode/access.log  main;
        location / {
            proxy_pass http://backend$request_uri;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header http_x_forwarded_for $remote_addr;
            client_max_body_size 10m;
        }
    }
}

然后执行如下命令启动 nginx 的容器

docker run -p 80:80 -m 200m --restart always \
 --name nginx --network hicode \
 -v /lcf/docker-data/nginx/www:/www \
 -v /lcf/docker-data/nginx/conf/:/etc/nginx/ \
 -v /lcf/docker-data/nginx/logs:/var/log/nginx/logs \
 -v /lcf/docker-data/nginx/wwwlogs:/wwwlogs \
 nginx

其他

基本上,按照上面操作,就可以搞定了,docker 用好了,很方便,因为一行指令搞定的时候,不需要在折腾环境了。

有朋友担心资源占用的问题,这里我截图,给大家看看情况:

image.png

好了,差不多写到这里,有问题,欢迎留言。

文章发布自:hicode.club,转载请注明出处,谢谢!

  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。

    Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
    具体细节请浏览 B3log 构思

    629 引用 • 4799 回帖 • 719 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    88 引用 • 184 回帖
6 回帖   
请输入回帖内容...
  • cuijianzhe  

    写的很好,现在我的是 solo 是 docker,mysql 和 nginx 是软件安装,不知道博主全部 docker 化,性能还有主机占用率都用到极致了吗? 如果能比现有资源使用少的话 我决定采坑全部 docker 化。

    2 回复
  • cuijianzhe  

    -v /lcf/docker-data/nginx/conf/:/etc/nginx/ \ 你的配置文件不是在 /lcf 中吗?为什么指定配置文件到 /etc 了啊

    1 回复
  • Wit13    

    同问,一直想找个 docker 的教程,感谢博主👍

  • CodingOX    

    本来是有资源占用图的,因为最近新浪微博的图床挂了,所以就没贴上去,内存占用600-700M,CPU 常年5%-10%,3 个东西部署在一个云主机上,感觉完全扛得住!

  • CodingOX    

    我的配置文件是放在/lcf/docker-data/nginx/conf这个目录下的,映射的容器内部的 '/etc/nginx' 这个目录,这个目录也是 nginx 要求的配置文件目录。

  • jinjianh  

    /var/log/nginx/logs/hicode/access.log 与 /etc/nginx/mime.types 不存在如何解决的呢

请输入回帖内容...