---
# System prepended metadata

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

---

# Docker 常用指令

###### tags: `常用指令` `docker`

## 基本指令
* 列出 containers 所佔空間
```
docker ps --size
```

* 列出 docker 所佔空間
```
docker system df
```

* 列出 containers
```
# 列出所有 containers
docker ps -a

# 列出正在運行的 containers
docker ps
```

* 暫停運行 container
```
docker stop <container name>
```

* 重新啟動 container
```
docker start <container name>
```

* 刪除 container
```
docker rm <container name>
```

* 列出所有映象檔
```
docker images
```

* 刪除映象檔
```
docker rmi <image name>
```

* 建立 container
```
docker run -d <image name>

# 自訂 container name
docker run -d --name <container name> <image name>

# 指定主機端 port 對應 container port
docker run -d -p <host port>:<container port> <image name>

# 建立主機端與 container 之間檔案同步的路徑 (Volume)
docker run -d -v <host volume path>:<container volume path> <image name>
```

* 進入 container shell
```
docker exec -it <container name> bash
```

* 將 container 做成映象檔
```
docker commit -a "<author info>" -m "<any message>" <container name> <image name>:<tag name>
```

* 上傳至 Docker hub
```
# 1.登入 Docker hub
docker login

# 2. tag name
docker tag <image name> <Docker hub user name>/<image name>

# 3. 上傳
docker push <Docker hub user name>/<image name>
```

* 下載映象檔
```
docker pull <image name>

# 指定版本
docker pull <image name>:<tag name>

# 指定作者
docker pull <Docker hub user name>/<image name>
```

* 將映象檔存成壓縮檔
```
# tar檔
docker save <image name> > <file name>.tar

# tar.gz檔 
docker save <image name> | gzip > <file name>.tar.gz
```

* 將壓縮檔轉成映象檔
```
docker load -i <file name>.tar.gz
```

## 變更 docker 預設路徑
#### 發現主機放置 docker 的空間不足，需變更預設儲存路徑
```
# 1.停止 docker
sudo service docker stop

# 2.編輯文件
sudo vim /etc/docker/daemon.json

# 3.在文件中加入
{
"data-root":"<your new path>/docker"
}

# 4.複製原有檔案至新路徑
sudo rsync -aP /var/lib/docker/ <your new path>/docker

# 5.變更原有案名稱作為備份
sudo mv /var/lib/docker /var/lib/docker.old

# 6.重啟 docker
sudo service docker start
```
## 以 Dockerfile 建立映象檔
#### 除了下載 Docker hub 上的映象檔，也可自己製作
```
# 建立 Dockerfile
vim Dockerfile
```

#### Dockerfile 內容
```
FROM <image name>
RUN <command...>

# 範例
# 以 Ubuntu 為作業系統，安裝 vim, nginx, git
FROM ubuntu
RUN apt-get update -qq && apt-get -y --no-install-recommmends install \ 
vim \
nginx \
git-all
```
##### 建立映象檔
```
ddocker build -t <>image name <>Dcockerfile path --noache

# 範例
# 建立映象檔
docker build -t ubuntu_vim_nginx_git . --no-cache

# 以此映象檔建立 container
docker run -d -it --name test_server ubuntu_vim_nginx_git

# 進入 container
docker exec -it test_server bash

# 可測試 vim, nginx, git 是否安裝成功
```

## 運用 docker-compose 佈署 container
#### 以往我們建立 container 需要將參數寫入在 docker run 裡，但有時參數過多會導致指令冗長，我們可以撰寫 docker-compose.yml，事先把參數寫在裡面，再透過 docker-compose 幫我們依據寫好的參數來建立 container

#### 如果我們有一個 docker run
```
docker run -d -p <host port>:<container port> -v <host volume path>:<container volume path> --name <container name> <image name>
```
#### 其效果等同於以下 docker-compose.yml 內容
```
# 重視縮排
services:
    <server name>:
        image: <image name>
        
        ports:
            - "<host port>:<container port>"
            
        volumes:
            - <host volume path>:<container volume path>
            
        container_name: <container name>
```
#### 在 docker-compose.yml 所在路徑執行以下指令即可建立 container
```
docker-compose up -d
```

#### docker-compose 還有以下優點
1. 可同時建立多個 container
2. host volume path 可使用相對路徑
3. 也可用於建立映象檔(by Dockerfile)