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

相关推荐
2401_8827275732 分钟前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
心仪悦悦1 小时前
Scala中的集合复习(1)
开发语言·后端·scala
代码小鑫1 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖1 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
uzong3 小时前
一个 IDEA 老鸟的 DEBUG 私货之多线程调试
java·后端
飞升不如收破烂~3 小时前
Spring boot常用注解和作用
java·spring boot·后端
何遇mirror3 小时前
云原生基础-云计算概览
后端·云原生·云计算
岁岁岁平安3 小时前
springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
java·spring boot·后端·idea
颜淡慕潇4 小时前
【K8S系列】kubectl describe pod显示ImagePullBackOff,如何进一步排查?
后端·云原生·容器·kubernetes