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フォルダ構成
SpringBootプロジェクト一式
今回はここまで。
