1. 程式人生 > >Docker $ 專案部署 :Docker 部署 SpringBoot + Mysql

Docker $ 專案部署 :Docker 部署 SpringBoot + Mysql

一.Dockerfile常用指令

  • FROM

目的

指定基礎映象

特點

需要寫在其他指令之前,之後的指令都依賴於該指令指定的映象。

語法

FROM <image>
FROM <image>:
FROM <image>@

例項

FROM java:8

  • ADD

目的

1.複製檔案

語法

ADD ["",…""]
ADD <src>…<dest>
從src複製檔案到容器的dest。src可以是Dockerfile所在目錄的相對路徑。

例項

ADD spring-boot-docker.jar app.jar
拷貝檔案並且重新命名

  • VOLUME

目的

1.載入本地目錄下的配置檔案到容器目標地址下
2.使容器中的一個目錄具有持久化儲存的功能,該目錄可被容器本身使用,也可共享其他容器。。

語法

VOLUME ["<路徑1>","<路徑2>"…]
VOLUME <路徑>

例項

VOLUME /tmp
VOLUME 指向了一個 /tmp的目錄,由於 Spring Boot 使用內建的Tomcat容器,Tomcat 預設使用 /tmp作為工作目錄。這個命令的效果是:在宿主機的 /var/lib/docker目錄下建立一個臨時檔案並把它連結到容器中的 /tmp目錄

  • EXPOSE

目的

宣告埠

特點

宣告容器打算用什麼埠,不會自動在宿主進行埠對映。
執行時用隨機對映,會自動對映EXPOSE的埠。
-p <宿主埠>:<容器埠>,將容器對應埠服務公開給外界訪問。

語法

EXPOSE <埠1> [<埠2>…]

例項

EXPOSE 8080

  • ENTRYPOINT

目的

入口點,在指定容器啟動程式及引數

特點

場景一:讓映象變成像命令一樣使用。
場景二:應用執行前的準備工作。
可多次設定,但只有最後一個有效。

語法

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