---
# System prepended metadata

title: Q&A/Docker+Container

---

# Q&A/Docker+Container

:::info
:book: [動手學習Docker](https://www.docker.com/101-tutorial)
:::

{%hackmd 1lpg7PuqRoaui6XyJcrylw %}

## 更新docker container
1. 列出所有的container，並用`<CONTSINER ID>`刪除container。
```bash=1
docker ps -a
docker rm -f <CONTAINER ID>
```

2. 列出所有的image，並用`<IMAGE ID>`刪除container。
```bash=+
#檢查image裡simonwxzhao/auto-test的Image Id
docker image ls 
docker image rm <IMADE ID>
```
3. 重新pull image（Optional）
```bash=+
docker pull simonwxzhao/auto-test
```
4. 重新啟動Container
```bash=+
#<username>記得要改
docker run -dit --restart always -v /mnt/c/Users/<username>/my_docker_volume:/usr/src/app simonwxzhao/auto-test
```

## 什麼是docker image和docker container？
- 可以將docker image理解為一個描述了container應該長怎樣的檔案。譬如container該有什麼應用程式、檔案內容和結構等。
- 而container就是根據Docker image的描述，產生的一個實體。
- 如果把Docker image視為一個蛋糕食譜，那麼comtainer就是根據這個食譜做出來的蛋糕實體。
- 而Docker image是由一個名為Dockerfile的文字檔建置出來的，既然Docker image是用來描述container應該長怎樣的，那麼用來建置Docker image的Dockerfile內容當然就也是用文字描述了container的長相。
- Dockerfile, Docker image和 Docker container三者的關係如下圖。
![](https://i.imgur.com/lFkcEis.png)
- Docker範例
```dockerfile=
FROM python
WORKDIR /usr/src/app
RUN pip install \
    behave \
    robotframework && \
    pip cache purge
```

## 執行`docker run ... <image>`時什麼會有類似下載的pull動作？那`<image>`又從哪裡pull來的？
  ![](https://i.imgur.com/QFpvVOz.png)
  
  ![](https://i.imgur.com/LHu4CXq.png)
- 執行docker run的時候，會先檢查local有沒有指定的image？
    - 如果有就根據image開啟container。
    - 如果沒有就會到指定的docker registry中pull指定的docker image到local，再跑起container。而預設狀態下的default registry是Docker Hub，故若沒特別指定docker registry就會從docker Hub中pull。


## 指令
### 操作docker image
- 列出local有的image
```bash
docker image ls
```
- 刪除image
```bash
docker image rm -f <image-id>
```

### 操作docker container
- 列出正在運行的contianer
```bash
docker ps
```

- 列出所有的contianer
```bash
docker ps -a
```

- 刪除container
```bash
docker rm -f <container-id>
```