专业编程基础技术教程

网站首页 > 基础教程 正文

Docker本地构建镜像到远程服务器部署

ccvgpt 2025-06-24 12:08:59 基础教程 2 ℃

最近写了一个博客的后端项目,本来是用docker compose部署的,只需要两行命令就可以部署

docker compose builddocker compose up -d

Dockerfile:

Docker本地构建镜像到远程服务器部署

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

Tags:

最近发表
标签列表