2021年3月30日 星期二

Docker 練習 - 安裝 Tomcat - 設定 virtualBox 的 Port Forwarding

此例使用 Windows 10 + virtualBox + Ubuntu 64bits

# 安裝想要的版本的 tomcat
docker pull tomcat:9.0-jdk11-openjdk

# 啟動 container
docker run -d -p 8080:8080 --name myTomcat tomcat:9.0-jdk11-openjdk

# 因為某些原因 (目前還不清楚),tomcat 的預設歡迎頁面被放到 /usr/local/tomcat/webapps.dist 下而不是 /usr/local/tomcat/webapps 下,
# 所以想要看觀迎頁面可以自己手動把頁面放到 /usr/local/tomcat/webapps 下

# 進入 container 終端 (terminal)
docker exec -it myTomcat bash

# 把觀迎頁面放到 /usr/local/tomcat/webapps 下
cp -r ./webapps.dist/* ./webapps/

# 離開終端
exit

# 在宿主機 (host) 測試是否能得到歡迎頁面的訊息 (應該會是非 404 的頁面)
curl http://localhost:8080


# 如果在 Windows 中想要看到 virtualBox 中的 Linux 的 container 中的歡迎頁面,
# 須要設定 Port Forwarding。
# 我們先要查出"主體 IP" (virtualBox 在 Windows 上使用的網路介面卡上的 IP) 和 "客體 IP" (virtualBox 內部的 Linux 所使用的 內部 IP),然後將它們對應起來。

# 先在 Windows 中使用 ipconfig 指令查出 IP,即"主體 IP",如下圖紅框處


# 再到 virtualBox 中的 Linux 使用 ip address 指今 (hostname -I 也可以)查出"客體 IP",如下圖紅框處

得到"主體 IP"和"客體 IP"後,到 virtualBox 中,
開啟 "設定" --> "網路" --> "附加到" 選 "NAT",按下"連接埠轉送",開始進行設定。
填上剛剛查得的"主體 IP"和"客體 IP"即各自想要對應的 port,"協定" 選擇自己想要的協定,
例如只是要在瀏覽器看到畫面的話,選 TCP 即可,"名稱" 可自訂。

這樣 virtualBox 的 Port Forwarding 就設定好了,可以開始來測試觀迎畫面。
在 Windows 中打開瀏覽器,網址輸入
http://{"主體 IP"}:{port}
例如此例為:
http://192.168.56.1:8080
就可以看到 Tomcat 的歡迎畫面了,如下圖:


參考資料:

Linux - Docker 和 docker-compose 的好用指令記錄

使用 Linux Ubuntu 為例子。

# 安裝 docker 
apt-get install docker.io 
--------------------------------------------------------------

Docker 好用指令 :

# 觀看 Docker 啟動狀態
service docker status

# 啟動 Docker
start docker

# 關閉 Docker
stop docker

# 重啟 Docker
restart docker

----------------------- Image 相關 --------------------
#搜尋 image (映像檔)
docker search {關鍵字}
Ex: docker search ubuntu

# 例出所有 image
docker images

# 下載 XXX image (如要下載最新版,version (在 docker 中又稱 tag) 可省略)
docker pull {image 名}:{version}
Ex: docker pull tomcat:9.0

# 刪除 Image
docker rmi {某個 images}

----------------------- Volume 相關 --------------------
# 建立一個具名 Volume (不給名字會自動幫你建一個亂數名字的 Volume)
docker volume create {自己取的 Volume 名字}

# 列出所有**具名**的 Volume 的資訊,非具名的 Volume 不會在這顯示
(例如在 run container 時直接用 -v {宿主機路徑}:{container 路徑} 指定的 Volume)
docker volume list

# 列出特定 Volume 的詳細資訊
docker volume inspect {Volume 名字}

# 移除 Volume
docker volume rm {Volume 名字}

----------------------- Container 相關 --------------------
# ps [-a] :(process stauts ??) 例出所有運行中的 container (容器),如果要列出全部 (包含非運行的)的 container,可以加上 -a
docker ps
docker ps -a

# rm :(remove) 刪除某 container
docker rm {某 container 的 id 或 name}

# 查看某個 container 的 log
docker logs XXX

# 開啟一個或多個已停止的 container
docker start {container} {container} ......

# 停止關閉某個 container
docker stop XXX

# 重啟某個 container (等同 docker stop + docker start)
docker restart XXX

# cp : 從宿主機複制檔案或資料夾到 container,或從 container 複制檔案或資料夾到 宿主機,container 的路徑前面要加 container 名,並用冒號 (:) 分隔
docker cp {來源路徑} {目標路徑}
Ex: docker cp /home/xxx xxContainer:/user/...

# exec : 在已運行的 container 上執行命令
docker exec {參數} {某個container} {命令}
Ex: docker exec -it mysql bash

#其他可選參數:
# -w : work directory,可設定一開始所在的 container 內部 path
docker exec -w {container 中的路徑} {某個 contenr} {命令}
Ex: docker exec -i -w /some/path/inside/container tomcat pwd
像述指令也可用 bash -c "cd ... && ..." 如以下方法達成:
docker exec -i tomcat bash -c "cd /some/path/inside/container && pwd"

----------------------- 運行 Container 相關 --------------------
# 以 image 建立 container
docker create {image}

# 以 XXX images 運行 container
docker run XXX

# docker run 的各種參數 :

# --name :為要運行的 container 取名
docker run --name {自己取的名字} {某個 image}

# -p : (expose 的縮寫),暴露 container 的 port 並對應到指定的宿主機的 port,
docker run -p {宿主機的port}:{container 的 port} XXX
Ex: docker run -p 8081:8080 tomcat

# -i -t 或 --interactive --tty 或 -it :(stdin和 pueudo-tty 功能的組合) 運行 container 並進入 command line 互動介面
-t:attach時Container的螢幕會接到原來的螢幕上。
-i:attach時鍵盤輸入會被Container接手
docker run -i -t XXX
#或
docker run -it XXX

#離開互動介面
exit

# -d :Detached 的縮寫,以分離模式運行 container,進行背景常駐執行,即不進入 Container 的 命令提示界面,例如像 Daemon 這種常駐程式
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

# -v 或 --volume :分享資料夾,可掛載宿主機 (指運行 Docker 的 Linux) 的某資料夾路徑到 container 的某資料夾路徑,用於持久化檔案,避免檔案因 container 關閉而消失,有幾種寫法

# (掛載特定宿主機資料夾路徑 或 某具名 Volume) 到 container 資料夾路徑
docker -v {宿主機資料夾路徑 或 某具名 Volume}:{container 資料夾路徑}
Ex: docker -v /home/tomcat:/usr/local/tomcat/webapps

--rm : (clean up),可在 container exit 後自動刪除 container 
docker run -it --rm -p 8888:8080 tomcat:9.0

----------------------- Image 的輸出與導入 save/load 和 Container 的輸出與導入 export/import 相關 --------------------

#輸出 Docker Image 成檔案
docker save --output {要輸出的 Docker Image 檔案位置} {imageName:tag}
範例:
docker save --output /usr/local/my-images/postgres-16-image.tar postgres:16

#將 Dcoker Image tar 檔導入成 Docker Image
docker load --input {被輸出的 Docker Image 檔案位置}
範例:
docker load --input /usr/local/my-images/postgres-16-image.tar

#輸出 Docker Container 成檔案
docker export --output="{要輸出的 Docker Container 檔案位置}" {Container Name}
範例:
docker export --output="latest.tar" some_container
#將 Dcoker Container 檔導入成 Docker Container,可以重新指定 Container name, tag
docker import {被輸出的 Docker Container 檔案位置}
範例:
docker import /path/to/exampleimage.tgz
cat exampleimage.tgz | docker import - exampleimagelocal:new

參考:

----------------------------------------------
在 Container 中,可用
host.docker.internal
做為 domain  來連至本地端,
此法僅適於 Docker Desktop for Windows,並且通常為開發測試時使用

好用連結:

---------------------- docker-compose 好用指令 ---------------------------------------------------------------
#docker-compose 的指令在 Linux 上的指令是 docker compose。

#docker-compose 可以用 --project-directory 設定要啟動 docker compose project 的資料夾位置,這樣就不用一定要先用 cd 指令移到 docker compose project 位置。

#docker-compose 可以用 -f 設定要啟動 docker compose project 要用的 docker-compose.yml 設定檔位置,這樣就不用一定要先用 cd 指令移到 docker compose project 位置,docker-compose.yml 也不一定要放在 docker compose project 的資料夾內。


範例:
docker-compose --project-directory ./xxx/xxx/xxx -f  ./yyy/yyy/yyy/docker-compose.yml up -d --build

# 依據 docker-compose.yml 的設定 重新 build image 並 start service (如果已經 start 就重新 start) 某個 service
docker-compose up --build -d --no-deps <service 名稱>


參考:

2021年3月29日 星期一

Linux - virtual box share folder 的設定

 在 Windows 中,使用 virtual box 安裝好 Ubuntu 64 server 後,

如果想方便的分享 Windows 的資料夾給 Virtual box 開啟的 VM 使用,

可以使用 VirtualBox 的 "共用資料夾" 功能。

下面示範步驟

--------------------------------------------------------------------------

安裝 VirtualBox Guest Additions :

在 Virutalbox 開啟的 VM 視窗上選擇 "裝置" --> "插入 Guest Additions CD 像"


在 VM 命令列視窗中找指令

建立資料夾 (資料夾可自訂) : mkdir -p /mnt/cdrom

掛載光碟機上去 : mount /dev/cdrom /mnt/cdrom

進入光碟機:cd /mnt/cdrom

安裝 VirtualBox Guest Additions: sh ./VBoxLinuxAdditions.run --nox11

--------------------------------------------------------------------------

接著先把 VM 關機,在 Virtualbox 上對此VM做共用資料夾的設定:"設定" --> "共用資料夾" 


其中,"資料夾路徑" 為 Windows 中要分享給 VM 的路徑,
"資料夾名稱" 為VM 要掛載的名稱 (可自訂),
"掛載點"為VM中對應的分享資料夾路徑 (可自訂)。
接著開啟 VM 並輸入指令:
掛載分享資料夾:sudo mount -t vboxsf {資料夾名稱} {掛載點}
Ex: sudo mount -t vboxsf virtualBoxShareFolder /home/virtualBoxShareFolder