Docker Commond

指令 docker command

Image 鏡象
docker image ls //查看 鏡象 
command :
docker build -t imagename -f dockerfile  .
docker build -t imagename ./

. (dot):代表當前目錄,也是預設名稱 Dockerfile 檔案名稱
-t : image 名稱(小寫)
-f : Dockerfile名稱
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Container 容器
docker ps -a //查看 container 
command :
docker create -p 8000:80 --name containerName imageName

-p 8000(本機電腦上的連接埠 host system 8000 port):80(連接埠對映 Container 80 port )
--name containerName 容器名稱
imageName 鏡象名稱

docker exec -it containerName bash 進入container 的Bash shell

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Volume Docker 幫我們管理資料的部分
command :
docker volume create VolumeName 建立volume

--mount 或 -v 將 Container 綁定至 Volume 了
docker run --name ContainerName --mount source=volumeName,target=/user/local/apache2 -p 8000:80 ImageName
source: volume, target: container path

使用時機: 
多個 Container 中共用資料、無法確保存放資料路徑或結構、Docker 不在本機端而是在雲端或遠端、需要資料的備份、還原、轉移、資料有大量 I/O、應用程式需要完整且原生的 File System
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bind Mount - 綁定至 Filesystem

--mount 或 -v 將 Container 綁定至 Volume 了
docker run --name ContainerName --mount type=bind,source=實體磁碟路徑,target=/usr/local/apache2/htdocs -p 8080:80 httpd
source: 實體磁碟路徑, target: container path

使用時機:
將 Config 設定檔同時分享給 Container 與本機端、同時分享程式碼或其他來源文件給 Container 與本機端、所綁定的路徑底下,其資料夾與結構等等都非常確定且保持一致不會改變
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tmpfs Mount - 綁定至 Memory Disk 將資料儲存在記憶體而不是存在硬碟內,只要重新開機,資料會被抹除。
docker run -d --name ContainerName --mount type=tmpfs,destination=/usr/local/apache2/htdocs -p 8080:80 httpd

使用時機:
資料被短暫儲存、需要每次重啟都有乾淨的環境、當想要讀寫性能非常好時,因為它掛載的空間是在記憶體上

docker volume inspect volumeName 檢查volume

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dockerfile 
path 往下,無法往上搜尋
COPY [src(Dockerfile 所在目錄的相對路徑(文件或目錄)) ,dest(鏡像内絕對路徑,或者相對工作目錄(WORKDIR)的相對路徑)]

mssql
docker pull  mcr.microsoft.com/mssql/server:2022-latest 拉下mssql版本

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=@Dias21617" -p 1400:1433 --name sql1 --hostname sql1 -d  mcr.microsoft.com/mssql/server:2022-latest
-e "MSSQL_SA_PASSWORD=<YourStrong@Passw0rd>" 指定您自己的強式密碼,該密碼長度至少需為 8 個字元且符合 SQL Server 密碼需求。
-p 1433:1433 將主機環境上的 TCP 連接埠 (第一個值) 對應至容器中的 TCP 連接埠 (第二個值)。
--name sql1 為容器指定自訂名稱,而不使用隨機產生的名稱。
--hostname sql1 用來明確設定容器主機名稱
-d 在背景執行容器 

docker run -it --name <WHATEVER> -p <LOCAL_PORT>:<CONTAINER_PORT> -v <LOCAL_PATH>:<CONTAINER_PATH> -d <IMAGE>:<TAG>
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=Passw0rd' -p 1402:1433 --name sql2 -v <host_dir>:<container_dir>  -d microsoft/mssql-server-linux:2017-latest
參數可以建立實體資料夾與 container 資料夾的對應關係,將主機上的指定目錄綁定到 container 的指定目錄,也就是可以存資料庫的資料至主機,參數語法為 -v <host directory>:/var/opt/mssql

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Show ip
docker inspect -f"{{.NetworkSettings.IPAddress}}" sql1
sql1 : --name

Webapi in container
url = http:// show ip:host system port/
db in container 
connect : "Server=ip;Database=資料庫;User Id=account;Password=pwd;Encrypt=false;"

ref : 
https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes
https://davidleitw.github.io/posts/dockervolume/