一、 docker简介
- 是什么:在软件开发过程当中,开发、测试、运维人员需要分别维护各自的环境,在代码相同操作系统相同的情况下,会出现在开发环境可以程序运行没问题,在测试环境或生产环境程序运行却存在问题。而docker是解决了运行环境和配置问题(带环境安装)软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
- 与VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。但是,Docker 对应用程序的隔离不如虚拟机彻底,所以它并不能完全取代 VMware。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 官网:http://www.docker.com
二、Docker 的优点
- 简化程序:
Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。 - 方便:
Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。 - 节省开支:
Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。 - 与传统虚拟化比较:
资源占用少、启动快、体积小。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源
三、虚拟机和容器
虚拟机:一个系统里运行另外一个系统,比如windows上运行Linux系统。虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
Linux容器(LXC):Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,是与系统其他部分隔离开的一系列进程。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能运行。
Docker容器:底层基于LXC实现,“一次封装,到处运行”。跨平台、跨服务器、一次配置好环境,一键部署。解决了运行环境和配置问题,实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
四、Docker架构
Docker是C/S架构的程序使用远程API来管理和创建Docker容器。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
五、Docker基本概念
Docker 主要包含三个基本概念,分别是镜像、容器和仓库,理解了这三个概念,就理解了 Docker 的整个生命周期。
-
镜像(Image):就是一个只读的模板,镜像不包含任何动态数据,其内容在构建之后也不会被改变。是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
-
容器:实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间容器可以被创建、启动、停止、删除和暂停等等,容器是用镜像创建的运行实例。
每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 -
仓库:镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库;每个仓库可以包含多个标签;每个标签对应一个镜像,其中标签可以理解为镜像的版本号。简单来说就是集中存放镜像文件的场所。
六、常用命令
docker ps –a 查看所有容器
docker ps 查看当前运行的容器
docker rm containerid 删除容器
docker rmi imageid 删除镜像
使用 docker pull 命令来载入镜像: docker pull ubuntu
启动一个容器,参数为以命令行模式进入该容器:docker run -it ubuntu /bin/bash
参数说明:
• -i: 交互式操作。
• -t: 终端。
• ubuntu: ubuntu 镜像。
• /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
• 要退出终端,直接输入 exit
使用 docker start 启动一个已停止的容器:docker start b750bbbcfd88
后台运行: docker run -itd --name ubuntu-test ubuntu /bin/bash
停止容器的命令如下:docker stop <容器 ID>
停止的容器可以通过 docker restart 重启:docker restart <容器 ID>
- 进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
• docker attach
• docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach 命令:docker attach 1e560fca3906
使用 docker exec 命令,如果从这个容器退出,不会导致容器的停止
docker exec -it 243c32535da7 /bin/bash
- 删除容器
docker rm -f 1e560fca3906
清理掉所有处于终止状态的容器:docker container prune
七、使用 Docker 打包 Python 项目
- 新建python项目,分别新建三个文件:Dockerfile,app.py,requirements.txt
Dockerfile(没有后缀):一个文本文件,包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。创建镜像必须文件。
requirements.txt :所需要的插件,以python为例。执行命令pip install virtualenv
在你的电脑上安装这个插件,切到虚拟环境目录的Script文件下,进入之后执行 activate,进入到了虚拟环境中。
可以利用pip list进行查看导入了什么包。可以执行之后,把你的依赖包写requirements.txt,执行命令:pip freeze > requirements.txt
打开requirements.txt ,也可以查看你的依赖包。
如果是导出少了,可以手动添加,否则不要手动添加未使用的包。停用命令deactivate
- 生成镜像,本文采用的windows环境,到项目路径下面,执行
docker build -t friendlyhello .
命令中最后的点不要忘记,这里表示当前目录
- 运行镜像程序,这里可以看到分词效果