# 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 ; ``` 整個文件結構 ![](https://i.imgur.com/ah0nYUZ.png) 1. cd 資料夾 2. 若要指定起某個服務,可以在up -d 後面接服務名稱,也就是docker-compose上面定義的名稱 ``` docker-compose up -d [service name] ``` ![](https://i.imgur.com/GUFDrRn.png) 3. 確認container正常啟動 docker gui可以看到container是否正常 ![](https://i.imgur.com/lm4rIM1.png) 或是以下terminal command 可以看到container的啟動狀態. ``` // 正常啟動的container list docker ps //所有container list 包含正常、不正常 docker ps -a ``` ![](https://i.imgur.com/QECB9wy.png) 4. mysql workbench 連線 database hostname 是 127.0.0.1, ![](https://i.imgur.com/XHNfP8n.png) 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 ```