Docker $ 專案部署 :Docker 部署 SpringBoot + Mysql
一.Dockerfile常用指令
目的
指定基礎映象
特點
需要寫在其他指令之前,之後的指令都依賴於該指令指定的映象。
語法
FROM <image>
FROM <image>:
FROM <image>@
例項
FROM java:8
目的
1.複製檔案
語法
ADD ["",…""]
ADD <src>…<dest>
從src複製檔案到容器的dest。src可以是Dockerfile所在目錄的相對路徑。
例項
ADD spring-boot-docker.jar app.jar
拷貝檔案並且重新命名
目的
1.載入本地目錄下的配置檔案到容器目標地址下
2.使容器中的一個目錄具有持久化儲存的功能,該目錄可被容器本身使用,也可共享其他容器。。
語法
VOLUME ["<路徑1>","<路徑2>"…]
VOLUME <路徑>
例項
VOLUME /tmp
VOLUME 指向了一個 /tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用 /tmp作為工作目錄。這個命令的效果是:在宿主機的 /var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的 /tmp目錄
目的
宣告埠
特點
宣告容器打算用什麼埠,不會自動在宿主進行埠對映。
執行時用隨機對映,會自動對映EXPOSE的埠。
-p <宿主埠>:<容器埠>,將容器對應埠服務公開給外界訪問。
語法
EXPOSE <埠1> [<埠2>…]
例項
EXPOSE 8080
目的
入口點,在指定容器啟動程式及引數
特點
場景一:讓映象變成像命令一樣使用。
場景二:應用執行前的準備工作。
可多次設定,但只有最後一個有效。
語法
ENTRYPOINT[“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2
例項
ENTRYPOINT [“java”,"-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
為了縮短 Tomcat 的啟動時間,新增 java.security.egd的系統屬性指向 /dev/urandom作為 ENTRYPOINT
二.部署SpringBoot+Mysql
1.準備部署專案
1.完整專案在筆者github:spring-boot-docker
2.將專案打包為.jar形式,上傳專案到linux伺服器任意資料夾
2.編寫Dockerfile
FROM java:8
VOLUME /tmp
ADD spring-boot-docker.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3.編譯映象
# docker build -t spring-boot-docker .
末尾的點代表檔案所在目錄執行,指上下文目錄
編譯好的映象如下:
4.安裝Mysql
建立資料卷用來儲存mysql的資料,可多個容器共享一個數據卷,當容器被刪除時,資料卷不會被刪除,mysql的資料依然存在。
# docker volume create mysql_data
執行mysql容器
# docker run -it --rm --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=roof -p 3306:3306 -d mysql
-v mysql_data:/var/lib/mysql
/var/lib/mysql是mysql容器資料儲存位置
-e MYSQL_ROOT_PASSWORD=t
設定mysql密碼
5.資料庫配置
1.進入mysql容器
# docker exec -it mysql bash
2.輸入使用者名稱密碼
mysql -u root -p
3.設定外部網路訪問mysql許可權
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'roof';
FLUSH PRIVILEGES;
4.建立資料庫,新增資料
create database springboot
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`user_id` varchar(20) NOT NULL,
`user_password` varchar(100) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES ('hly', '123');
6.啟動專案
docker run --name spring-boot-docker -d -p 8080:8080 --link mysql:mysql spring-boot-docker
--link :alias 新增連結到另一個容器;
name和id是源容器的name和id,alias是源容器在link下的別名。
三.初始化Mysql資料
為了方便部署,無需每次部署都需要執行mysql資料庫,然後再進行建立表,插入資料等一些列操作,我們可以製作一個mysql映象,初始化資料庫的資料。
1.準備工作
首先需要建立一個資料夾,新增四個檔案,如下。
- Dockerfile
FROM mysql:8
# 把資料庫初始化資料檔案複製到工作目錄
COPY springboot.sql /springboot.sql
COPY privileges.sql /privileges.sql
# 把要執行的shell檔案放到/docker-entrypoint-initdb.d/目錄下,容器會自動執行這個shell
COPY setup.sh /docker-entrypoint-initdb.d/setup.sh
# 給執行檔案增加可執行許可權
RUN chmod a+x /docker-entrypoint-initdb.d/setup.sh
- springboot.sql
create database springboot;
use springboot;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`user_id` varchar(20) NOT NULL,
`user_password` varchar(100) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES ('hly', '123');
- privileges.sql
use springboot;
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'roof';
FLUSH PRIVILEGES;
- setup.sh
製作sh檔案,執行sql指令碼。
#!/bin/bash
mysql -u root -p$MYSQL_ROOT_PASSWORD <<EOF
source springboot.sql;
source privileges.sql;
2.編譯映象
# docker build -t mysql .
3.執行容器
# docker run -it --rm --name mysql -e MYSQL_ROOT_PASSWORD=roof -p 3306:3306 -d
4.進入容器
# docker exec -it 1a6 bash
查看錶,發現已經建立
參考資料
https://blog.csdn.net/leonardc/article/details/79612612
https://www.jianshu.com/p/21d66ca6115e