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

相关推荐
WindSearcher8 分钟前
OAuth协议
后端
LanLance25 分钟前
ES101系列09 | 运维、监控与性能优化
java·运维·后端·elasticsearch·云原生·性能优化·golang
Piper蛋窝30 分钟前
我所理解的 Go 的 `panic` / `defer` / `recover` 异常处理机制
后端·go
clk66071 小时前
Spring Boot
java·spring boot·后端
皮皮高2 小时前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv
弱冠少年2 小时前
golang入门
开发语言·后端·golang
Humbunklung2 小时前
Rust 函数
开发语言·后端·rust
喜欢踢足球的老罗2 小时前
在Spring Boot 3.3中使用Druid数据源及其监控功能
java·spring boot·后端·druid
jakeswang2 小时前
StarRocks
后端·架构
龙云飞谷2 小时前
从原理到调参,小白也能读懂的大模型微调算法Lora
后端