---
# System prepended metadata

title: Docker基本觀念

---

# Docker基本觀念
## 購買課程的筆記
https://dockertips.readthedocs.io/en/latest/
## Image vs Container
* Docker image是一个 read-only 文件
    * 这个文件包含文件系统，源码，库文件，依赖，工具等一些运行application所需要的文件
    * 可以理解成一个模板
    * docker image具有分层的概念
* container容器
    * “一个运行中的docker image”
    * 实质是复制image并在image最上层加上一层 read-write 的层 （称之为 container layer ,容器层）
    * 基于同一个image可以创建多个container
![](https://hackmd.io/_uploads/Sy_ljrda2.png)

## Docker 多階段建構
* hello.c
``` c=
#include <stdio.h>

void main(int argc, char *argv[])
{
    printf("hello %s\n", argv[argc - 1]);
}
```
* 單一階段建構
``` dockerfile=
FROM gcc:9.4

COPY hello.c /src/hello.c

WORKDIR /src

RUN gcc --static -o hello hello.c

ENTRYPOINT [ "/src/hello" ]

CMD []
```
編譯
``` sh=
docker build . -t one-stage:v1
```

* 多階段建構
``` dockerfile=
FROM gcc:9.4 AS builder

COPY hello.c /src/hello.c

WORKDIR /src

RUN gcc --static -o hello hello.c



FROM alpine:3.13.5

COPY --from=builder /src/hello /src/hello

ENTRYPOINT [ "/src/hello" ]

CMD []
```
編譯
``` sh=
docker build . -t two-stage:v1
```

* 最終比對
>分階段建置提供了更好的控制和最佳化空間，
>能夠產生更小、更安全、建置更快的Docker映像。
>
![image](https://hackmd.io/_uploads/BkCyO7aA6.png)



