1. 数据库:
(1). docker文件结构:
mysql
├─ data
├─ mylog
└─ conf
└─ my.cnf(配置文件放在这)
(2). my.conf:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
// 数据目录
datadir=/data
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
default-storage-engine=INNODB
// 开启mysql日志
log-error=/mylog/error.log
slow_query_log=on
long_query_time=1
slow-query-log-file=/mylog/slow.log
(3). 命令:
docker run --name mysql -d \
-p 3306:3306 \
-v /home/root/mysql/data:/data \
-v /home/root/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/root/mysql/mylog:/mylog \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
注:
①. 有防火墙则开启:
sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
②. 生产环境是不需要端口映射的,直接连接容器中的ip地址和端口.
(4). 权限问题:
①. 启动不了,查看docker日志:
docker logs mysql
报错:Could not open file 'mylog/error.log' fro error logging:Permission denied
②. 查看文件:
ll
drwxrwxr-x. 6 systemd-bus-proxy root 4096 Nov 24 23:19 data
drwxrwxr-x. 6 david david 4096 Nov 24 23:19 data
③. 生成临时容器查看用户:
docker run -it --rm --entrypoint="/bin/bash" mysql:5.7 -c "cat /etc/group "
mysql:x:999: // 可以看到mysql运行对应的用户是999,注:不同的机器值不同.
a. 因为容器默认使用的是mysql用户,需要把映射的文件夹修改对应的owner.
④. 设置mylog用户:
cat /etc/passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin // 查到宿主机的999对应polkitd用户
chown -R 999 mylog
a. 让容器中的999用户和本机的999用户有同一个id,并不一定是同一个用户名.
⑤. 查看并测试慢日志记录:
show variables like 'log%';
select sleep(3)
4. go编译:
(1). 交叉编译后传到服务器:
set GOOS=linux
set GOARCH=amd64
go build -o build/gin main.go
注:
①. 交叉编译是指可以编译成.exe可执行程序,也可以编译成linux可执行程序.
(2). 配置goland和服务器ssh同步:
这里一定要点一下获取根目录:
①. Local path:表示哪个目录需要上传到服务器.
②. Deployment path:配合上面的root path表示上传到服务器哪个目录.
上传后在服务器加上可执行权限:
chomd +x gin
5. 生产环境:
①. gin在生产环境,不可能就是一个build后的一个可执行文件在线上运行.
②. 浏览器访问,不是直接访问go的服务.而是访问nginx或其它网关.
③. nginx用一个反向代理,这个是对外的.gin服务不对外.不映射端口(由nginx进行反向代理).
④. 如果还有业务功能,可以结合consul来自动发现.
⑤. 访问过程:
nginx -> gin -> mysql
(1). gin容器:
①. go可以支持交叉编译,所以,只要一个alpine镜像就可以了.
②. 拉取镜像:
docker pull alpine
③. 容器:
docker run --name ginserver -d \
-v /home/root/web:/server \
-w /server \
alpine ./gin
(2). nginx容器:
①. 拉取镜像:
docker pull nginx:alpine
③. 配置文件:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http{
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
upstream gin {
server 10.3.69.3:8080;
}
server {
listen 80;
location / {
proxy_pass http://gin; // 这个gin就是上面写的gin
#proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
③. 查看端口:
docker inspect mysql | grep IP
④. 容器:
docker run -d --name ngx \
-v /home/root/ngx/nginx.conf:/etc/nginx/nginx.conf \
-p 80:80
nginx:alpine