1. Docker 的安装(省略,后续补充)#
1.1 Centos#
1.2 Ubautu#
2. Docker Container#
2.1 Image & Container#
Image 镜像
镜像是一个
read-only的文件相当于一个模板,我们可以通过这个模板实例化出来很多容器
image其实就是一个文件系统(Union FS),它与宿主机的内核一起为程序提供一个虚拟的linux环境
2.2 Container 基本操作#
Container 容器
实质是复制image并在image最上层加上一层
read-write的层 (称之为container layer,容器层)基于同一个image可以创建多个container层,是一个运行中的Docker Image
-
创建容器:
docker container run <image name>如果image name不存在会自动搜索并添加 -
查看运行中的容器(up):
docker container ps / ls -
查看所有容器(up/exit):
docker container ps / ls -a -
容器的停止:
docker container stop <id>这里的id可以简写 -
容器的删除:
docker container rm <name or id>可选参数 -f
如果容器过多的话一个个删除很麻烦,我们可以批量删除:
-
手动批量删除:docker container rm <id_1 id_2 id_3 …>
-
脚本查询方式删除:docker container rm $(docker container ps -aq)
我们知道docker container ps 是查看运行中的容器,后面加上 -aq 参数可以查到所有的容器名,如下图所示:👇

2.3 Container Mode 容器运行模式#
- Attach 模式:
在linux系统中(windows不受影响),我们使用 docker container run -p 80:80 nginx 运行的话是在前台运行,当我们 CTRL+C 后,会导致容器停止。一般不推荐使用
-
Detach 模式:
指令加 -d 参数就可以后台运行啦
docker container run -d -p 80:80 nginx
2.4 连接容器的shell#
-
创建一个容器并且进入交互模式:
docker container run -it -p 80:80 nginx sh这样启动的容器我们在CTRL+C 后,同样也会导致容器停止。 -
在已经启动的容器执行额外command:
docker container exec -it <id> sh
2.5 Docker container run 经历了什么?#
docker container run -d -p 80<80>80> nginx
-
在本地查找是否有nginx这个image镜像,但是没有发现
-
去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
-
下载最新版本的nginx镜像 (nginx
默认) -
基于nginx镜像来创建一个新的容器,并且准备运行
-
docker engine分配给这个容器一个虚拟IP地址
-
在宿主机上打开80端口并把容器的80端口转发到宿主机上
-
启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)
3. Docker Image #
3.1 Image 基本操作#
-
创建镜像:
docker image pull <image name:version> -
根据已有的镜像创建新的tag镜像:
docker image tag <image name> <new image name:tag> -
查看镜像:
docker image ls -
删除镜像:
docker image rm <id> -
指定镜像的tag删除镜像
docker image rm <image name:tag> -
导出镜像:
docker image save <image name:version> -o <image nickname> -
导入本地镜像文件:
docker image load -i <image nickname>
4. Dockerfile指南#
4.1 Docker Build #
Docker Build是Docker提供的一个命令,用于根据Dockerfile构建自定义的镜像。
4.1.1 语法#
-
docker build是 Docker 命令,用于构建镜像。 -
[OPTIONS]是可选的命令参数,可以用来自定义构建过程的行为。 -
PATH表示要构建镜像的上下文路径,通常是包含 Dockerfile 的目录。 -
URL是一个远程 Git 仓库的 URL,可以直接从远程仓库构建镜像。 -
-表示从标准输入流中读取 Dockerfile 的内容进行构建。
4.1.2 OPTIONS#
-
-f : dockerfile :名称,默认路径(/Dockerfile)
-
—build-arg <variable> :构建时指定变量
-
-t <指定镜像名称和标签>指定镜像名称和标签>
具体用法参考:Docker Build语法用法示例详解
4.2 FROM 基础镜像选择#
原则上官方镜像优先于非官方镜像
使用固定版本tag,而不是每次都直接使用latest
选择体积较小的镜像
- alpine 结尾的镜像是体积比较小的
4.3 RUN 执行命令的优化#
RUN主要用于在Image里执行指令,比如安装软件,下载文件等。
-
优化前:
-
优化后:
4.4 ADD COPY 操作#
ADD 和 COPY 都是往镜像里面复制文件的操作
-
COPY:复制文件
-
ADD : 比COPY 高级,复制的时候如果复制的是gzip等压缩文件他会自动解压缩文件
在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则:所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。
4.5 ARG vs ENV 参数构建和环境变量#
4.5.1 ARG 和 ENV 的基础用法#
我们可以在dockerfile 中自定义一个变量,在后面引入,我们来看具体用法:
通过对比我们发现,这两个的用法基本一样,那他们的区别在哪儿呢?
4.5.2 ARG 和 ENV 的区别#
- ARG 指定的变量可以在镜像build的时候动态修改
--build-arg
docker image build -f .\Dockerfile-arg -t ipinfo-arg-2.0.0 --build-arg VERSION=2.0.0
- ENV 指定的变量不能修改,可以在Image中保持
4.6 CMD vs ENTRYPOINT 容器启动时执行#
4.6.1 CMD#
CMD 可以设置容器启动默认执行的命令
-
容器启动执行默认命令
-
如果我们指定了命令,容器的默认命令就会失效
-
定义多个CMD的时候只会执行最后一个
4.6.2 ENTRYPOINT #
-
CMD设置的命令,可以在docker container run 时传入其它命令,覆盖掉CMD的命令,但是ENTRYPOINT所设置的命令是一定会被执行的。 -
ENTRYPOINT和CMD可以联合使用,ENTRYPOINT设置执行的命令,CMD传递参数
4.6.3 Shell 格式和Exec格式#
-
shell格式:
-
Exec 格式
假如我们要把上面的CMD改成Exec格式,下面这样改是不行的,它会打印出 hello $NAME , 而不是 hello docker ,那么需要怎么写呢? 我们需要以shell脚本的方式去执行
4.7 Dockerfile 使用技巧#
4.7.1 合理使用缓存#
把经常发生变化的内容放在下面执行,这样他就会最大程度的利用缓存,举个例子,我有一个dockerfile,里面经常会发生变化的操作是COPY操作,最好的做法是把他放在下面执行
4.7.2 Dockerignore 的使用#
我们在构建一个image的时候会使用下面这个命令:docker image build -t demo:1.0 .最后面的点是我们构建时使用的文件夹,我们应该使用类似 git ignore 的文件来忽略那些我们构建时不需要的内容,提高构建的效率
4.7.3 镜像的多阶段构建#
-
优化前:构建后大小1G+
-
多阶段构建优化后:大小6MB左右
5. Docker 的存储#
5.1 Docker Volume(存储卷)#
5.1.1 什么是存储卷?#
存储卷是将服务器一个文件目录和容器文件系统某一个目录建立绑定关系,这个服务器文件的目录就是存储卷。存储卷可以同步容器内的数据,并且容器销毁之后不会影响到存储卷的数据。
存储卷就好比我们租了个仓库,有了仓库钥匙后,即使房子被毁了,仓库内的东西还在。
5.1.2 存储卷的分类#
Docker 主要提供了两种方式将数据从宿主机挂载到容器中:
-
Volume docker 由docker管理卷:默认映射到(/var/lib/docker/volumes/ )
-
Bind Mount,由用户指定存储的数据具体mount在系统什么位置