指令 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/