Docker(Windows10版、mysql、redis、dynamodb、minio(S3)、rodolpheche)を試す

こんにちわ、猫好きリーマンのほげPGです。
今回はDockerでお手軽ローカル環境を紹介します。

1、Docker インストール

 ・Hyper-V

 まず、Hyper-Vを有効化します。

コントロールパネルを開いて

システムとセキュリティを選択

左メニューのプログラムを選択

Windowsの機能の有効化または無効化を選択

Hyper-VをチェックしてOKボタン押下

 

 ・Dockerダウンロード&インストール

ここ(https://hub.docker.com/?overlay=onboarding)から
Docker Desktop Installer.exe をダウンロードします。

ダウンロードしhたexeを実行し、インストールします。

 

 ・Docker設定

 タスクメニューでDocker Desktopを右クリックでメニューを開き、settingsを選択

 Storage設定でCドライブをチェックして置きます。

必要があれば、Proxy設定を行います。

 http://(ユーザ名):(パスワード)@(プロクシホスト):(プロクシポート)/

 

 ・AWSCLIダウンロード&インストール

  ここ(https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html)からWindows版をダウンロードします。

  ダウンロードしたmsiを実行し、インストールします。

 

2、docker 各種イメージ構築

以下の構成で作成します。

docker
│  docker-compose.yml
│  my.cnf
├─data
│  ├─dynamodb
│  ├─minio
│  ├─mysql
│  ├─redis
│  └─wiremock
└─init
    └─mysql
            create_tables.sql

docker-compose.yml

version: '3'
services:
  hoge-mysql:
    container_name: hoge-mysql
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./data/mysql:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
      - ./init/mysql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

  hoge-redis:
    container_name: hoge-redis
    image: redis
    ports:
      - 6379:6379
    volumes:
      - ./data/redis:/data

  hoge-dynamodb:
    container_name: hoge-dynamodb
    image: amazon/dynamodb-local
    command: -jar DynamoDBLocal.jar -dbPath /data
    volumes:
      - ./data/dynamodb:/data
    ports:
      - 8000:8000

  hoge-minio:
    container_name: hoge-minio
    image: minio/minio
    volumes:
      - ./data/minio:/data
    ports:
      - 9000:9000
    environment:
      MINIO_ACCESS_KEY: hoge
      MINIO_SECRET_KEY: hogehoge
    command: server /data --compat

  hoge-mockserver:
    container_name: hoge-mockserver
    image: rodolpheche/wiremock
    ports: 
      - 80:8080
    restart: always
    volumes:
      - ./data/wiremock:/home/wiremock
    command: [--record-mappings, --verbose]

my.cnf

[mysqld]
character-set-server=utf8
collation-server=utf8mb4_bin

[client]
default-character-set=utf8

create_tables.sql

DROP DATABASE IF EXISTS hogedb;
CREATE DATABASE hogedb CHARACTER SET utf8 COLLATE utf8_bin;
USE hogedb;

CREATE TABLE t_hoge
(
  id         INT(20) AUTO_INCREMENT,
  name       VARCHAR(20) NOT NULL,
  updated    DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO t_hoge (name, updated)
VALUES
('hoge-one',now()),
('hoge-two',now()),
('hoge-three',now());

dockerフォルダにて以下を実行

docker-compose up -d

 dockerのDashBoardから確認する

 

3、各イメージへのアクセス確認

3-1, mysql

・Spring boot プロジェクト内 application.yml

spring.datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/hogedb
    username: root
    password: root

・Spring boot プロジェクト内 HogeRepository.java

@Mapper
public interface HogeRepository {
    Map<String, Object> select(String id);
}

・Spring boot プロジェクト内  HogeRepository.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jp.co.ois.hoge.sample.HogeRepository">
    <select id="select" parameterType="string" resultType="hashmap">
        SELECT * FROM t_hoge WHERE id = #{id}
    </select>
</mapper>

・Spring boot プロジェクト内 呼出処理

@Autowired
HogeRepository hogeRepository;
void testMysql() {
    log.info("called.");
    Map<String, Object> data = hogeRepository.select("1");
    log.info("mysql: {}", data);
}

 

3-2, Redis

・データ投入

REDIS のCLIボタンを押下

立ち上がったコンソールで以下を実施

# redis-cli
127.0.0.1:6379> set hoge HOGE
OK
127.0.0.1:6379> get hoge
"HOGE"

・Spring boot プロジェクト内 application.yml

spring.redis:
    host: localhost
    port: 6379
    database: 0

・Spring boot プロジェクト内 設定処理

@Bean
public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

・Spring boot プロジェクト内 呼出処理

@Autowired
private StringRedisTemplate redisTemplate;
void testRedis() {
    log.info("called.");
    redisTemplate.opsForValue().set("ほげ", "あいうえお");
    String value = redisTemplate.opsForValue().get("hoge");
    log.info("redis: {}", value);
}

 

3-3, minio(S3)

・データ投入

コマンドプロンプトより以下を実行

>aws --endpoint-url http://127.0.0.1:9000 s3 mb s3://hoge-s3
make_bucket: hoge-s3

>echo HOGE > hoge.txt

>aws --endpoint-url http://127.0.0.1:9000 s3 cp hoge.txt s3://hoge-s3/hoge
upload: .\hoge.txt to s3://hoge-s3/hoge

>aws --endpoint-url http://127.0.0.1:9000 s3 cp s3://hoge-s3/hoge -
HOGE

・Spring boot プロジェクト内 設定処理

@Bean
public S3Client s3Client() {
    return S3Client.builder()
            .endpointOverride(URI.create("http://localhost:9000"))
            .build();
}

・Spring boot プロジェクト内 呼出処理

@Autowired
S3Client s3Client;
void testS3() {
    log.info("called.");
    ResponseInputStream<GetObjectResponse> res = s3Client.getObject(
            GetObjectRequest.builder().bucket("hoge-s3").key("hoge").build());
    BufferedReader reader = new BufferedReader(new InputStreamReader(res));
    reader.lines().forEach(s -> {
        log.info("s3: {}", s);
    });
}

 

3-4, dynamoDB

・Configとcredentials作成

コマンドプロンプトより以下を実行

>aws configure
AWS Access Key ID [None]: hoge
AWS Secret Access Key [None]: hogehoge
Default region name [None]: local
Default output format [None]: json

・データ投入

コマンドプロンプトより以下を実行

>aws --endpoint-url http://localhost:8000 dynamodb create-table --table-name hoge-dynamo --attribute-definitions AttributeName=hoge_id,AttributeType=S --key-schema AttributeName=hoge_id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "hoge_id",
                "AttributeType": "S"
            }
        ],
        "TableName": "hoge-dynamo",
        "KeySchema": [
            {
                "AttributeName": "hoge_id",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2020-03-31T17:23:00.802000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/hoge-dynamo"
    }
}


>aws --endpoint-url http://localhost:8000 dynamodb put-item --table-name hoge-dynamo --item "{ ""hoge_id"": { ""S"": ""0001"" }, ""hoge_value"": { ""S"": ""hoge"" } }"


>aws --endpoint-url http://localhost:8000 dynamodb scan --table-name hoge-dynamo
{
    "Items": [
        {
            "hoge_id": {
                "S": "0001"
            },
            "hoge_value": {
                "S": "hoge"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

・Spring boot プロジェクト内 設定処理

@Bean
public DynamoDbClient dynamoDbClient() {
    return DynamoDbClient.builder()
            .endpointOverride(URI.create("http://localhost:8000"))
            .build();
}

・Spring boot プロジェクト内 呼出処理

@Autowired
DynamoDbClient dynamoDbClient;
void testDynamoDb() {
    log.info("called.");
    Map<String,AttributeValue> keyMap = new HashMap<>();
    keyMap.put("hoge_id", AttributeValue.builder().s("0001").build());
    GetItemResponse res = dynamoDbClient.getItem(
            GetItemRequest.builder().tableName("hoge-dynamo").key(keyMap).build());
    log.info("item: {}", res.item());
}

 

3-5, rodolpheche

・シナリオ作成

以下の構成でシナリオファイルを配置

docker
└─data
  └─wiremock
         ├─__files
         │   └─hoge-res.json …配置ファイル
         └─mappings
                 └─hoge.json …配置ファイル

hoge.json

{
  "request": {
    "method": "POST",
    "url": "/hoge/api",
    "headers": {
      "Content-Type": {
          "matches": "application/json"
      }
    },
    "bodyPatterns" : [
      {
        "matches" : "(.*)hoge(.*)"
      }
    ]
  },
  "response": {
    "status": 200,
    "bodyFileName": "hoge-res.json",
    "headers": {
      "Content-Type": "application/json"
    }
  }
}

hoge-res.json

{
    "result": "HOGE"
}

・Spring boot プロジェクト内 設定処理

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

・Spring boot プロジェクト内 呼出処理

@Autowired
RestTemplate restTemplate;
@Data
@AllArgsConstructor
static class HogeParam {
    String value;
}
void testWeb() {
    log.info("called.");
    String url = "http://localhost/hoge/api";
    HogeParam param = new HogeParam("hoge");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<HogeParam> request = new HttpEntity<>(param, headers);
    log.info("request: {}", request);
    ResponseEntity<String> res = restTemplate.postForEntity(url, request, String.class);
    log.info("res: {}", res);
}

・実行結果

17:41:16.875 [main] INFO jp.co.ois.hoge.sample.HogeApp - start ()
17:41:18.859 main INFO  (StartupInfoLogger.java:55) logStarting - Starting HogeApp on NDYWM7A3420152 with PID 11692 (C:\work\masuda\myrepo\HogeDockerSample\target\classes started by horqu in C:\work\masuda\myrepo\HogeDockerSample)
17:41:18.864 main INFO  (SpringApplication.java:651) logStartupProfileInfo - No active profile set, falling back to default profiles: default
17:41:20.738 main INFO  (RepositoryConfigurationDelegate.java:249) multipleStoresDetected - Multiple Spring Data modules found, entering strict repository configuration mode!
17:41:20.745 main INFO  (RepositoryConfigurationDelegate.java:127) registerRepositoriesIn - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
17:41:20.835 main INFO  (RepositoryConfigurationDelegate.java:187) registerRepositoriesIn - Finished Spring Data repository scanning in 51ms. Found 0 Redis repository interfaces.
17:41:22.351 main INFO  (TomcatWebServer.java:92) initialize - Tomcat initialized with port(s): 8080 (http)
17:41:22.374 main INFO  (DirectJDKLog.java:173) log - Starting service [Tomcat]
17:41:22.375 main INFO  (DirectJDKLog.java:173) log - Starting Servlet engine: [Apache Tomcat/9.0.33]
17:41:23.483 main INFO  (DirectJDKLog.java:173) log - Initializing Spring embedded WebApplicationContext
17:41:23.483 main INFO  (ServletWebServerApplicationContext.java:284) prepareWebApplicationContext - Root WebApplicationContext: initialization completed in 4491 ms
17:41:28.325 main INFO  (ExecutorConfigurationSupport.java:181) initialize - Initializing ExecutorService 'applicationTaskExecutor'
17:41:28.978 main INFO  (TomcatWebServer.java:204) start - Tomcat started on port(s): 8080 (http) with context path ''
17:41:28.985 main INFO  (StartupInfoLogger.java:61) logStarted - Started HogeApp in 11.755 seconds (JVM running for 16.733)
17:41:28.987 main INFO  (HogeRunner.java:45) run - start...[]
17:41:28.987 main INFO  (HogeRunner.java:59) testMysql - called.
17:41:29.041 main INFO  (HikariDataSource.java:110) getConnection - HikariPool-1 - Starting...
17:41:29.725 main INFO  (HikariDataSource.java:123) getConnection - HikariPool-1 - Start completed.
17:41:29.853 main INFO  (HogeRunner.java:61) testMysql - mysql: {name=hoge-one, id=1, updated=2020-02-27 17:39:48.0}
17:41:29.853 main INFO  (HogeRunner.java:68) testRedis - called.
17:41:30.238 main INFO  (EpollProvider.java:68) <clinit> - Starting without optional epoll library
17:41:30.245 main INFO  (KqueueProvider.java:70) <clinit> - Starting without optional kqueue library
17:41:32.367 main INFO  (HogeRunner.java:71) testRedis - redis: HOGE
17:41:32.368 main INFO  (HogeRunner.java:78) testS3 - called.
17:41:32.919 main INFO  (HogeRunner.java:83) lambda$0 - s3: HOGE 
17:41:32.919 main INFO  (HogeRunner.java:91) testDynamoDb - called.
17:41:33.311 main INFO  (HogeRunner.java:96) testDynamoDb - item: {hoge_id=AttributeValue(S=0001, SS=[], NS=[], BS=[], M={}, L=[]), hoge_value=AttributeValue(S=hoge, SS=[], NS=[], BS=[], M={}, L=[])}
17:41:33.312 main INFO  (HogeRunner.java:109) testWeb - called.
17:41:33.330 main INFO  (HogeRunner.java:115) testWeb - request: <HogeRunner.HogeParam(value=hoge),[Content-Type:"application/json"]>
17:41:33.665 main INFO  (HogeRunner.java:117) testWeb - res: <200,{
    "result": "HOGE"
},[Content-Type:"application/json", Matched-Stub-Id:"6a91cba7-1703-4e75-ba96-4d66db273cb7", Vary:"Accept-Encoding, User-Agent", Transfer-Encoding:"chunked", Server:"Jetty(9.4.20.v20190813)"]>
17:41:33.666 main INFO  (HogeRunner.java:52) run - end...
17:41:33.670 main INFO  (ExecutorConfigurationSupport.java:218) shutdown - Shutting down ExecutorService 'applicationTaskExecutor'
17:41:33.827 main INFO  (HikariDataSource.java:350) close - HikariPool-1 - Shutdown initiated...
17:41:33.847 main INFO  (HikariDataSource.java:352) close - HikariPool-1 - Shutdown completed.
17:41:34.615 main INFO  (HogeApp.java:19) main - exit 0

 

Dockerフォルダ構成

docker.zip

SpringBootプロジェクト一式

HogeDockerSample.zip

 

今回はここまで。

\ 最新情報をチェック /