一、docker自定义网络
首先新建一个docker自定义网络,数据库、服务器和nginx都需要使用这个网络
shell
docker network create --driver bridge my_network
- --driver bridge:使用 bridge 网络模式。
- my_network:自定义的网络名称。
二、MySQL部署
使用镜像创建MySQL容器
shell
docker run --name mysql -e MYSQL_ROOT_PASSWORD=test123 -d mysql:8.4.3
- --name mysql:为容器指定一个名称,这里命名为 mysql。
- -e MYSQL_ROOT_PASSWORD=test123:设置 MySQL 的 root 用户密码。
- -d:以后台模式运行容器。
- mysql:8.4.3:使用的镜像名称和标签。
进入MySQL容器
shell
docker exec -it containerid mysql -uroot -ptest123
三、Redis部署
shell
docker run --name redis -d redis:5.0.5
- --name my-redis:为容器指定一个名称,这里命名为 redis。
- -d:以后台模式运行容器。
- redis:5.0.5:使用的镜像名称和标签。
四、nginx部署
使用镜像创建nginx容器
nginx使用的docker镜像版本为nginx:stable-alpine3.20-perl
配置对应的nginx.conf文件:
nginx
events {
worker_connections 1024;
}
http {
upstream ws {
server 192.168.1.111:9031;
}
upstream http {
server 192.168.1.111:9402;
}
server {
listen 80;
# 反向代理第一个 WebSocket 服务
location /connect/ {
proxy_pass http://ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 反向代理第一个 HTTP 服务
location /version/ {
proxy_pass http://http/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 默认路由(可选)
location / {
return 404; # 如果没有匹配的路径,返回 404 错误
}
}
}
启动nginx容器
shell
docker run --name nginx -v D:/X1/server/nginx.conf:/etc/nginx/nginx.conf -p 80:80 --network my_network -d nginx:stable-alpine3.20-perl
- -v D:/X1/server/nginx.conf:/etc/nginx/nginx.conf:将本地的nginx.conf文件挂载到容器的/etc/nginx/nginx.conf目录。需要注意的是,-v后的文件挂载参数,本地一定要使用绝对路径,否则可能会报错
- -p 80:80:将主机的80端口映射到容器的80端口。
- --network my_network:将容器加入名为 my_network 的自定义网络。
- -d:以后台模式运行容器。
- nginx:stable-alpine3.20-perl:使用nginx镜像,使用标签stable-alpine3.20-perl。
五、游戏服务器部署
测试docker镜像
shell
docker run -it --name test -v .:/go/src -w /go/src golang:1.21.8-alpine
- -it:以交互模式运行容器,并开启标准输入输出。
- --name test:为容器指定一个名称,这里命名为 test。
- -v .:/go/src:将当前目录挂载到容器的 /go/src 目录。
- -w /go/src:将工作目录设置为 /go/src。
shell
GOPROXY=https://goproxy.cn,direct go mod tidy
使用代理安装相关的包,最后尝试在容器内执行启动服务器命令,看是否可以正常启动
docker-compose.yaml配置
这里选择部署六个进程,且每个进程分配一个独立的ip和端口号,同属于同一子网,这样容器之间可以相互通信。
yaml
version: '2.4' # yaml文件版本
services: # 服务:一个容器对应一个服务器
gate-1:
image: golang:1.21.8-alpine3.19 # 指定对应的镜像
ports:
- "8011:8011" # 容器和宿主机的端口映射
command: ["./main", "-start", "nodeid=1001"] # 容器启动后需要执行的指令
container_name: "gate-1" # 容器名称
networks: # 网络
my_network:
ipv4_address: 192.168.1.111
volumes: # 文件映射
- .:/root/src
working_dir: /root/src # 工作路径
tty: true # 容器内前台启动
center-1:
image: golang:1.21.8-alpine3.19
ports:
- "8021:8021"
command: ["./main", "-start", "nodeid=2001"]
container_name: "center-1"
networks:
my_network:
ipv4_address: 192.168.1.121
volumes:
- .:/root/src
working_dir: /root/src
tty: true
game-1:
image: golang:1.21.8-alpine3.19
ports:
- "8031:8031"
command: ["./main", "-start", "nodeid=3001"]
container_name: "game-1"
networks:
my_network:
ipv4_address: 192.168.1.131
volumes:
- .:/root/src
working_dir: /root/src
tty: true
game-2:
image: golang:1.21.8-alpine3.19
ports:
- "8032:8032"
command: ["./main", "-start", "nodeid=3002"]
container_name: "game-2"
networks:
my_network:
ipv4_address: 192.168.1.132
volumes:
- .:/root/src
working_dir: /root/src
tty: true
battle-1:
image: golang:1.21.8-alpine3.19
ports:
- "8041:8041"
command: ["./main", "-start", "nodeid=4001"]
container_name: "battle-1"
networks:
my_network:
ipv4_address: 192.168.1.141
volumes:
- .:/root/src
working_dir: /root/src
tty: true
user-1:
image: golang:1.21.8-alpine3.19
ports:
- "8051:8051"
command: ["./main", "-start", "nodeid=5001"]
container_name: "user-1"
networks:
my_network:
ipv4_address: 192.168.1.151
volumes:
- .:/root/src
working_dir: /root/src
tty: true
networks:
my_network:
external: true
dev:
driver: bridge
pro:
driver: bridge
六、测试
1、启动全部docker进程
2、访问http://localhost/version/查看是否有正常返回
3、客户端ws连接服务器查看是否正常
4、登录后查看数据库是否正常写入