保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
docker简介
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容 器。
Docker 和传统虚拟化方式的不同之处在于传统虚拟机技术是虚拟出一套硬件 后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程 直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比 传统虚拟机更为轻便。
基本概念
Docker 包括三个基本概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker 镜像
对Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系 统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文 件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 容器
镜像( Image )和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安 全。
Docker 仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker仓库就是这样的服 务。
一个 Docker Registry 中可以包含多个仓库( ( Tag );每个标签对应一个镜像。
以 Ubuntu 镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如, 14.04,16.04。我们可以通过ubuntu:14.04 ,或者 ubuntu:16.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为ubuntu:latest 。
安装docker
Contos
Docker官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
1 | $ curl -fsSL get.docker.com -o get-docker.sh |
启动 Docker CE
1 | $ sudo systemctl enable docker |
Mac
使用 Homebrew 安装
1 | brew cask install docker |
手动下载安装
Stable版:https://download.docker.com/mac/stable/Docker.dmg
使用镜像
从 Docker 镜像仓库获取镜像的命令是docker pull。其命令格式为:
1 | docker pull [选项] [DockerRegistry地址[:端口号]/]仓库名[:标签] |
- Docker 镜像仓库地址:地址的格式一般是<域名/IP>[:端口号] 。默认地址是 DockerHub。
- 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名> Hub,如果不给出用户名,则默认为 library ,也就是官方镜像
例如:
1 | docker pull ubuntu:16.04 |
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名 称是 ubuntu:16.04 ,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。
运行
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。
1 | $ docker run -it --rm ubuntu:16.04 bash |
docker run 就是运行容器的命令
- -it:这是两个参数,一个是 -i :交互式操作,一个是 -t 终端
- –rm:这个参数是说容器退出后随之将其删除
- bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,
进入容器后,我们可以在Shell下操作,执行任何所需的命令。我们可以通过exit退出这个容器。
列出镜像
要想列出已经下载下来的镜像,可以使用
1 | $ docker image ls |
删除本地镜像
1 | $ docker image rm [选项] <镜像1> [<镜像2> ...] |
例如
1 | docker image rm 501ad78535f015 //通过镜像id删除 |
操作 Docker 容器
容器是 Docker 又一核心概念。容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可 以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态 ( stopped )的容器重新启动。
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
新建并启动
命令主要为 docker run
下面的命令输出一个 “Hello World”,之后终止容器。
1 | $ docker run ubuntu:14.04 /bin/echo 'Hello world' |
下面的命令则启动一个 bash 终端,允许用户进行交互
1 | $ docker run -t -i ubuntu:14.04 /bin/bash |
其中, -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
当利用docker run来创建容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
启动已终止容器
可以利用docker container start 命令,直接将一个已经终止的容器启动运行。
后台运行
通过添加 -d 参数来实现。
容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。
终止容器
可以使用 docker container stop来终止一个运行中的容器。
进入容器
在使用 参数时,容器启动后会进入后台。
进入容器进行操作使用 docker exec命令
docker exec后边可以跟多个参数
只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。 当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux命令提示符
删除容器
可以使用 docker container rm 来删除一个处于终止状态的容器。例如
1 | $ docker container rm |
如果要删除一个运行中的容器,可以添加-f参数。Docker 会发送SIGKILL信号给容器。
清理所有处于终止状态的容器
用docker container ls -a命令可以查看所有已经创建的包括终止状态的容器,如果数量太 多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
1 | $ docker container prune |