---
# System prepended metadata

title: Docker
tags: [Other]

---

---
tags: Other
---
# Docker

[TOC]

 - 不用開機，啟動速度 > VM
 - 不用煩惱複雜的環境，直接 pull image，作業系統全搞定
 - 要給環境變數、設定檔案路徑一切都隨心所欲
 - 用最簡單的方式，執行你的 service
 - 拿別人寫好的 Image，寫 Dockerfile 組成你想要的 Image，一層一層疊起來，快速方便

   ![](https://i.imgur.com/kZ8eM78.png)


## 指令

![](https://i.imgur.com/K5yWRu8.png =350x)

指令分為四大類：

 * Linux 系統相關指令
 * Docker Registry 相關指令
 * Image 相關指令
 * Container 相關指令

### Linux 系統相關指令 (TODO: 進階)

 * `$ docker info` **列出和系統相關的資訊**
   
   如 Image 數、Container 數、檔案系統目錄、使用 Linux 版本、CPU 及記憶體等。用來檢查系統是否能正確執行 Docker 所有指令。

 * `$ docker version` **列出目前 Docker 的版本**

   以及 Go 語言的版本等。

### Docker Registry 相關指令

 * `$ docker login/logout [registry]` **登入登出**

   如果 registry 留空，則自動指向 [Docker hub](https://hub.docker.com/)。

 * `$ docker search` **搜尋 Image**

   `-s` 可以指定多少 stars 以上的 Image。

### Image 相關指令

 * `$ docker images` **列出所有的 Image**
   
   參數 `-q` 只列出 ID，`-a` 列出完整的層次資訊。

 * `$ docker build/hisotry` **建立**

   history 會列出製作的每一步過程。

 * `$ docker pull` **下載**

   `$ docker push` **上傳**

 * `$ docker save -o [*.tar] [image]` **匯出**

   `$ docker load --input [*.tar]` **匯入**

   如果想要和其它人交換時，不想上傳到 Docker Hub，也不想自己架設私有 Docker Registry，就可以用這兩個方式存成 **tarball** 格式及匯出。
   
 * `$ docker rmi [image id]` **刪除本機中存放的 Image**

   如果有容器還在使用這個 Image 則無法刪除，但可以下 `-f` 參數強迫刪除。
 
 * `$ docker tag` **標記別名**

   一個 Image 可以有很多不同的 tag name。

### Container 相關指令

 * `$ docker run` **建立 Container 並執行指令**

   `-it` 可以進入 Container 內部操作介面，`-rm` 結束後刪除 Container，`-d` 背景執行。

 * `$ docker rm` **刪除**

 * `$ docker inspect` **檢查狀態**

   `$ docker ps` **查看使用狀態**

   `$ docker stats` **查看 CPU、記憶體及網路使用**
   
   `$ docker top` **查看在主系統中的記憶體使用**
   
   `$ docker dip/dpid` **查看 IP/pid**

 * `$ docker exec` **在外部向 Container 內執行指令**

   `$ docker exec -it [container] bash` **進入 Container Shell**
 
更多指令：[全面易懂的 Docker 指令大全](https://joshhu.gitbooks.io/dockercommands/content/Containers/ContainersBasic.html)

## 容量

```shell
$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              127                 6                   22.97GB             22.3GB (97%)
Containers          7                   4                   4.125MB             84.42kB (2%)
Local Volumes       173                 3                   32.75GB             32.58GB (99%)
Build Cache         0                   0                   0B                  0B
```

大掃除

```shell
$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache
  
$ docker system prune -a  ← 清除更乾淨，沒有 container 使用的 image 全部刪光
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache
```

## network

Container 間互連時會連不到，可以用 `http://docker.for.mac.localhost/` 來取代 `localhost` 戳到。

## can't login in

Mac 有發生無法 login 的狀況，鑰匙圈存取把先鎖定再解鎖即可。

![](https://i.imgur.com/QaslQ3A.png)


## subsitution command

`CMD` 沒有辦法跑 subsitution command，可以用 bash 來解：

```dockerfile
CMD ["bash", "-c", "echo $(date)"]
```

## 參考資料

 * [全面易懂的 Docker 指令大全](https://joshhu.gitbooks.io/dockercommands/content/index.html)

