WSLサブシステムはdockerを介してredisをインストールし、ホストのspringbootプログラムがdockerのredis接続障害にアクセスするという問題を解決します。

WSLサブシステムはdockerを介してredisをインストールし、ホストのspringbootプログラムがdockerのredis接続障害にアクセスするという問題を解決します。

環境の説明

win10 2004

WSL2 + ubuntu20.04、清華ソースが設定されました+ブート後のセルフスタート+ファイアウォールがオフになりました

docker:19.03.12、AlibabaCloudイメージアクセラレーションを設定+ WSLサブシステムの起動時に自動的に開始

繰り返し:5.0.7

画像ファイルをダウンロードする

docker pull redis:5.0.7

マウントディレクトリを作成します

コンテナー外でのredisスタートアップ構成ファイルの調整を容易にし、コンテナー外でのデータの永続性をサポートするために、redis構成とデータのマウントディレクトリを作成します。

mkdir -p /usr/data/redis/conf
mkdir -p /usr/data/redis/data
cd /usr/data/redis/conf
vi redis.conf
#wq保存退出
#添加权限,可选操作,为防止因为权限问题报错可以加一下
chmod 777 redis.conf

redis.conf構成を変更する

まず、公式Webサイトにアクセスして、最新の構成であるポータルをダウンロードします。

次に、ローカルでコピーを作成し、コピー内のいくつかの構成を変更します

  • バインド127.0.0.1、この部分をコメントアウトします。これは、redisがローカルでのみアクセスできるように制限するためです。
  • プロテクトモード、デフォルトは「はい」、プロテクトモードはオン、ローカルアクセスに制限、「いいえ」に変更する必要があります
  • appendonly、redisの永続性、ローカルファイルへのredisデータの永続性をサポートするためにyesに設定
  • requirepass、redisパスワードの接続、パスワードの設定
  • デーモン化、デフォルトはいいえ、変更する必要はありません。デーモンプロセスとして開始するためにいくつかのチュートリアルに従ってはいに変更すると、構成ファイルがredisの開始に失敗します。
  • コンテナ内のredis起動ポートであるportは、変更することも変更することもできません。後で使用します。最初にリストを示します。

変更された構成は次のとおりです。

#bind 127.0.0.1
port 6379
protected-mode no
daemonize no
appendonly yes
requirepass 123456

redisコンテナを実行する

docker run -p 6379:6379 \
	-d -v /usr/data/redis/conf/redis.conf:/etc/redis/redis.conf \
	-v /usr/data/redis/data:/data \
	--restart unless-stopped \
	--name redis redis:5.0.7 redis-server /etc/redis/redis.conf 

コマンドの説明:

-p 6379:6379 #宿主机与docker容器端口映射
-d #后台启动
-v /usr/data/redis/conf/redis.conf:/etc/redis/redis.conf #指定启动配置文件挂载
-v /usr/data/redis/data:/data #指定持久化数据挂载目录
--restart unless-stopped #指定redis容器重启策略,开启docker,就会自动启动redis容器,除非你自己stop容器
--name redis #指定容器名称
redis:5.0.7 redis-server /etc/redis/redis.conf #指定使用的镜像,指定启动redis-server,指定启动redis-server的配置文件
#-----
#通过docker ps,可以看到redis是否启动成功
#上面有专门修改redis.conf配置文件,所以用Redis Desktop Manager客户端可以直接连接redis

ホストspringbootはdockerコンテナredisを統合します

redisとクライアントツールの接続は非常にスムーズですが、springboot統合redisを言うのは簡単ではありません。Windowsバージョンのredisは、springbootプログラムに問題がないことを確認するために途中にインストールされました。その結果、springbootプログラムはWindowsバージョンのredisを一度統合しますが、すべてがdockerコンテナーにインストールされたredisに送られる限りです。 WSLサブシステムでは、接続が失敗します。

まず、springboot統合redisについて説明しましょう。

1つ目はpom.xmlです

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

springboot2.Xはレタス接続プールを使用してredisに接続するため、commons-pool2を導入する必要があることに注意してください。

application.yml

spring:
  redis:
    host: localhost
    port: 56379
    timeout: 10000
    password: 123456
    testOnBorrow: true
    testWhileIdle: true
    database: 0
    lettuce:
      pool:
        min-idle: 1
        max-idle: 5
        max-active: 10
        max-wait: -1

ここで、springboot2.X、redis接続プール構成にはレタスの追加レイヤーがあることに注意してください。さらに、タイムアウトをここで構成された0、10として構成することはできません。

RedisUtilツールクラス

@Component
public class RedisUtil {
    
    
	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	public void setString(String key, String data) {
    
    
		stringRedisTemplate.opsForValue().set(key, data);
	}
}

RedisControllerクラス

@RestController
@RequestMapping("/redis")
public class RedisController {
    
    
    @Autowired
    private RedisUtil redisUtil;

    Random random = new Random();

    @RequestMapping("/add")
    public String fun(){
    
    
        String key="redisDemo:testKey:";
        int i = random.nextInt(100);
        redisUtil.setString(key+i,i+"");

        return "ok";
    }
}

ブラウザを開いてhttp:// localhost:8080 / redis / addにアクセスすると、接続失敗の例外が報告され続けます。localhost:6379でRedisに接続できませんでした:接続が拒否されました。

最初に考慮したのは、redisサービスに問題があったことですが、Redis Desktop Managerクライアントを使用して直接アクセスすることに問題はなく、さまざまなパラメーターを調整しようとしましたが、機能しませんでした。

後で、springboot統合redisに問題があるかどうかを疑った。このマシンにWindowsバージョンのRedisをインストールした直後、RedisアドレスをネイティブのWindowsバージョンのRedisに切り替えた後、データをすぐに正常に追加できます。

最後に、たくさんの情報をチェックした後、問題はようやく解決されました。

ホストのspringboot統合DockerコンテナのRedis接続が失敗する問題を解決します

実際、dockerrunコマンドを変更しました。

docker run --net host \
	-d -v /usr/data/redis/conf/redis.conf:/etc/redis/redis.conf \
	-v /usr/data/redis/data:/data \
	--restart unless-stopped \
	--name redis redis:5.0.7 redis-server /etc/redis/redis.conf 

コンテナとホストがネットワークを共有することを指定する-nethostコマンドが追加されました。

コンテナとホストはネットワークを共有しているため、ポートマッピングを行う必要はありません。どのポートをredisサービスのポートとして使用する場合は、redis.confファイルを変更できます。

おすすめ

転載: blog.csdn.net/l229568441/article/details/113816184