Docker学习文档
1. 概念
Docker是一个基于LXC技术构建的容器引擎,基于GO语言开发,遵循Apache2.0协议开源。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或者数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。
2. Dokcer和VM的区别
下图分别是VM和Docker的实现框架
虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整操作系统内核;虚拟机的Hypervisor层可以简单理解为一个硬件虚拟化平台,它在Host OS是以内核态的驱动存在的。 虚拟机实现资源隔离的方法是利用独立的OS,并利用Hypervisor虚拟化CPU、内存、IO设备等实现的。容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。直观上来讲vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,所以资源利用率docker更高。容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。容器使用宿主操作系统的内核,而虚拟机使用独立的内核。
3. Docker的应用场景
1)测试:Docker 很适合用于测试发布,将 Docker 封装后可以直接提供给测试人员进行运行,不再需要测试人员与运维、开发进行配合,进行环境搭建与部署。
2)测试数据分离:在测试中,经常由于测试场景变换,需要修改依赖的数据库数据或者清空变动 memcache、Redis 中的缓存数据。Docker 相较于传统的虚拟机,更轻量与方便。可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行切换。
3)开发:开发人员共同使用同一个 Docker 镜像,同时修改的源代码都被挂载到本地磁盘。不再因为环境的不同而造成的不同程序行为而伤透脑筋,同时新人到岗时也能迅速建立开发、编译环境。
4)PaaS 云服务:Docker 可以支持命令行封装与编程,通过自动加载与服务自发现,可以很方便的将封装于 Docker 镜像中的服务扩展成云服务。类似像 Doc 转换预览这样的服务封装于镜像中,根据业务请求的情况随时增加和减少容器的运行数量,随需应变。
4. Docker的优缺点
优点:
1) Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
2) Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
3) 更快速的交付和部署,Docker允许开发者在装有应用和服务本地容器做开发,可以直接集成到可持续开发流程中。
4) 应用隔离,Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。
缺点:
1) Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。
2) 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。
3) 网络管理相对简单,主要是基于namespace隔离。
4) container随着用户进程的停止而销毁,container中的log等用户数据不便收集。
5) Docker对disk的管理比较有限。
5. Docker的三大核心
Docker的三大核心分别是镜像(Image)、容器(Container)、仓库(Repository)
镜像(Image)
Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像可以完全包含了Ubuntu操作系统环境,可以把它称作一个Ubuntu镜像。镜像也可以安装了Apache应用程序(或其他软件),可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础,通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像。用户可以从网上下载一个已经做好的应用镜像,并通过命令直接使用。
容器(Container)
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。每个容器看作一个简易版的Linux系统环境(包括了root用户权限、进程空间、用户空间和网络空间),以及与运行在其中的应用程序打包而成的应用盒子。
容器和镜像一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。
仓库(Repository)
仓库(Repository)Docker集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、Docker Pool等。
6. Docker的安装
(1)Docker版本
Docker的版本分为Docker CE 和Docker EE。Docker CE即社区版,免费使用,Docker EE
即企业版,强调安全,需要付费使用。
(2)在CentOS下安装Docker CE
在安装Docker前需要确保操作系统内核版本为 3.10以上,因此需要CentOS 7 ,CentOS 7内核版本为3.10。
安装步骤:
6.1 更新yum源,sudo yum -y update
6.2 卸载老版本的docker,sudo yum remove dokcer docker-common docker-selinux docker-enigne
6.3 安装需要的软件包,sudo yum install -y yum-untils device-mapper-persistent-data lvm2
6.4 添加docker-ce源信息,添加阿里云的源,sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6.5 将软件包添加至本地缓存,sudo yum makecache fast
6.6 安装docker-ce,sudo yum -y install docker-ce
6.7 启动docker服务,sudo service docker start
6.8 查看docker版本,sudo docker version
6.9 测试docker,以下命令在第一次安装会自动下载一个hello world docker镜像,若docker安装成功,会在控制台打印相应信息,sudo docker run hello-world
7. Docker的常用命令
(1)启动和关闭docker
启动:sudo service docker start
关闭:sudo service docker stop
(2)查看docker版本和系统信息
版本:sudo docker version
系统信息:sudo docker info
(3)查找和下载镜像
查找:sudo docker search 镜像名
下载:sudo docker pull 镜像名:版本 (版本默认是latest)
(4)查看和删除镜像
查看:sudo docker images
删除:sudo docker rmi 镜像名称/ID
(5)显示一个镜像的历史
sudo docker history 镜像名称/ID
(6)导入和导出镜像
导入:sudo docker load –i 文件路径
导出:sudo docker save –o 文件路径 镜像名称/ID
(7)查看正在运行的容器
sudo docker ps
(8)查看所有容器
sudo docker ps –a
(9)查看上一次启动的容器
sudo docker ps –l
(10)删除和批量删除容器
删除:sudo docker rm容器名称/ID
批量删除:sudo docker rm $(docker ps –a –q)
(11)启动和停止容器
启动:sudo docker start容器名称/ID
停止:sudo docker stop容器名称/ID
(12)杀死容器
sudo docker kill容器名称/ID
(13)查看容器日志
sudo docker logs –f 容器名称/ID
(14)查看容器里面被改变的文件或目录
sudo docker diff 容器名称/ID
(15)显示运行中的容器的进程信息
sudo docker top容器名称/ID
(16)重启容器
sudo docker restart 容器名称/ID
(17)把容器保存成镜像
sudo docker commit 镜像名称:版本
(18)进入一个容器,退出后容器停止
sudo dokcer attach容器名称/ID
(19)进入一个容器,退出后容器继续运行
sudo docker exec –it 容器名称/ID /bin/bash
8. Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
Dockerfile命令
FROM
格式:FROM <image>或 FROM <image>:<tag>
第一条指令必须为FROM指令,该命令定义了使用哪个基础镜像启动构建流程,基础镜像可以为任意镜像。
MANITAINER
格式:MAINTAINET <name>
这个命令用于声明作者,并应该放在FROM的后面。
RUN
格式:RUN <command>
RUN命令是Dockerfile执行命令的核心部分,它接受命令作为参数并用于创建镜像,每条指令将在当前镜像基础上执行,并提交为新的镜像。(可以用“\”换行)
COPY
格式:COPY 本机路径 容器路径
复制本地主机的文件到容器中的某个路径,当使用本地目录为源目录时,推荐使用COPY。
ENV
格式:ENV <key> <value>
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。
VOLUME
格式:VOLUME ["path"] 。
VOLUME命令用于让你的容器访问宿主机上的目录
WORKDIR
格式:WORKDIR /path/to/workdir
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
EXPOSE
格式:EXPOSE <port>
为容器指定端口,在容器启动时需要通过 -p 做端口映射
ONBUILD
格式:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
CMD
格式:CMD ["","",""]
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条指令,则最后一条执行。(会被启动时指定的命令覆盖)
生成镜像
在构建好Dokcerfile后,需要通过build命令来生成镜像
sudo docker build –t=”镜像名称/版本” Dockerfile的路径
运行容器
生成镜像后,可以通过docker run命令启动容器
sudo docker run –it 镜像名称/ID
9. Dockerfile示例
以ubantu为基础镜像安装python3和pip3
Dokcerfile:
FROM ubuntu:xenial-20180412
MAINTAINER smlxs
RUN rm -f /etc/apt/sources.list
COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 --no-cache-dir install --upgrade pip
第一行:以ubuntu:xenial-20180412为基础镜像
第二行:声明作者信息
第三行:把容器里面apt下的sources.list删掉
第四行:把当前目录下的sources.list复制到容器中apt目录下,第三第四行是为了把apt-get源改成过内的源
第五行:更新apt-get并安装python3和pip3
第六行:更新pip3
sources.list:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
把sources.list和Dockerfile放在同一个目录下,然后执行以下命令:
生成镜像:sudo docker build –t=”ubuntu_python3” .
生成镜像后可以通过sudu docker images ubuntu_python3查看镜像信息
启动容器:sudo docker run –it ubuntu_python3