`docker`指令操作
===
(laste update:2021/10/29)

## 一級指令
### 三個指令檔
* `docker` **docker主程式**
* `docker-compose` **建立多個docker容器的`yaml`格式**
* `docker-machine` **建立多台電腦執行docker**
## `docker`指令
### 管理或啟動docker的元件
```
builder Manage builds
config Manage Docker configs
container Manage containers
context Manage contexts
engine Manage the docker engine
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
```
### 最常用
* `docker container` **container通常省略**
* `docker image` **管理映像檔**
* `docker network` **管理新的網路**
* `docker service` **管理系統服務**
* `docker stack` **管理多個容器堆疊**
* `docker swarm` **管理多台主機的docker叢集**
* `docker system` **列出docker相關資訊**
* `docker volume` **管理docker儲存設備**
## 容器相關指令(`docker <指令>`)
### 執行和容器/映像檔相關的指令
```
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
```
### 最常用
* `docker attach` **連接到一個執行中容器的輸出(顯示容器)**
* `docker build` **利用自建的`Dockerfile`建立映像檔**
* `docker commit` **從目前執行的container建立一個映像檔**
* `docker cp` **容器間或實體機容器間複製檔案**
* `docker exec` **連接至容器內執行,如`docker exec -it name bash`**
* `docker export` **把容器的檔案系統存成tar壓縮檔**
* <span style="color:red"> `docker images` **列出所有映像檔** </span>
* `docker import` **從tar檔案建立映像檔**
* `docker info` **列出目前docker的系統資訊**
* v`docker inspect` **列出docker的`json`系統完整資訊** </span>
* `docker kill` **刪除執行中的容器**
* `docker load` **從tar中載入映像檔**
* `docker login` **登入docker的映像檔hub**
* `docker logout` **登出docker的映像檔hub**
* `docker logs` **查看容器的輸出資訊**
* `docker pause` **暫停容器的執行**
* `docker port` **列出容器對外開放的通訊埠**
* <span style="color:red">`docker ps` **列出執行的容器`docker ps -a`**</span>
* <span style="color:red">`docker pull` **下載映像檔**</span>
* <span style="color:red">`docker push` **上傳映像檔**</span>
* `docker rename` **更名映像檔**
* `docker restart` **重啟映像檔**
* <span style="color:red">`docker rm` **刪除容器**</span>
* `docker rmi` **刪除映像檔**
* <span style="color:red">`docker run` **啟動一個新的容器執行**</span>
* `docker save` **將容器存入tar中**
* <span style="color:red">`docker search` **搜索docker hub**</span>
* `docker start` **啟動停止的容器**
* `docker stats` **列出容器的執行狀態**
* `docker stop` **停止容器**
* `docker tag` **幫映像檔取標籤名稱**
* `docker top` **列出執行中容器目前的處理程序**
* `docker unpause` **讓暫停中的容器繼續執行**
### 整理docker image
* 建立:pull, commit
* 列出:ls
* 載入:load/import
* 上傳:push
* 刪除:rm/prune
* 存入:save
* 搜索:search
* 更名:tag
* 登入Hub:login, logout
### 整理docker 容器
* 檢查環境:version, info
* 建立:run(create)
* 檢查:logs, top, inspect, port
* 啟動:start, restart
* 列出:ps
* 執行:attach, exec, unpause
* 停止:stop, kill,pause,wait
* 存入存出:export, import
* 刪除:rm
* 交換資料:cp
* 列出和主機資料的差異:diff,events
## Docker volume

### 原理
* 資料在容器中,當容器消失時,資料會不見,因此要讓資料永久保存下來
* 資料永久保存在主機硬碟中,當容器在其它機器上部署時,資料無法轉移
* 資料庫的資料在生產環境和開發環境不一樣,但又想要有共用位置
### volume(資料卷)
* 由docker本身控管,是一個獨立的資料存放處
* 使用`docker volume`管理
* 和容器無關,容器停止後仍然存在
* 可讓多個容器都連上同一個資料卷
### 資料卷使用時機
* 多容器共享
* 當主機系統不保證有對應的檔案結構(如Linux換成Windows)
* 方便備份
* 可以把資料卷設定在雲端儲存上
### bind mount
* 將容器中的某一目錄或檔案對應到主機上的某一目錄或檔案
* 如果檔案需要常常使用主機上的應用程式修改,則使用這個
* 通常在容器中執行服務的常變動檔案會用這個方法寫出來
* 移機較麻煩
* 在佈署時,通常會將整個目錄複製到容器的映像檔中
### bind mount使用時機
* 分享設定檔
* 分享主程式
* 性能較好
* 在確定不同主機之間的檔案結構一樣時,可以用這個
## 操作
建立資料卷
```
docker volume create my-vol
```
啟動一個容並且對應到這個資料卷
```
docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
```
```
docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
```
直接從容器建立一個資料卷
```
docker run -d \
--name=nginxtest \
--mount source=nginx-vol,destination=/usr/share/nginx/html \
nginx:latest
```
```
docker run -d \
--name=nginxtest \
-v nginx-vol:/usr/share/nginx/html \
nginx:latest
```