使用Docker部署Golang和Javascript应用的实战指南
使用Docker部署Golang和Javascript应用的实战指南
我的项目位于:https://github.com/BuddhiLW/free-riding
我可以在本地非常轻松地运行它。具体说明在 README 文件中。
但是,我无法在 Docker 容器中完成同样的操作。
我希望运行一个能完成三件事的 Dockerfile:
- 安装
lynx,它将由 Go 后端使用。 - 使用
httpd运行前端(容器内部端口 8000)。 - 运行 Go 服务器,前端将向其发起请求(容器内部端口 8181)。
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y lynx
FROM httpd:2.4
COPY ./docs/ /usr/local/apache2/htdocs/
# Start from a Debian image with the latest version of Go installed
# and a workspace (GOPATH) configured at /go.
FROM golang
# Copy the local package files to the container's workspace.
ADD ./go/ /go/src/golang.org/x/example/outyet
# Build the outyet command inside the container.
# (You may fetch or manage dependencies here,
# either manually or with a tool like "godep".)
RUN go install golang.org/x/example/outyet
# Run the outyet command by default when the container starts.
ENTRYPOINT /go/bin/outyet
# Document that the service listens on port 8080.
EXPOSE 8181
我尝试运行 Docker 容器(前端加载了,但 Go 后端没有):
sudo docker run -dit --name my-running-app2 -p 8081:80 my-apache2
更多关于使用Docker部署Golang和Javascript应用的实战指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好,@BuddhiLW,欢迎来到论坛。
Dockerfile 的哪一步失败了?构建镜像时是否出现错误?
容器是否能够无故障运行且不重启?
如果是这样,容器的日志输出是否包含任何错误信息?
你能连接到容器内部的 shell 吗?ps ax 命令是否显示 Go 二进制文件正在运行?如果没有,从容器 shell 重启 Go 二进制文件会发生什么?
更多关于使用Docker部署Golang和Javascript应用的实战指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的Dockerfile存在几个关键问题:使用了多个FROM指令导致只有最后一个镜像生效,并且没有正确构建和运行Go应用。以下是修正后的完整Dockerfile:
# 使用多阶段构建
FROM golang:1.21-alpine AS go-builder
# 安装依赖和lynx
RUN apk add --no-cache lynx
# 设置工作目录
WORKDIR /app
# 复制Go模块文件
COPY go/go.mod go/go.sum ./
RUN go mod download
# 复制Go源代码
COPY go/ .
# 构建Go应用
RUN go build -o main .
# 前端构建阶段
FROM httpd:2.4-alpine AS frontend-builder
COPY ./docs/ /usr/local/apache2/htdocs/
# 最终镜像
FROM alpine:latest
# 安装运行时依赖
RUN apk add --no-cache lynx apache2
# 从前端构建阶段复制文件
COPY --from=frontend-builder /usr/local/apache2/htdocs/ /var/www/localhost/htdocs/
# 从Go构建阶段复制二进制文件
COPY --from=go-builder /app/main /usr/local/bin/main
COPY --from=go-builder /app/lynx /usr/local/bin/lynx
# 复制Apache配置
COPY httpd.conf /etc/apache2/httpd.conf
# 暴露端口
EXPOSE 8000 8181
# 启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
创建启动脚本 entrypoint.sh:
#!/bin/sh
# 启动Apache前端
httpd -f /etc/apache2/httpd.conf &
# 启动Go后端
/usr/local/bin/main &
# 保持容器运行
wait
创建Apache配置 httpd.conf:
ServerRoot "/usr"
Listen 8000
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin you@example.com
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/localhost/htdocs"
<Directory "/var/www/localhost/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog /proc/self/fd/2
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog /proc/self/fd/1 common
</IfModule>
<IfModule mime_module>
TypesConfig /etc/apache2/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
构建和运行命令:
# 构建镜像
docker build -t free-riding-app .
# 运行容器
docker run -dit --name free-riding \
-p 8080:8000 \
-p 8181:8181 \
free-riding-app
# 查看日志
docker logs free-riding
# 测试前端
curl http://localhost:8080
# 测试后端
curl http://localhost:8181
如果你的Go应用需要特定的模块依赖,确保 go/go.mod 文件正确配置。对于你的项目结构,Go后端应该监听8181端口,前端通过该端口与后端通信。

