采用docker 部署后端golang服务
1、首先需要安装docker 这里不再细说,操作安装文档linux docker 安装文档
2、其次需要初始化Docker Swarm 模式。你可以在 Docker 主机上运行以下命令:
docker swarm init
初始化完成后,检查下Swarm 状态,你可以运行以下命令来确认 Swarm 状态是否正常:
docker info
在输出中,你应该看到类似于以下内容,表示 Swarm 已启用:
Swarm: active
NodeID: gql7fxkr4f3ddlcig7csko0tx
Is Manager: true
ClusterID: <ClusterID>
...
加入工作节点:
如果你有其他机器或节点需要加入 Swarm 集群作为工作节点,可以使用 docker swarm join 命令,命令已经在输出中给出:
docker swarm join --token SWMTKN-1-4ekwch9dak28qzuyneaewu8403qia6ednsqqn731lv79v2txbj-dmwj7wrttsr442pgglzmtl1ix 10.0.4.20:2377
3、检查docker Swarm 下的网络模式 ,在 Docker Swarm 模式下,只有使用 overlay 驱动的网络才可以用于服务部署,而 bridge 驱动的网络只能用于单主机的容器,不能在多主机的 Swarm 集群中使用。
检查网络命令
docker network ls
你可以通过执行 docker network ls 来列出当前所有的 Docker 网络。命令的输出类似如下:
NETWORK ID NAME DRIVER SCOPE
e8b8c6a342a9 bridge bridge local
72b13ab0e3ab host host local
a5a3a23fbb64 none null local
12345abcd678 app-network overlay swarm
我的服务器网络显示为:
[root@VM-4-20-centos app]# docker network ls
NETWORK ID NAME DRIVER SCOPE
vuip9ry3q1td app-network overlay swarm
ab2c39619485 app_app-network bridge local
7f2ce53d815a bridge bridge local
02ba8de20aa8 docker_gwbridge bridge local
1f9a717a6aef host host local
uj3pfaztxt0u ingress overlay swarm
5ebd5dde863b my_stack_app-network bridge local
f102f9997f70 none null local
[root@VM-4-20-centos app]#
输出字段解释:
NETWORK ID:网络的唯一标识符。
NAME:网络的名称,例如 bridge、host、none,或你自定义的网络如 app-network。
DRIVER:网络的驱动类型,常见的有 bridge、host、overlay 等。
SCOPE:网络的作用范围,local 表示仅限于当前主机,swarm 表示该网络可跨多个 Swarm 节点使用。
如果你看到 app-network 已经存在,且它的驱动类型是 overlay,说明该网络已经创建并且可以在 Swarm 集群中使用。
如果 docker network ls 中没有看到 overlay 类型的 app-network,则需要手动创建这个网络,命令如下:
docker network create --driver overlay app-network
4、编写docker-compose.yml 部署文件
version: '3.8'
services:
app:
image: registry.cn-shenzhen.aliyuncs.com/goper/app:7a2dd68-20241205144225
ports:
- "8990:8990"
networks:
- app-network
deploy:
replicas: 3 # 配置 3 个副本
update_config:
parallelism: 1 # 每次更新一个副本,确保逐个重启副本
delay: 10s # 每个副本更新间的延迟
failure_action: rollback # 如果更新失败,回滚到上一个工作版本
restart_policy:
condition: on-failure # 容器失败时才重启
networks:
app-network:
external: true # 使用外部创建的 overlay 网络
5、重新部署服务: 执行以下命令重新部署你的服务:
docker stack deploy -c docker-compose.yml my_stack
部署完成后,可以查看docker swarm 服务状态
-
查看 Swarm 服务的状态
在 Swarm 模式下,容器不直接列出在 docker ps 中。你需要查看 Swarm 服务的状态和任务,而不是直接查看容器。你可以使用以下命令来检查 my_stack 中的服务和任务:docker stack services my_stack
这将显示 my_stack 中所有服务的状态,包括每个服务的副本数、更新状态等。
如果 my_stack 中有服务正在运行,应该会看到类似如下的输出:
ID NAME MODE REPLICAS IMAGE
------------------- ------------------ ------------------ ------------------ ---------------------------
abcd12345678 my_stack_app replicated 3/3 registry.cn-shenzhen.aliyuncs.com/goper/app:最新镜像
我的服务器本地显示:
[root@VM-4-20-centos app]# docker stack services my_stack
ID NAME MODE REPLICAS IMAGE PORTS
5mlselws7kbj my_stack_app replicated 3/3 registry.cn-shenzhen.aliyuncs.com/goper/app:7a2dd68-20241205144225 *:8990->8990/tcp
[root@VM-4-20-centos app]#
-
查看 Swarm 任务的状态
如果服务在 Swarm 中已经创建,但任务没有正常运行,你可以使用以下命令查看具体的任务状态:docker service ps my_stack_app
我的服务器本地显示:
[root@VM-4-20-centos app]# docker service ps my_stack_app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
fjw3l27ehyqs my_stack_app.1 registry.cn-shenzhen.aliyuncs.com/goper/app:7a2dd68-20241205144225 VM-4-20-centos Running Running 19 minutes ago
lk1pum1faprb \_ my_stack_app.1 registry.cn-shenzhen.aliyuncs.com/goper/app:32461e1-20241205195126 VM-4-20-centos Shutdown Shutdown 19 minutes ago
k1n0ahl5gasw my_stack_app.2 registry.cn-shenzhen.aliyuncs.com/goper/app:7a2dd68-20241205144225 VM-4-20-centos Running Running 19 minutes ago
7vtzyt5reivk \_ my_stack_app.2 registry.cn-shenzhen.aliyuncs.com/goper/app:32461e1-20241205195126 VM-4-20-centos Shutdown Shutdown 19 minutes ago
gl7p3e9gb029 my_stack_app.3 registry.cn-shenzhen.aliyuncs.com/goper/app:7a2dd68-20241205144225 VM-4-20-centos Running Running 20 minutes ago
jg4g7j33d1pk \_ my_stack_app.3 registry.cn-shenzhen.aliyuncs.com/goper/app:32461e1-20241205195126 VM-4-20-centos Shutdown Shutdown 20 minutes ago
[root@VM-4-20-centos app]#
这将显示服务 my_stack_app 的所有任务,包括每个任务的状态(例如是否正在启动或出现错误)。
-
检查服务日志
你也可以检查 Swarm 服务的日志,查看是否有错误信息:docker service logs my_stack_app
我的服务器本地显示:
[root@VM-4-20-centos app]# docker service logs my_stack_app
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | starting...
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | start success
my_stack_app.1.lk1pum1faprb@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | starting...
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | start success
my_stack_app.2.7vtzyt5reivk@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | starting...
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | start success
my_stack_app.3.jg4g7j33d1pk@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | starting...
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | start success
my_stack_app.3.gl7p3e9gb029@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | starting...
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | start success
my_stack_app.1.fjw3l27ehyqs@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/healthcheck.sh
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/healthcheck.sh
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | ########################################## start exec /etc/kickStart.d/run.sh
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | starting...
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | start success
my_stack_app.2.k1n0ahl5gasw@VM-4-20-centos | ########################################## done exec /etc/kickStart.d/run.sh
[root@VM-4-20-centos app]#
这将显示 my_stack_app 服务的日志,可能会提供更多关于服务启动失败或出现问题的线索。
- 确认端口映射
请注意,在 docker ps 输出中显示的是 8090 和 8991 端口映射,而你的服务 my_stack_app 配置的是端口 8990。你可以在 docker service ps 或 docker stack services 输出中确认服务是否正确绑定到 8990 端口。
总结:
使用 docker stack services my_stack 和 docker service ps my_stack_app 查看服务和任务的状态。
检查日志和任务的具体状态,确认是否有错误。
确认端口映射是否正确。