# Docker 起服務用的mysql server
> 這樣寫法的 mysql server 不是任意服務都可以連上!
> 這個docker-compose是以bridge network,所以只有在同一張docker-compose上的服務才能順利連接到mysql-server.
用文件來管理,可以避免每次要起服務都得下command,而文件管理也很簡單,共兩個文件
* Dockerfile
* 定義服務的版本和環境
* docker-compose.yml
* 將要run的服務羅列,docker-compose可以一次定義多個要起的服務。user可以指定起docker-compose內某一個/某幾個/甚至全部的服務。
以下有兩種mysql的dockerfile,可以依照電腦作業系統選擇,而這兩者的差異只有platform,其他都一樣
### dockerfile
##### MAC arm64
```shell=
FROM mysql:oracle as builder
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]
# needed for intialization
ENV MYSQL_ROOT_PASSWORD=1234
COPY setup.sql /docker-entrypoint-initdb.d/
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]
FROM mysql:oracle
COPY --from=builder /initialized-db /var/lib/mysql
```
##### windows
```shell=
FROM mysql:8.0 as builder
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]
# needed for intialization
ENV MYSQL_ROOT_PASSWORD=1234
COPY setup.sql /docker-entrypoint-initdb.d/
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]
FROM mysql:8.0
COPY --from=builder /initialized-db /var/lib/mysql
```
### docker-compose.yml
```yaml=
version: "3.5"
services:
db-mysql :
# mac arm64才要加platform,windows可以省略
platform: linux/arm64/v8
# 如果希望mysql建起來後,就有schema可以定義build
build : manifests/setdb
ports :
- 3317:3306
environment :
MYSQL_PASSWORD : "1234"
networks :
usms_docker_network :
ipv4_address : 172.30.0.2
container_name : vincent_db
service-vincent:
build:
context: ./
dockerfile: Dockerfile
ports :
- "8092:8080"
- "5092:5092"
networks :
usms_docker_network :
ipv4_address : 172.30.0.3
environment:
JAVA_OPTS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5092
container_name: vincent_service
networks:
usms_docker_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.30.0.0/16
gateway: 172.30.0.1
```
在 manifests/setdb 下放了setup.sql,內容只有建立schema。
```
CREATE SCHEMA IF NOT EXISTS `aprd_usms` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
```
整個文件結構

1. cd 資料夾
2. 若要指定起某個服務,可以在up -d 後面接服務名稱,也就是docker-compose上面定義的名稱
```
docker-compose up -d [service name]
```

3. 確認container正常啟動
docker gui可以看到container是否正常

或是以下terminal command 可以看到container的啟動狀態.
```
// 正常啟動的container list
docker ps
//所有container list 包含正常、不正常
docker ps -a
```

4. mysql workbench 連線
database hostname 是 127.0.0.1,

5. 若是docker-compose裡的network以bridge溝通,其他服務想連線mysql,則必須用指定的url如下
```yaml=
# springboot application yaml file
spring :
datasource :
url : jdbc:mysql://host.docker.internal:3317/aprd_usms?useUnicode=true&connectionCollation=utf8mb4_unicode_ci&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
username : root
password : 1234
driver-class-name : com.mysql.cj.jdbc.Driver
```