Docker 是世界领先的软件容器平台
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
优点
1、更快速的交付和部署
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
2、更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker几个主要概念
Docker 容器技术
Image
镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
就是一个只读的文件,作为创建 Docker Container 的模板。镜像是容器的基石,容器基于镜像启动,镜像就像是容器的源代码,保存了用于容器启动的各种条件。
支持通过扩展现有镜像,继而创建新的镜像
Dockerfile
每个 Docker Container 都从一个 Dockerfile 开始。Dockerfile 是一个使用易于理解的语法编写的文本文件,描述如何生成 Docker Image,指定了容器的操作系统、编程语言、环境变量、文件位置、网络端口和其他组件等配置信息,当然还指定了容器启动后要执行的内容
Dockerfile 指令大小写不敏感的,但通常使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile 指令
构建指令:用于构建 Image,其指定的操作不会在运行 Image 的容器上执行
FROM 指定的 base image
# 指定 base image 为该 image 的最后修改的版本。FROM <image> # 指定 base image 为该 image 的一个 tag 版本。FROM <image>:<tag>
MAINTAINER(指定镜像创建者信息)
MAINTAINER <name>
使用 docker inspect 查看时,会输出中有相应的字段记录该信息
RUN(指定构建镜像时执行的指令)
RUN 可以运行任何被 base image 支持的指令
base image 为 ubuntu,则使用 apt install。
base image 为 centos,则使用 yum install。
RUN <command> (the command is run in a shell - `/bin/sh -c`) RUN ["executable", "param1", "param2" ... ] (exec form)
设置指令:用于设置 Image 的属性,其指定的操作将在运行 Image 的容器中执行
CMD(设置容器启动时执行的操作)
一个 Dockerfile 只能由一条 CMD 指令,如果有多个,则仅执行最后一条。CMD 指定执行的操作类型可以是二进制程序、自定义脚本,或操作系统指令。
指令3 种格式
CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
CMD command param1 param2 (as a shell)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
ENTRYPOINT(设置容器启动时执行的操作)
独自使用
当独自使用时,如果同一个 Dockerfile 也编写了 CMD 命令,且 CMD 是一个完整的可执行的命令,那么 CMD 指令和 ENTRYPOINT 指令会互相覆盖只有最后一个 CMD 或者 ENTRYPOINT 有效。
和 CMD 指令配合使用
用来指定 ENTRYPOINT 的默认参数,这时 CMD 指令不是一个完整的可执行命令,仅仅是参数部分,因为 ENTRYPOINT 指令只能使用 JSON 方式指定执行命令,而不能指定参数。例如:
USER(设置启动容器的用户)
默认为 root 用户。指定 memcached 的运行用户
EXPOSE(设置容器需要映射到宿主机的端口)
该指令会将容器中的端口映射成宿主机中的某个端口,外部可以通过宿主机的 IP:Port 来访问容器的服务 Socket。
实现步骤
首先在 Dockerfile 中使用 EXPOSE 指令设置需要映射的容器端口。EXPOSE 指令可以一次设置多个端口号。
然后在运行容器的时使用 -p 选项加上 EXPOSE 所设置的端口。可以配套的多次使用 -p 选项。
ENV(设置环境变量)
设置了环境变量之后,后续的 RUN 指令就都可以使用了,容器启动后,可以通过 docker inspect 指令查看这个环境变量,也可以通过指令 docker run --env key=value 设置或修改指定的环境变量。
ADD(设置从 HostSrc 复制文件到 ContainerDest)
ADD <src> <dest>
src 的路径是 docker build 目录的相对路径,也可以是一个远程的文件 URL。
dest 是容器的绝对路径。
如果 src 是文件且 dest 中不使用 “/” 斜杠结束,则会将 dest 也视为文件,src 的内容会写入 dest。
如果 src 是文件且 dest 中使用 “/” 斜杠结束,则会将 src 文件拷贝到 dest 目录下。
如果 src 是一个目录,那么会将该目录下的所有文件添加到 dest 中,不包括 src 目录本身。
如果 src 是文件且是可识别的压缩格式,则进行解压缩(注意压缩格式)。
VOLUME(设置卷的挂载点)
WORKDIR(设置目录的切换)
相当于 cd 命令,可以多次切换,对 RUN、CMD、ENTRYPOINT 指令生效。
COPY(复制指令,从上下文目录中复制文件或者目录到容器里指定路径)
hub/registry
共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。
container
容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
参考文档
https://www.cnblogs.com/peng104/p/10296717.html
https://www.cnblogs.com/ityouknow/p/8520296.html
https://is-cloud.blog.youkuaiyun.com/article/details/108895101
https://is-cloud.blog.youkuaiyun.com/article/details/108895101
https://www.imooc.com/wenda/detail/513974
https://www.runoob.com/docker/docker-dockerfile.html
docker 命令
查看镜像内容:docker exec -it uicon /bin/bash
copy 文件:docker cp ee2a77aae797:/app C:\test
查询正在运行的容器:docker ps
运行dockerfile: docker build -f C:\Workspace\Examena\Dockerfile_FaceRecognizer.Web