---
# System prepended metadata

title: '[Docker] 常用指令'
tags: [docker]

---

# [Docker] 常用指令
###### tags: `docker`
[TOC]
## 一般

* 查看 docker 版本
```
$ docker --version
$ docker version
$ docker -v
```

* 從 DockerHub 下載image
```
$ docker pull <imageName>:<imagesVersion>
$ docker pull node:15.0 (此為版本為15.0的node image)
```    

## image 映像檔
用來建立容器的材料。

### - docker images
查看目前擁有的 images
```
$ docker images
$ docker images -q
$ docker images -tree
```
* `-q` 只列出映像檔ID
* `-tree` 列出映像檔之間的樹狀關係
### - docker history
查看某個image的歷史
```
$ docker history <imageID>
```
### - docker rmi
移除某個 image
**需先移除用此image啟動的containers**
```
$ docker rmi <imageID>
$ docker rmi <imageID> -f
```
* `-f` 有使用此映像檔的容器一起移除
### - docker build
使用Dockerfile重新建立 images，或是更新 images
```
$ docker build -f <path> -t <images name:version> .
$ docker build -f webapp/Dockerfile -t mydocker:1.0 .
```
* `-f` 指定讀取的 Dockerfile
* `-t` 建立的映像檔名稱

### - docker save/load
將映像檔存入/匯出電腦檔案格式，
將映像檔存成tarball格式及匯出
```
$ docker save -o <tarName> <imagesName:tag>
$ docker save -o mydemo.tar winnie/mydemo:w12
```
還原成映像檔格式
```
$ docker load --input mydemo.tar
```

## container 容器
與本地環境隔離開的虛擬環境，可當作應用程式執行，容器間彼此互不干擾。

### - docker ps
列出本地端所有正在運行的容器
```
$ docker ps
$ docker ps -a
```
* `-a` 表示所有容器(包含沒有運行的容器)
### - docker start
運行某個 container
```
$ docker start <containerID>
$ docker restart <containerID>
```
### - docker stop
停止某個 contaienr 
```
$ docker stop <containerID>
```
### - docker rm
移除某個 container
```
$ docker rm <containerID>
```
移除所有停止的 containers
```
$ docker container prune -f
```
### - docker commit
用某container建立一個image並命名
```
$ docker commit <containerID> <for-image-name>
```
### - docker run
用某image啟動一個container並進入
```
$ docker run -it <imageID> /bin/bash
```
* `-d` 在背景運行
* `-p` `--publish` 設定本地端與容器對應的IP
* `-e` `--env` 設定環境變數
* `--name` 設定容器的別名
* `--rm` 容器停止後自動將容器刪除
* `-t` 開啟終端機
* `-i` 可以輸入
### - docker exec
在某container中執行 /bin/bash 這個命令，可以當作進入容器
```
$ docker exec -it <containerID> /bin/bash
$ docker exec -it <containerID> bash
```
### - docker rename
重新命名容器
```
$ docker rename <old_name> <new_name>
```
### - docker cp
複製本地端的檔案至容器內，或複製容器內的檔案至本地端
```
$ docker cp ./some_file CONTAINER:/work
$ docker cp CONTAINER:/var/logs/ /tmp/app_logs
```
### - docker inspect
查看容器內的資訊
```
$ docker inspect <containerID> 
```
查看所有容器 IP
```
$ docker network inspect bridge
```

### - docker network
Software-Defined Networks 用於容器之間的連線

建立 network
```=$!
$ docker network create <networkName>
```
列出 network
```=$!
$ docker network ls
```
刪除 network
```=$!
$ docker network rm <networkName>
```
移除所有未使用的 network
```=$!
$ docker network prune

WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
n1
n2
```
建立容器的連線
```=$!
$ docker network connect <networkName> <containerName>
$ docker network connect --ip <ip> <networkName> <containerName>
```

資料來源:
[docker inspect](https://docs.docker.com/engine/reference/commandline/inspect/)
[獲取 Docker 容器的 IP 地址](https://www.delftstack.com/zh-tw/howto/docker/getting-a-docker-container-ip-address/#%25E4%25BD%25BF%25E7%2594%25A8-docker-inspect-%25E7%258D%25B2%25E5%258F%2596-docker-%25E5%25AE%25B9%25E5%2599%25A8%25E7%259A%2584-ip-%25E5%259C%25B0%25E5%259D%2580)
[映像檔指令參數總類](https://joshhu.gitbooks.io/dockercommands/content/DockerImages/CommandArgs.html)


## volumes
可以讓容器內的資料持久化在本地端，並彼此互通，因此可通過本地端變更資料。**容器關閉或刪除後，資料並不會在本地端遭到刪除**
### - docker volume
新增 volume
```=$!
$ docker volume create --name <volumeName>

$ docker run -v <volumeName>:<path> -it ubuntu touch /data/file
```
* `-v` 可以指定本地端要對應容器內的哪個路徑

資料來源:
[Docker 實戰系列（三）：使用 Volume 保存容器內的數據](https://larrylu.blog/using-volumn-to-persist-data-in-container-a3640cc92ce4)







