最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到精通Docker Compose 輕松部署微服務(wù)實戰(zhàn)教程

 更新時間:2025年07月30日 09:32:06   作者:拉里呱唧  
本文介紹使用Docker Compose部署基于SpringCloudAlibaba的微服務(wù)項目,涵蓋用戶登錄積分功能,涉及Gateway、Redis、MySQL等組件,通過編寫Dockerfile和YAML配置文件,結(jié)合腳本實現(xiàn)環(huán)境容器與服務(wù)容器的自動化部署與驗證,感興趣的朋友一起看看吧

從零到一:Docker Compose 輕松部署微服務(wù)實戰(zhàn)

今天實踐一下使用Docker Compose部署一個微服務(wù)項目。

項目包括docker compose部署的代碼都放在了我的github上:https://github.com/cra358/demo

首先簡單寫一個微服務(wù)項目,主要技術(shù)棧:Spring Cloud Alibaba、redis、Mysql、Gateway、SaToken

主要就是用戶登陸積分記錄功能。用戶每登陸系統(tǒng)一次,用戶登陸積分+1。

服務(wù)劃分

  • gatway主要實現(xiàn)登陸校驗。
  • user實現(xiàn)用戶注冊、退出、積分查詢增長功能。

容器劃分

  • 環(huán)境容器:nacos、mysql、redis

  • 服務(wù)容器:gateway、user

服務(wù)打包package:

先雙擊clean,清理target目錄文件,再雙擊package文件,點(diǎn)擊右上角的>中的帶斜線的圈可以跳過test。

在target目錄中可以找到對應(yīng)的jar包。確定沒有問題后就可以開始部署了。

安裝Docker(略)

Docker 使用的版本是Docker version 27.5.0,安裝完成后在pull一下mysql、redis和nacos的鏡像,方便后面創(chuàng)建環(huán)境容器。本次使用的是mysql8.0、redis7.2.3、nacos v2.2.0版本。

Docker Compose安裝

在選擇安裝版本時,需要注意Docker Compose 版本和Docker版本對應(yīng)。我使用的Docker Compose版本是Docker Compose version v2.30.0

  • https://github.com/docker/compose/releases/tag/v2.30.0。到這里下載Docker Compose文件。

  • 將文件移動到:/usr/local/bin/docker-compose

sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose

  • 添加可執(zhí)行權(quán)限

chmod +x /usr/local/bin/docker-compose

  • 測試安裝成功

docker-compose --version

安裝成功后,正式準(zhǔn)備部署。在項目目錄的docker目錄中:

docker下的demo目錄存放兩個服務(wù)模塊的我們之前打包生成好的jar包和Dockerfile文件:

現(xiàn)在,我們需要為每個微服務(wù)編寫 Dockerfile內(nèi)容,用于構(gòu)建 Docker 鏡像。Dockerfile 定義了鏡像的構(gòu)建過程,包括基礎(chǔ)鏡像、依賴安裝、代碼復(fù)制、啟動命令等。

為微服務(wù)編寫Dockerfile文件

  • user
# 基礎(chǔ)鏡像
FROM openjdk:17
# 掛載目錄,就是容器中的目錄
VOLUME /home/user
# 創(chuàng)建目錄,也是容器中的目錄
RUN mkdir -p /home/user
# 指定路徑
WORKDIR /home/user
# 復(fù)制jar文件到容器指定路徑,就是把宿主機(jī)中的./jar/user.jar文件復(fù)制到容器/home/user/user.jar中
COPY ./jar/user.jar /home/user/user.jar
# 啟動用戶服務(wù)
ENTRYPOINT ["java","-jar","user.jar"]
  • gateway
# 基礎(chǔ)鏡像
FROM openjdk:17
# 掛載目錄
VOLUME /home/gateway
# 創(chuàng)建目錄
RUN mkdir -p /home/gateway
# 指定路徑
WORKDIR /home/gateway
# 復(fù)制jar文件到路徑
COPY ./jar/gateway.jar /home/gateway/gateway.jar
# 啟動用戶服務(wù)
ENTRYPOINT ["java","-jar","gateway.jar"]

完成上述步驟后,準(zhǔn)備環(huán)境容器的Docker文件和一些配置:

mysql容器準(zhǔn)備:

在db目錄下存放項目所需的初始數(shù)據(jù)庫表。同時由于nacos配置依賴于mysql存放相關(guān)數(shù)據(jù),也在這里存放一個nacos_config.sql文件,文件內(nèi)容直接網(wǎng)上照抄即可。

db.sql文件如下:

CREATE DATABASE IF NOT EXISTS `demo_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `demo_user`;
-- 刪除已存在的表(謹(jǐn)慎使用)
DROP TABLE IF EXISTS `user`;
-- 創(chuàng)建 user 表
CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID,主鍵',
    `username` varchar(50) NOT NULL COMMENT '用戶名',
    `password` varchar(255) NOT NULL COMMENT '密碼(存儲加密后的密碼)',
    `score` int(11) NOT NULL DEFAULT '0' COMMENT '用戶積分',
    PRIMARY KEY (`id`),
    UNIQUE KEY `idx_username` (`username`) COMMENT '用戶名唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

編寫mysql容器的Dockerfile:

# 基礎(chǔ)鏡像,就是docker images命令下我們之前pull的mysql鏡像,據(jù)此創(chuàng)建mysql容器
FROM mysql:8.0
# 執(zhí)行sql腳本
# `/docker-entrypoint-initdb.d/`是MySQL官方鏡像中的一個特殊目錄,用于存放初始化數(shù)據(jù)庫的腳本文件。
# 把剛剛的兩個sql文件存放到mysql容器中
ADD ./db/*.sql /docker-entrypoint-initdb.d/
  • redis容器準(zhǔn)備:

在docker/redis/conf目錄下寫一個redis配置文件:redis.conf,這里只寫了一個密碼:

requirepass 1234

同樣,編寫redis容器的Dockerfile:

# 基礎(chǔ)鏡像
FROM redis:7.2.3
# 掛載目錄
VOLUME /home/demo/redis
# 創(chuàng)建目錄
RUN mkdir -p /home/demo/redis
# 指定路徑
WORKDIR /home/demo/redis
# 復(fù)制剛剛的redis.conf文件到容器指定路徑
COPY ./conf/redis.conf /home/demo/redis/redis.conf
  • nacos容器準(zhǔn)備:

在docker/nacos/conf中編寫nacos配置文件:application.properties

spring.datasource.platform=mysql
spring.sql.init.platform=mysql
db.num=1
# 這里的nacos_config就是nacos在mysql容器中使用到的數(shù)據(jù)庫,和前面的nacos_config.sql中創(chuàng)建出來的數(shù)據(jù)庫要一致
# 下面的配置不一樣有可能會導(dǎo)致意想不到的錯誤
db.url.0=jdbc:mysql://demo-mysql:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
# 制定用戶、密碼
db.user.0=root
db.password.0=20041111
# 這里后面的直接復(fù)制就可以了
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
management.endpoints.web.exposure.include=*
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.basedir=/home/demo/nacos/tomcat/logs
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=false
nacos.core.auth.default.token.expire.seconds=18000
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
nacos.core.auth.caching.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.istio.mcp.server.enabled=false

編寫nacos的Dockerfile文件:

# 基礎(chǔ)鏡像
FROM nacos/nacos-server:v2.2.0
# 復(fù)制剛剛的application.properties文件到nacos容器的制定路徑
COPY ./conf/application.properties /home/nacos/conf/application.properties

到此,我們就準(zhǔn)備好了環(huán)境容器和服務(wù)容器的準(zhǔn)備工作。

編寫 DockerCompose.yml 文件

version: '3'
services:
  demo-nacos:
  	# 容器名
    container_name: demo-nacos
    image: nacos/nacos-server:v2.2.0
    build:
      context: ./nacos
    environment:
      - MODE=standalone
      # 使用 mysql 作為數(shù)據(jù)庫
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=demo-mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=20041111
      # 設(shè)置連接 mysql 的連接參數(shù)
      - MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrievalyaml=true"
    volumes:
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    # 要暴露三個端口,至于為什么,可以網(wǎng)上查下看看
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    privileged: true
    networks:
      - demo-network
    # nacos依賴于mysql先啟動成功
    depends_on:
      demo-mysql:
        condition: service_healthy
#      - demo-mysql
  demo-mysql:
  	# 容器名
    container_name: demo-mysql
    # 鏡像
    image: mysql:8.0
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql
      - ./mysql/db:/docker-entrypoint-initdb.d/
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]
    privileged: true
    networks:
      - demo-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 5
    environment:
      MYSQL_ROOT_PASSWORD: '20041111'
  demo-redis:
    container_name: demo-redis
    image: redis:7.2.3
    build:
      context: ./redis
      dockerfile: Dockerfile
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/home/demo/redis/redis.conf
      - ./redis/data:/data
    command: redis-server /home/demo/redis/redis.conf
    networks:
      - demo-network
  # 網(wǎng)關(guān)服務(wù)容器
  demo-gateway:
    container_name: demo-gateway
    build:
      context: ./demo/gateway
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    depends_on:
      - demo-redis
      - demo-nacos
    networks:
      - demo-network
  # 用戶服務(wù)容器
  demo-user:
    container_name: demo-user
    build:
      context: ./demo/user
      dockerfile: Dockerfile
    # 端口映射
    ports:
      - "8001:8001"
    depends_on:
      - demo-redis
      - demo-mysql
      - demo-nacos
    networks:
      - demo-network
# 確保都在同一個網(wǎng)絡(luò)下
networks:
  demo-network:
    driver: bridge

sh腳本

上述工作完成后,我們寫一個sh腳本,方便我們清理復(fù)制jar包、運(yùn)行docker-compose.yml文件來啟動容器。

  • cleanjar.sh
#!/bin/bash
# 刪除jar文件
echo "開始清理jar文件"
rm -f ../demo/gateway/jar/gateway.jar
rm -f ../demo/user/jar/user.jar
echo "清理完成"
  • copy.sh
#!/bin/bash
# 創(chuàng)建目標(biāo)目錄
mkdir -p ../mysql/db
mkdir -p ../demo/gateway/jar
mkdir -p ../demo/user/jar
# 復(fù)制項目db目錄下的sql文件到docker/mysql/db目錄中
echo "begin copy sql "
cp ../../sql/db.sql ../mysql/db
echo "end copy sql "
# 復(fù)制target目錄下的jar文件到docker目錄下的demo的jar目錄中
echo "begin copy jar "
cp ../../gateway/target/com.chenxw.demo.gateway-1.0-SNAPSHOT.jar ../demo/gateway/jar/gateway.jar
cp ../../user/target/com.chenxw.demo.user-1.0-SNAPSHOT.jar ../demo/user/jar/user.jar
echo "end copy jar "
  • deploy.sh:Docker Compose運(yùn)行腳本
#!/bin/sh
# 使用說明,用來提示輸入?yún)?shù)
usage(){
	echo "Usage: sh 執(zhí)行腳本.sh [base|services|stop|rm]"
	exit 1
}
# 啟動基礎(chǔ)環(huán)境(必須)
base(){
	docker-compose up -d demo-mysql demo-redis demo-nacos
}
# 啟動程序模塊(必須)
services(){
	docker-compose up -d demo-gateway demo-user
}
# 關(guān)閉所有環(huán)境/模塊
stop(){
	docker-compose stop
}
# 刪除所有環(huán)境/模塊
rm(){
	docker-compose rm
}
# 根據(jù)輸入?yún)?shù),選擇執(zhí)行對應(yīng)方法,不輸入則執(zhí)行使用說明
case "$1" in
"base")
	base
;;
"services")
	services
;;
"stop")
	stop
;;
"rm")
	rm
;;
*)
	usage
;;
esac

到此,所有準(zhǔn)備工作都完成了。但是我們要注意,在項目的apppication.yml文件中,我們要把127.0.0.1或者localhost改成指定容器名,每個容器都有自己的ip。比如這里要連接mysql就改成demo-mysql,要連接redis就改成demo-redis,要配置nacos地址就改成demo-nacos

比如gateway服務(wù)中的apppication.yml文件:

server:
  port: 8000 # 指定啟動端口
spring:
  application:
    name: demo-gateway # 容器名稱,就是我們在docker-compose.yml中指定的container_name
  cloud:
    config:
      enabled: false
    nacos:
      discovery:
        enabled: true # 啟用服務(wù)發(fā)現(xiàn)
        group: DEFAULT_GROUP # 所屬組
        namespace: demo # 命名空間
        server-addr: demo-nacos:8848 # 指定 Nacos 配置中心的服務(wù)器地址
        username: nacos
        password: nacos
    gateway:
      routes:
        - id: user
          uri: lb://demo-user
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=0
  data:
    redis:
      database: 1 # Redis 數(shù)據(jù)庫索引
      host: demo-redis # Redis 服務(wù)器地址
      port: 6379 # Redis 服務(wù)器連接端口
      password: 1234 # Redis 服務(wù)器連接密碼(默認(rèn)為空)
      timeout: 5s # 讀超時時間
      connect-timeout: 5s # 鏈接超時時間
      lettuce:
        pool:
          max-active: 200 # 連接池最大連接數(shù)
          max-wait: -1ms # 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
          min-idle: 0 # 連接池中的最小空閑連接
          max-idle: 10 # 連接池中的最大空閑連接
############## Sa-Token 配置 (文檔: https://sa-token.cc) ##############
sa-token:
  # token 名稱(同時也是 cookie 名稱)
  token-name: Authorization
  # token前綴
  token-prefix: Bearer
  # token 有效期(單位:秒) 默認(rèn)30天,-1 代表永久有效
  timeout: 2592000
  # token 最低活躍頻率(單位:秒),如果 token 超過此時間沒有訪問系統(tǒng)就會被凍結(jié),默認(rèn)-1 代表不限制,永不凍結(jié)
  active-timeout: -1
  # 是否允許同一賬號多地同時登錄 (為 true 時允許一起登錄, 為 false 時新登錄擠掉舊登錄)
  is-concurrent: true
  # 在多人登錄同一賬號時,是否共用一個 token (為 true 時所有登錄共用一個 token, 為 false 時每次登錄新建一個 token)
  is-share: true
  # token 風(fēng)格(默認(rèn)可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  token-style: random-32
  # 是否輸出操作日志
  is-log: true

微服務(wù),啟動!

運(yùn)行cleanjar.sh、copy.sh復(fù)制sql、jar包。

運(yùn)行sh deploy.sh base,啟動環(huán)境容器!

在IDEA服務(wù)中也可以看到環(huán)境容器啟動成功:

運(yùn)行sh deploy.sh services,啟動服務(wù)容器!

服務(wù)容器也啟動成功:

在nacos控制臺查看demo-gateway和demo-user服務(wù)是否注冊成功:

兩個應(yīng)用都注冊到nacos中了,來看下各個容器的ip:

從網(wǎng)關(guān)127.19.0.5訪問:試下注冊、登陸、積分查詢、退出接口都沒有問題。

注冊:

登陸:

查詢:

退出:

至此,docker compose部署微服務(wù)就完成了。

其實這個過程中還是會遇到各種奇奇怪怪的錯誤,可以用cursor幫忙理解整個報錯原因,一步步梳理,效率嘎嘎高!

參考資料:https://github.com/timeless157/timeless-order-pay-parent.git

到此這篇關(guān)于從入門到精通Docker Compose 輕松部署微服務(wù)實戰(zhàn)教程的文章就介紹到這了,更多相關(guān)docker compose部署微服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker容器添加新端口映射的方法與詳細(xì)步驟

    Docker容器添加新端口映射的方法與詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于Docker容器添加新端口映射的方法與詳細(xì)步驟,Docker 端口映射即映射容器內(nèi)應(yīng)用的服務(wù)端口到本機(jī)宿主機(jī)器,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 基于Docker版本squid搭建代理服務(wù)器的過程詳解

    基于Docker版本squid搭建代理服務(wù)器的過程詳解

    這篇文章主要介紹了基于Docker版本squid搭建代理服務(wù)器的配置方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下本文給大家介紹的非常詳細(xì)
    2024-03-03
  • 使用Docker構(gòu)建企業(yè)級自定義鏡像的方法

    使用Docker構(gòu)建企業(yè)級自定義鏡像的方法

    這篇文章主要介紹了使用Docker構(gòu)建企業(yè)級自定義鏡像的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 解決docker容器(java程序)內(nèi)存過大的問題

    解決docker容器(java程序)內(nèi)存過大的問題

    本文主要介紹了解決docker容器(java程序)內(nèi)存占用過大的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • docker安裝mysql、redis鏡像方式

    docker安裝mysql、redis鏡像方式

    這篇文章主要介紹了docker安裝mysql、redis鏡像方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Docker如何啟動一個Centos鏡像

    詳解Docker如何啟動一個Centos鏡像

    本篇文章主要介紹了詳解Docker如何啟動一個Centos鏡像,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 淺談docker的上下文和工作目錄

    淺談docker的上下文和工作目錄

    在編寫Dockerfile時我們總會接觸到COPY上下文和工作目錄,有時候這些位置搞不清楚,本文就來介紹一下docker的上下文和工作目錄,感興趣的可以了解一下
    2025-09-09
  • docker 可用鏡像服務(wù)地址的使用(親測可用)

    docker 可用鏡像服務(wù)地址的使用(親測可用)

    Docker可用的鏡像服務(wù)地址通常指的是Docker鏡像倉庫的地址,用于拉取和推送鏡像,本文就來介紹了docker 可用鏡像服務(wù)地址的使用,感興趣的可以了解一下
    2024-10-10
  • Gogs+Jenkins+Docker 自動化部署.NetCore的方法步驟

    Gogs+Jenkins+Docker 自動化部署.NetCore的方法步驟

    這篇文章主要介紹了Gogs+Jenkins+Docker 自動化部署.NetCore,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Docker磁盤空間清理的方法實現(xiàn)

    Docker磁盤空間清理的方法實現(xiàn)

    在使用Docker的過程中,系統(tǒng)會逐漸積累一些無用的垃圾文件,占據(jù)寶貴的磁盤空間并影響系統(tǒng)性,本文主要介紹了Docker磁盤空間清理的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

台北市| 隆林| 徐州市| 嘉善县| 海门市| 宿州市| 军事| 敦化市| 惠安县| 博罗县| 当涂县| 漳浦县| 汾阳市| 金湖县| 丰城市| 靖宇县| 阳春市| 台中市| 乐平市| 六枝特区| 德安县| 哈巴河县| 万年县| 双辽市| 华宁县| 梓潼县| 靖宇县| 新沂市| 沐川县| 武山县| 嵩明县| 本溪市| 大田县| 涡阳县| 海原县| 奈曼旗| 海伦市| 邯郸县| 琼结县| 临猗县| 青铜峡市|