以下是阅读 《每天5分钟玩转Docker容器技术》的笔记:
- Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。
-
docker build -t target_image_name .
命令结尾的 . 指明 build context 为当前目录。 Docker 默认会从 build context 中查找 Docker 文件。 我们也可以通过-f
参数指定 Dockerfile的位置 - 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动 – 无论添加、删除、还是修改文件都只会发生在容器层中。
- Docker 容器就是 Docker 镜像的运行实例。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
下面我们深入讨论容器层的细节。
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
- 添加文件
在容器中创建文件时,新文件被添加到容器层中。 - 读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。 - 修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。 - 删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
###############################################################
Docker 容器
Docker 容器就是 Docker 镜像的运行实例。
用户可以通过 CLI(docker)或是 API 启动、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
docker run
:创建一个新的容器并运行一个命令.docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
e.g. 实例:使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest docker run -it --name my_ubuntu -d ubuntu:latest
注意: 没有
-it
的话,container刚开始就停掉了。
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#
/######################################################
docker run
vs docker exec
vs docker start
:
docker run
:
Description
Run a command in a new container
Usage
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker exec
:
Description
Run a command in a running container
Usage
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
e.g. docker exec -it <mycontainer> bash
to get into a container
docker start
:
Description
Start one or more stopped containers
Usage
docker start [OPTIONS] CONTAINER [CONTAINER...]