最近写了一个博客的后端项目,本来是用docker compose部署的,只需要两行命令就可以部署
docker compose builddocker compose up -d
Dockerfile:
FROM golang:1.23-alpine AS builderWORKDIR /appCOPY . .RUN go mod tidyRUN CGO_ENABLED=0 GOOS=linux go build -o main .# 运行阶段FROM alpine:latestWORKDIR /appCOPY --from=builder /app/main .COPY --from=builder /app/config.yaml .# 安装等待依赖服务的工具RUN apk add --no-cache bashCOPY wait-for.sh /app/wait-for.shRUN chmod +x /app/wait-for.sh# 初始化脚本COPY entrypoint.sh /app/entrypoint.shRUN chmod +x /app/entrypoint.shEXPOSE 8080CMD ["/app/entrypoint.sh"]
docker-compose.yml:
version: '3.8'services: mysql: image: mysql:8.0 container_name: blog-mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: blog_db ports: - "3307:3306" volumes: - mysql_data:/var/lib/mysql networks: - blog-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 10 redis: image: redis:7.4-alpine container_name: blog-redis volumes: - redis_data:/data networks: - blog-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 10s retries: 10 elasticsearch: image: elasticsearch:8.17.0 container_name: blog-es environment: - discovery.type=single-node - xpack.security.enabled=false - ES_JAVA_OPTS=-Xms512m -Xmx512m volumes: - es_data:/usr/share/elasticsearch/data networks: - blog-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9200/_cat/health"] interval: 10s timeout: 10s retries: 10 rabbitmq: image: rabbitmq:4.1.0-alpine # 官方4.x没有alpine版本,推荐使用3.11.x container_name: blog-rabbitmq environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest ports: - "5672:5672" # AMQP协议端口 - "15672:15672" # 管理界面端口 volumes: - rabbitmq_data:/var/lib/rabbitmq networks: - blog-network healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"] interval: 10s timeout: 10s retries: 10 backend: build: . container_name: blog-backend ports: - "8080:8080" environment: - ENV=production depends_on: mysql: condition: service_healthy redis: condition: service_healthy elasticsearch: condition: service_healthy rabbitmq: condition: service_healthy networks: - blog-networkvolumes: mysql_data: redis_data: es_data: rabbitmq_data:networks: blog-network: driver: bridge name: blog-network
在本地部署成功了,但是由于我的云服务器只有2核2G内存,在build的时候服务器CPU和内存利用率会飙到90%+,尝试了很久后还是不行,于是决定在本地构建镜像,然后上传到Docker Hub仓库,在云服务器上直接拉取镜像
1首先要在Docker Hub上创建仓库
注册一个docker账户,然后点击右侧按钮创建一个仓库
2 本地构建镜像
首先登录一下,使用docker login -u userName
然后在项目目录构建镜像,-t
指定镜像名称
docker build -t blog-backend .
给镜像打上tag,格式为 docker tag 镜像名 用户名/仓库名:tag标签
,仓库名是刚才创建的,tag标签不打默认为latest
docker tag blog-backend yudeng2004/blog-backend:1.0
上传至远程仓库,格式为 docker push 用户名/仓库名:tag标签
docker push yudeng2004/blog-backend:1.0
上传成功后,在docker hub上可以看到对应的镜像和标签
3. 远程部署镜像
同样在远程服务器上登录docker账户(需要用到魔法),然后拉取镜像,格式为 docker pull 用户名/仓库名:tag标签
docker pull yudeng2004/blog-backend:1.0
查看一下是否拉取成功
这里的镜像是拉取到的,不用再构建,所有需要修改一下docker-compose.yml
,删除build相关的部分,指定镜像名字
# 其他保持不变 backend: image: yudeng2004/blog-backend:1.0 # build: .
这样就能运行了
docker compose up -d