前言
最近好好学习了 Docker
,所以想把线上环境的所有组件替换为 Docker
部署,对于 Solo
这个个人博客系统,至少需要部署 3 个 Docker
容器。
- MySQL
- Solo
- Nginx
其顺序也是从上倒下依次部署最为妥当,Docker
部署简单,对初学者而言难其中一个难点就是网络通信,我这里就把各个过程做一个记录。
准备工作
因为部署了 3 个 docker 容器,那么他们要互相访问,就不能(更准确来讲"不应该")通过传统的 localhost
或者 127.0.0.1
了。
官方也不再建议使用 --link
了,那么使用什么了?
官方推荐的是建立一个 docker 的网络,代码如下所示,其中 hicode
是我定义的网络名,大家可以改成自己喜欢的:
docker network create -d bridge hicode
后续每一个容器在建立的时候,都应该加入这个网络 hicode
,然后容器和容器之间就可以通过容器名进行访问了。
MySQL
讲真,这个东西是最浪费时间。在 Docker
化之前,我服务器上用的是 MySQL8
,当时就折腾了不少时间,虽然最终也部署起来了,但是后面考虑了下还是放弃了 8 这个版本,原因主要是如下几点:
MySql8
的资料相对较少,记录的问题解决方案也比较少,要爬坑很久才能找到解决方案。MySQL8
的内存占用和CPU
占用有点高,特别是内存占用持续高涨。我的云服务器是捋的腾讯羊毛,当时本来是1核2G
的配置,我为了延长使用时间,把服务器配置降级成了1核1G
了,所以对于MySql8
的内存占用,我的小服务器有点扛不住。- 在可以预期的未来,我们公司包括整个行业还是会在
5.X
居多,所以8.0
就留在后面有机会折腾了吧。
部署 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'
上述命令还是有几个细节的,如下所示:
--network hicode
是加入之前我们新建的桥接网络hicode
--privileged=true
是保证 MySQL 具有操作外部映射出的文件的权限--restart=always
是自动启动,类似Win
的自动重启-v /lcf/docker-data/mysql5.7/data:/var/lib/mysql \
将 mysql 的数据映射到磁盘上,避免新建容器后数据丢失。-v /lcf/docker-data/mysql5.7/conf:/etc/mysql/conf.d
将 mysql 的配置放置在外部磁盘,方便修改-e TZ=Asia/Shanghai
指定 mysql 的时区为 东八区,也就是我们中国时间-e MYSQL_ROOT_PASSWORD=yourpwd
是需要你自己设置的密码
对于 mysql
的配置文件,因为我们映射到了外部,所以 mysq
l 没有自动创建。如果在不映射外部的情况下,去看看 mysql
的内部配置文件,你会发现 mysql 官方帮我们定义了 3 个配置文件
docker.cnf
专门为 docker 做的优化mysqldump.cnf
dump 的时候做的优化mysql.cnf
需要你自己定义
当然为了方便我们不需要这么麻烦,我们就合二为一创建一个 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
细节部分请注意了:
--network=hicode
加入hicode
这个网络--env JDBC_DRIVER="com.mysql.jdbc.Driver"
因为我使用的是MySQL 5.7
所以是这样的--env JDBC_PASSWORD="yourpwd"
是安装 myql 时候时候指定的密码--server_host=www.hicode.club
需要你自己修改 host--env JDBC_URL="jdbc:mysql://mysql5.7:3306/
这个地方我写的不是localhost
也不是127.0.0.1
,而是使用的mysql
容器的名称mysql5.7
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 用好了,很方便,因为一行指令搞定的时候,不需要在折腾环境了。
有朋友担心资源占用的问题,这里我截图,给大家看看情况:
好了,差不多写到这里,有问题,欢迎留言。
文章发布自:hicode.club,转载请注明出处,谢谢!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于