---
# System prepended metadata

title: Untitled

---

讓Spring跑在Docker容器中吧
===

**本教學預設你已經成功安裝SendHoLi所需的套件並成功運行他**

[sendHoLi][1]

[1]: https://github.com/loserrain/sendHoLi/tree/main


##    1.打開CMD移動到你的專案資料夾 
![](https://hackmd.io/_uploads/HyTeUelMp.png)
___





## 2.在專案資料夾用**mvn package**指令打包成jar檔

![](https://hackmd.io/_uploads/BJNg5glfT.png)
___

## 3.尋找打包後的jar檔並進行測試

檔案位子在專案資料夾的target底下
![](https://hackmd.io/_uploads/SyBUoexza.png)

用以下指令測試是否運行成功
spring-boot-upload-files-0.0.1-SNAPSHOT.jar為target底下的jar檔名


```cmd
java -jar target/spring-boot-upload-files-0.0.1-SNAPSHOT.jar
```

![](https://hackmd.io/_uploads/rkyppggz6.png)


之後進入http://127.0.0.1:8080/ 應該可以看到頁面
___

## 4.建立Dockfile

在Docker的世界裡，有Dockerfile就可以對應一個可以執行的環境(Image)，而Dockerfile就是建置Docker Image的腳本...

首先在main底下創一個docker資料夾
並創建Dockerfile以及把jar檔複製進去

![](https://hackmd.io/_uploads/H1xmQZgGT.png)


### Dockerfile

```dockerfile
FROM openjdk:17-jdk-alpine
VOLUME /tmp
COPY spring-boot-upload-files-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
```
___

## 5.Bulid Docker Image 


cd到docker資料夾底下，並運行底下指令

```
docker build -t myorg/myapp .
```

![](https://hackmd.io/_uploads/SJkUIWgMa.png)

這條Docker命令的意義如下：

docker build: 這是用於建立Docker映像檔的命令。

-t myorg/myapp: 這部分指定了建立的映像檔的名稱和標籤。在這個例子中，映像檔的名稱是myorg/myapp。myorg是組織或使用者的名稱，myapp是應用程式的名稱。這樣的命名方式符合Docker映像檔的命名慣例，能夠清晰地識別映像檔的用途和擁有者。

.: 這部分表示Docker應該在當前目錄（通常是Dockerfile所在的目錄）中尋找Dockerfile檔案。Dockerfile包含了建立映像檔所需的指令和配置。

總結來說，這條命令告訴Docker根據當前目錄中的Dockerfile來建立一個映像檔，並且給這個映像檔設定名稱和標籤為myorg/myapp。

___

##    6.Run Docker Image

 
 請修改以下指令的IP後運行他(改成127.0.0.1也行)
 ```bash
 docker run -p 140.130.33.150:80:8080 myorg/myapp
 ```
 ![](https://hackmd.io/_uploads/rk7euWeGa.png)

 這條Docker命令的意義如下：

docker run: 這是用於運行Docker容器的命令。

-p 140.130.33.150:80:8080: 這部分指定了容器的端口映射。意思是將主機的140.130.33.150 IP位址的80端口映射到容器內的8080端口。這樣，當主機的80端口被訪問時，流量將被轉發到運行在容器內的應用程式，並且由容器內的8080端口接收。

myorg/myapp: 這部分指定了運行的Docker映像檔。在這個例子中，使用的是myorg/myapp這個映像檔。

總結來說，這條命令告訴Docker運行一個名為myorg/myapp的映像檔，並且將主機的80端口映射到運行在容器內的8080端口。這樣，外部訪問主機的80端口時，將被轉發到容器內的應用程式。

##  7.測試

以下指令為測試網站是否能正常上傳檔案
但要注意上傳測試檔的路徑以及網站的網址是否正確
```
curl -X POST -F "file=@C:\Users\felix\Downloads\01010201.pdf" http://140.130.33.150/uploa
```


這條`curl`命令的意義如下：

- `curl`: 是一個命令行工具，用於向目標URL發送HTTP請求，並且可以用來顯示和下載網頁數據。

- `-X POST`: 這部分指定了HTTP請求的方法為POST，表示要向目標URL發送一個POST請求。

- `-F "file=@C:\Users\felix\Downloads\01010201.pdf"`: 這部分使用了`-F`選項，指定要上傳的文件。`file=@C:\Users\felix\Downloads\01010201.pdf` 表示要上傳的文件是位於 `C:\Users\felix\Downloads\` 目錄下，名稱為 `01010201.pdf` 的文件。`@` 符號表示要上傳一個文件。

- `http://140.130.33.150/upload`: 這是目標URL，表示POST請求將被發送到 `http://140.130.33.150/upload` 這個網址。

總結來說，這條`curl`命令的作用是向 `http://140.130.33.150/upload` 發送一個POST請求，同時上傳了一個名為 `01010201.pdf` 的文件，該文件位於 `C:\Users\felix\Downloads\` 目錄下。


