docker部署go游戏服务器(进阶版)

一、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、登录后查看数据库是否正常写入

相关推荐
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
AskHarries3 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion4 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp4 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder4 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚5 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心6 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴7 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲7 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
机器之心7 小时前
AAAI 2025|时间序列演进也是种扩散过程?基于移动自回归的时序扩散预测模型
人工智能·后端