Docker文档
MacOS安装Docker官方指南
Linux安装Docker安装指南
基本概念
什么是容器?
- 容器是一个标准的软件单元,将代码及其所有依赖关系打包成标准化单元,用于开发,装运和部署,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境。容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。
- 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
什么是虚拟机?
虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。虚拟机管理程序允许多台虚拟机在一台计算机上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。
容器和虚拟机的区别
容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。容器更便携,更高效。
什么是Docker?
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup(用来限制,控制与分离一个进程组群的CPU、内存、磁盘输入输出等资源),namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。
- 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
- Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
- Docker的技术是独一无二的,因为它专注于开发人员和系统操作员将应用程序依赖性与基础架构分离的要求。
什么是容器化?
- 容器化,又称为操作系统级虚拟化,是指操作系统功能,其中内核允许存在多个隔离的用户空间实例。这样的实例,称为容器,[1]分区,虚拟环境(VE)或监狱(FreeBSD jail或chroot jail),从其中运行的程序的角度看,可能看起来像真正的计算机。
- 在普通操作系统上运行的计算机程序可以查看所有资源(连接的设备,文件和文件夹,网络共享该计算机的CPU功率,可量化的硬件功能)。但是,在容器内运行的程序只能看到容器的内容和分配给容器的设备。
什么是Docker镜像?
- Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
- 。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
- 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Docker容器与镜像的关系
-
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
-
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
-
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
-
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
什么是仓库?
-
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
-
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
-
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
容器操作
- 容器类似于虚拟机,有自己的网络环境,有些端口只是容器开放的端口,并不是本地宿主机的端口,所以我们无法通过宿主机的端口去访问容器。如果想要访问成功,则需要将容器开放端口,映射到本地宿主机端口,再通过映射的宿主机端口访问。
- docker container stop goofy_yonath 通过该命名来停止容器的运行。我们在查询领命中添加 -a 来查询所有容器,包括停止的:
命令
具体命令参数及使用
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
- -d, --detach=false -----------指定容器运行于前台还是后台,默认为false
- -i, --interactive=false -----------打开STDIN,用于控制台交互
- -t, --tty=false -----------分配tty设备,该可以支持终端登录,默认为false
- -u, --user=“” ----------- 指定容器的用户
- -a, --attach=[] -----------登录容器(必须是以docker run -d启动的容器)
- -w, --workdir=“” ----------- 指定容器的工作目录
- -c, --cpu-shares=0 -----------设置容器CPU权重,在CPU共享场景使用
- -e, --env=[] ----------- 指定环境变量,容器中可以使用该环境变量
- -m, --memory=“” ----------- 指定容器的内存上限
- -P, --publish-all=false ----------- 指定容器暴露的端口
- -p, --publish=[] -----------指定容器暴露的端口
- -h, --hostname=“” -----------指定容器的主机名
- -v, --volume=[] ----------- 给容器挂载存储卷,挂载到容器的某个目录
- –volumes-from=[] -----------给容器挂载其他容器上的卷,挂载到容器的某个目录
- –cap-add=[] -----------添加权限,权限清单详见:权限清单
- –cap-drop=[] -----------删除权限,权限清单详见:权限清单
- –cidfile=“” ----------- 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
- –cpuset=“” ----------- 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
- –device=[] -----------添加主机设备给容器,相当于设备直通
- –dns=[] ----------- 指定容器的dns服务器
- –dns-search=[] -----------指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
- –entrypoint=“” -----------覆盖image的入口点
- –env-file=[] ----------- 指定环境变量文件,文件格式为每行一个环境变量
- –expose=[] -----------指定容器暴露的端口,即修改镜像的暴露端口
- –link=[] ----------- 指定容器间的关联,使用其他容器的IP、env等信息
- –lxc-conf=[] -----------指定容器的配置文件,只有在指定–exec-driver=lxc时使用
- –name=“” ----------- 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
- –net=“bridge” -----------容器网络设置:
-
bridge 使用docker daemon指定的网桥
-
host //容器使用主机的网络
-
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
-
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
- –privileged=false -----------指定容器是否为特权容器,特权容器拥有所有的capabilities
- –restart=“no” ----------- 指定容器停止后的重启策略:
-
no:容器退出时不重启
-
on-failure:容器故障退出(返回值非零)时重启
-
always:容器退出时总是重启
- –rm=false ----------- 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
- –sig-proxy=true ----------- 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-
后台启动一个镜像并指定要映射的宿主机端口。
docker run -d -p 宿主机端口:容器端口+镜像
-
查看正在运行的容器
docker ps
-
查询所有容器,包括停止运行的容器
docker ps -a
-
停止运行一个容器
docker container stop +容器id
-
删除某一个容器
docker container rm +容器id
-
查询本地镜像
docker images
-
docker后面可以加的命令
Commands:
build -------从Dockerfile中构建一个镜像.
history -------展示一个镜像的历史.
import -------从tarball中导入内容来创建文件系统镜像.
inspect -------显示一个或多个镜像的详细信息.
load -------从tar压缩包或STDIN加载镜像.
ls -------列出本地镜像.
prune -------删除未使用的镜像.
pull -------从注册表中提取仓库或者镜像.
push -------将镜像或仓库推送到注册表.
rm -------删除一个或更多的镜像.
save -------将一个或多个镜像保存到tar存档(默认情况下流到STDOUT)。.
tag -------创建一个引用SOURCE_IMAGE的标签TARGET_IMAGE
docker的网络模式
我们使用docker run创建容器时,可以使用–net选项指定容器的网络模式,docker一共有4中网络模式:
-
bridge模式,–net=bridge(默认)。
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:
-
host模式,–net=host。
这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
-
container模式,–net=container:NAME_or_ID。
这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。
- none模式,–net=none。
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以