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プロジェクト一式
今回はここまで。