Docker介绍与使用

一、基本介绍

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 使用 Linux 内核功能(如命名空间和控制组)在操作系统之上创建容器。因此开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
  虚拟机也是一种虚拟化技术,它是通过Hypervisor(虚拟机管理系统)模拟硬件(网卡、cpu、内存等硬件),并在硬件上安装操作系统来实现。每个虚拟机是个独立的操作系统,拥有自己的系统内核。而容器是应用程序层上的虚拟,直接使用宿主机的硬件资源,利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。因此Docker与虚拟机相比,在启动速度、资源占用、性能损耗等方面更占优势。

在这里插入图片描述

Docker的优缺点

优点:
  • 更快速的交付与部署,Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署。
  • Docker 容器创建是秒级别的, Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。
  • 高可用和可恢复性。
  • 更高效的虚拟化,占用的资源少,对系统的利用率高。
  • 跨平台可移植性。
  • 版本控制方面,能够很方便地追踪、查询、记录版本信息和回滚版本等。
缺点:
  • Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。
  • 系统的Linux内核必须是3.8或者更高,内核支持Device Mapper,AUFS,VFS,btrfs等存储格式。
  • 内核必须支持cgroups和命名空间。
  • Docker属于进程之间的隔离,隔离性较弱。
  • Docker的安全性相对虚拟机较弱,没有任何形式的硬件隔离。

二、Docker的组成

  Docker是C/S(客户端client-服务器server)架构模式,Docker的核心组件包括:

  • Docker Client
  • Docker daemon
  • Docker Image
  • Docker Registry
  • Docker Container

在这里插入图片描述

Docker Client

  Docker Client ,即Docker 客户端,它其实就是 Docker 提供命令行界面 (CLI) 工具,是用户与 Docker 进行交互的主要方式。通过客户端,我们可以去构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。

Docker daemon

  Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,也把它称为守护进程。它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过Docker daemon 内部的一个路由分发调度,由具体的函数来执行请求。

Docker Image

  Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。
  Docker 有一个用于构建镜像的概念—— Dockerfile 。Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile从一个基础镜像上快速创建自定义的镜像。Dockerfile 基本上就是一个文本文件,每一行包含一个命令。Docker 镜像是用分层的方式来组织的。Dockerfile 上的每条指令都会在镜像中添加一个图层。镜像层都是只读的,而从镜像创建启动容器时,会在镜像的最上层添加一层可读可写的容器层,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

在这里插入图片描述

在这里插入图片描述

  镜像分层最大的一个好处就是资源共享,比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

注:对于docker镜像分层的概念,可以参考Docker 从入门到精通中的"8 Docker中的镜像分层"中的解释说明。

Docker Registry

  Docker registry 是存储 docker image 的仓库,仓库分共有和私有两种。Docker公司自己提供了最大的公有仓库Docker Hub,可以在Docker Hub上创建账户,保存分享自己创建的镜像。通过docker命令,我们可以很轻松地拉取和提交远程仓库上的镜像,类似于git操作。
  通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Container

  Docker 容器就是 Docker 镜像的运行实例,一个镜像可以实例化多个容器。Docker容器是真正运行项目程序、消耗系统资源、提供服务的地方。容器启动后,Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台。

三、Docker的安装

  Docker从17.03版本之后分为CE(Community Edition: 社区版)和EE(Enterprise Edition: 企业版)。相对于社区版本,企业版本强调安全性,但需付费使用。这里我们使用社区版本即可。Docker官方和国内daocloud都提供了一键安装的脚本,使得Docker的安装更加便捷。

官方的一键安装方式:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
国内 daocloud一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh

执行上述任一条命令,耐心等待即可完成Docker的安装。若提示curl不存在,则使用以下命令进行安装curl:

sudo apt install curl

安装成功后,可以在终端输入 docker -v 命令查看当前安装docker版本号:

在这里插入图片描述

手动安装的详细流程可以参考以下链接:Linux安装Docker完整教程

四、Docker的常用命令

1、Docker用户权限处理

由于docker进程使用Unix Socket而不是TCP端口,而默认情况下,Unix socket属于root用户,需要root权限才能访问。因此我们在执行docker命令时,可以通过以下两种方式解决无权限问题:

解决方法1:

使用sudo获取管理员权限,运行docker命令,如sudo docker ps。

解决方法2:

docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令。

//添加docker用户组
sudo groupadd docker     

//将当前登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker

//更新用户组    
newgrp docker

//测试docker命令是否可以正常使用       
docker ps     

2、镜像操作命令

2.1、列出本地镜像列表

使用docker images命令可以列出本地主机上的镜像列表,可以在命令后面加上指定的REPOSITORY:TAG来输出对应的镜像文件信息。并且docker image ls和docker image list命令的格式功能,和docker images命令完全相同,也可以输出本地镜像列表。

docker images [OPTIONS] [REPOSITORY[:TAG]]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

各个字段说明:
  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签,用来区分同一仓库源的不同个版本
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小
2.2、搜索镜像

使用docker search命令可以从官方的镜像仓库中搜索特定的镜像并显示出来,TERM表示我们要查询的关键字,即镜像仓库源名字。

docker search [OPTIONS] TERM

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

各个字段说明:
  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思
  • AUTOMATED: 是否自动构建。
2.3、拉取下载镜像

使用docker pull命令可以拉取远程仓库中的镜像,需要指定镜像名称NAME,若指定镜像TAG,则拉取镜像对应TAG的版本,若未指定,则默认拉取latest标签(即最新发行版本)的镜像版本。镜像TAG标签版本可以通过Docker Hub进行搜索查看。

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

docker pull命令默认从Docker Hub中获取镜像,也可以手动指定要拉取的镜像注册中心路径。例如,如果已经设置了一个本地注册中心,就可以指定本地注册中心的路径。注册中心路径类似于URL,但不包含协议说明符(https://)。下面的命令从监听5000端口(myregistry.local:5000)的本地注册中心中获取testing/test-image映像:

docker pull myregistry.local:5000/testing/test-image

拉取指定镜像版本也可以通过使用DIGEST来实现,即先获取到镜像指定版本的DIGEST摘要值,然后使用如下命令拉取即可:

docker pull ubuntu@sha256:1e32b9c52e8f22769df41e8f61066c77b2b35b0a423c4161c0e48eca2fd24f75
2.4、删除镜像

使用docker rmi命令删除指定镜像,若指定TAG,则删除指定TAG对应的镜像版本,若未指定TAG,则默认删除latest标签的镜像版本。

docker rmi [OPTIONS] IMAGE [IMAGE...]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

2.5、获取镜像元数据

使用docker inspect命令可以用来获取Docker镜像或者Docker容器的元数据,将以 json 格式返回,其中包括该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。若使用该命令来获取镜像元数据时,可以传入 镜像名:TAG 或镜像ID;若用来获取容器元数据,则可以传入容器名或容器ID。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

在这里插入图片描述

2.6、保存镜像

使用docker save命令可以导出镜像到本地文件,该命令支持-o参数,导出镜像到指定的文件中。

docker save [OPTIONS] IMAGE [IMAGE...]

命令具体说明如下:

在这里插入图片描述

示例:

docker save -o target.tar image_name:tag 

还可以采用以下方式,来将指定镜像保存到指定文件中:

docker save image_name:tag > target.tar
2.7、加载镜像

使用 docker load 命令,可以将使用docker save命令保存的tar文件再导入到本地镜像库。支持-i选项,从指定文件中读入镜像内容。这将导入镜像以及相关的元数据信息(包括标签)。导入成功后,可以使用docker images命令进行查看,和原镜像一致。

docker load [OPTIONS]

命令具体说明如下:

在这里插入图片描述

示例:

docker load -i target.tar

还可以采用以下方式,来从指定文件中导入镜像:

docker load < target.tar

3、容器操作命令

3.1、创建并运行容器

使用docker run命令可以从指定镜像版本创建一个容器并运行,并且支持许多选项来对容器进行配置。运行容器时,还可以传入COMMAND和ARG来指定容器要运行的程序、脚本以及对应的参数。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

命令具体说明如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

主要Options说明:

Options 描述
-d 指定容器运行于前台还是后台,默认为false
-i 以交互模式运行容器,通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-w path 指定容器的工作目录为path,路径不存在则会自动创建
-P 随机端口映射,容器内部端口随机映射到主机的端口(49153起始,49153到65535)
-p 6080:80 指定端口映射,格式:主机(宿主)端口:容器端口
–name NAME 为容器指定名称为NAME
–dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致
-e something=something 指定环境变量,容器中可以使用该环境变量
-h HOSTNAME 指定容器的hostname
-m BYTES 设置容器使用内存最大值BYTES
–net=bridge 指定容器的网络连接类型,支持 bridge/host/none/container四种类型
–privileged=true 开启特权模式,这种模式下容器对docker宿主机拥有root访问权限,允许我们以其宿主机具有(几乎)所有能力来运行容器,包括一些内核特性和设备访问。
-v 给容器挂载存储卷,挂载到容器的某个目录,格式为 宿主目录:容器目录

示例:

docker run  -itd  -p 6080:80 -v /dev:/dev -e DISPLAY=localhost:10.0 --net bridge --privileged=true --name ubuntu-demo -w /home/ubuntu/ ubuntu:18.04

上述命令的含义是:

1)-itd : 以交互模式启动一个容器,并指定为后台运行;
2)-p 6080:80 : 将宿主机的6080端口映射到容器的80端口上;
3)-v /dev:/dev : 将宿主的/dev目录挂载到容器的/dev目录;
4)-e DISPLAY=localhost:10.0 : 设置容器的环境变量DISPLAY值;
5)–net bridge : 网络采用bridge模式;
6)–privileged=true : 开启特权模式;
7)–name ubuntu-demo : 设置容器的名称为ubuntu-demo;
8)-w /home/ubuntu/ : 设置容器的工作目录为/home/ubuntu;
9)ubuntu:18.04 : 指定的镜像版本。
3.2、查看容器

使用docker ps命令,可以列举出正在运行的容器,添加-a选项,能够列举所有容器,包括未运行的。

docker ps [OPTIONS]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

各个字段说明:
  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 当前容器状态,包括以下几种状态:1、created(已创建);2、restarting(重启中);3、running(运行中);4、removing(迁移中);5、paused(暂停);6、exited(停止);7、dead(死亡)。
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES: 容器名称,创建时可以指定,否则会自动分配。
3.3、停止容器

使用docker stop命令可以停止一个运行中的容器,若容器未在运行,也不会报错。可以通过传入容器ID或容器名称来停止对应容器。

docker stop [OPTIONS] CONTAINER [CONTAINER...]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

3.4、启动容器

使用docker start命令可以启动一个未在运行状态的容器。CONTAINER可以传入容器ID或容器名称。

docker start [OPTIONS] CONTAINER [CONTAINER...]

命令具体说明如下:

在这里插入图片描述

示例:

docker start container_name
3.5、重启容器

使用docker restart命令可以重启容器。CONTAINER可以传入容器ID或容器名称。当容器处于停止状态时,docker restart命令实现的效果与docker start命令相同,都是启动容器;当容器处于运行状态时,docker restart命令会使容器重新启动,而docker start命令对于一个正在运行的容器无效果,通过docker ps命令查看正在运行的容器在使用docker start命令前后的状态,可以发现STATUS无变化,而使用docker restart命令后,STATUS显示的运行时间会重新计算。

docker restart [OPTIONS] CONTAINER [CONTAINER...]

命令具体说明如下:

在这里插入图片描述

示例:

docker restart container_name
3.6、删除容器

使用docker rm命令可以删除容器,若容器处于运行状态,则会删除失败报错。通过添加-f选项,可以强制删除处于运行状态下的容器。CONTAINER可以传入容器ID或容器名称。

docker rm [OPTIONS] CONTAINER [CONTAINER...]

命令具体说明如下:

在这里插入图片描述

示例:

docker rm container_name
3.7、进入容器正在执行的终端

使用docker attach命令,能够进入到运行中的容器正在执行的终端,支持多个窗口同时attach到同一个容器,此时在单个窗口进行的全部操作,都会在所有窗口同步显示;而当某个窗口因命令阻塞,其他窗口也无法操作。进入容器后,可以通过exit命令退出,但是如果从这个容器退出,会导致容器的停止。

docker attach [OPTIONS] CONTAINER

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

说明:从上图中可以看到,在两个终端中,分别使用docker attach命令进入容器内的终端,在单个终端上的操作都会在另一个终端上同步显示,若使用exit命令退出容器后,该容器就会从UP运行状态转变为Exited停止状态。

3.8、在运行的容器中执行命令

使用docker exec命令,可以在运行的容器中额外启动新的进程去执行指定命令,在容器内运行的进程包括两种类型:后台任务和交互式任务。可以通过使用-i -t选项执行交互式任务,使用-d选项执行后台任务,COMMAND [ARG…]传入需要执行的命令或程序及对应参数。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

命令具体说明如下:

在这里插入图片描述

示例:

在这里插入图片描述

说明:从上图中可以看到,通过-i -t选项执行/bin/bash,即采用交互模式启动了一个新的终端,此时可以进入容器中进行操作,使用exit命令退出容器,使用这种方式退出容器并不会导致容器停止。

3.9、容器与宿主机之间的数据拷贝

使用docker cp命令,可以实现容器与宿主机之间的数据拷贝,即使此时容器没有运行,也可以进行拷贝,若拷贝的内容有重复,会直接覆盖,不会询问。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

命令具体说明如下:

在这里插入图片描述

示例:

//从容器container_name拷贝文件到宿主机
docker cp container_name:/home/test.txt /home/test.txt
//从宿主机拷贝目录到容器中
docker cp /home/dir container_name:/home/
3.10、导出容器

使用docker export命令,可以将容器的文件系统打包成tar归档文件导出,容器可以不需要处于运行状态。使用-o选项可以将内容写到指定文件中,而不是输出到STDOUT。

docker export [OPTIONS] CONTAINER

命令具体说明如下:

在这里插入图片描述

示例:

docker export -o target.tar container 

还可以采用以下方式,来将指定容器保存到指定文件中:

docker export container > target.tar
3.11、从归档文件导入镜像

使用docker import命令,可以从归档文件中创建镜像。docker import 命令的相对应的命令为 docker export,即用来将docker export命令导出的tar文件还原为指定名称和TAG的镜像。若不指定镜像名称,则导入的镜像名称为none,只能通过IMAGE_ID进行操作。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

命令具体说明如下:

在这里插入图片描述

示例:

docker import target.tar image_name:tag

save/load 与 export/import命令的区别:

  • docker export保存的是容器快照,不是镜像本身,将丢弃所有的历史记录和元数据信息,也就是没有层(layer),仅保存容器当时的快照状态,而docker save保存的是镜像,会保存完整记录,体积也会更大。
  • docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像。
  • docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
3.12、从归档文件导入镜像

使用docker commit命令,可以将容器相对于镜像的改变保存为新的图层,与原镜像的图层叠加,保存为新的镜像,即将当前容器层加到原镜像层的最上层,保存为一个新镜像。使用这个命令,我们可以基于现有镜像,配置构建一个新镜像。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

命令具体说明如下:

在这里插入图片描述

OPTIONS说明:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

示例:

在这里插入图片描述

可以使用docker history命令查看这个镜像的创建历史:

在这里插入图片描述

参考

  1. 什么是 Docker?
  2. Docker 教程 | 菜鸟教程
  3. docker:镜像命令
  4. Docker命令详解(run篇)

猜你喜欢

转载自blog.csdn.net/weixin_56291477/article/details/130431310