Docker基础篇(上篇)

Docker简介

Docker是什么

Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行。”Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

下载地址

docker官网: http://www.docker.com
docker中文网站: https://www.docker-cn.com

Docker安装

Docker基本组成

在安装之前让我们先看下Docker的基本组成

  1. 镜像(image)
    Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。(好比面向对象编程中的类与对象的关系,一个类可以创建多个对象)。
  2. 容器(container)
    Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
    它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
    可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
    容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
  3. 仓库(repository)
    仓库(Repository)是集中存放镜像文件的场所。
    仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
    仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    最大的公开仓库是 Docker Hubhttps://hub.docker.com存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。

    Docker的架构图

CentOS7下安装Docker

官网的安装步骤:https://docs.docker.com/install/linux/docker-ce/centos/

以下命令都是在root用户下执行,如果你不是root用户,命令前加 sudo

  1. 首先确认你是CentOS7及以上版本
1
cat /etc/redhat-release
  1. yum安装gcc相关(如果有则跳过此步,一般系统都会有C++编译环境)
    ==确保centos7能上外网==
1
yum -y install gcc
1
yum -y install gcc-c++
  1. 卸载旧版本(第一次安装此步骤跳过)
1
yum -y remove docker docker-common docker-selinux docker-engine
  1. 安装需要的软件包
1
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置stable镜像仓库
    ==此处一定要使用阿里云镜像,否则会很慢很慢!==
1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 更新yum软件包索引
1
yum makecache fast
  1. 安装docker ce
1
yum install docker-ce docker-ce-cli
  1. 启动测试Docker

启动:

1
systemctl start docker

查看版本:

1
docker version

永远的hello world

1
docker run hello-world

Docker安装已经完成,接下来我们不着急使用,先配置阿里云镜像加速,否则之后拉取镜像会很慢。

配置镜像加速

  1. 首先在etc目录下新建docker文件夹
    1
    mkdir -p /etc/docker
  2. 建立daemon.json文件
    1
    vim  /etc/docker/daemon.json
    阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    在你的daemon.json里添加(此处添加你的加速器地址)
1
2
3
{
"registry-mirrors": ["https://*******.mirror.aliyuncs.com"]
}
  1. 重启服务
    1
    2
    systemctl daemon-reload
    systemctl restart docker
    以上是你的Docker版本较新时配置,如果你的版本较旧参考:https://developer.aliyun.com/article/29941

卸载Docker

  1. 停止Docker
1
systemctl stop docker 
  1. 卸载Docker软件包
1
yum remove docker-ce docker-ce-cli
  1. 删除所有图像,容器和卷
1
rm -rf /var/lib/docker

Docker底层原理

前面我们已经安装完毕Docker,接下来让我们更深的了解Docker。

Docker是怎么工作的

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

为什么Docker比较比VM快

  1. docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

  2. docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

Docker常用命令

以下我们介绍Docker的常用命令。

帮助命令

Docker版本:

1
docker version

Docker信息:

1
docker info

Docker命令帮助:

1
docker --help

镜像命令

1.列出本地主机上的镜像

1
docker images [OPTIONS]

OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID
–digests :显示镜像的摘要信息
–no-trunc :显示完整的镜像信息

各个选项说明:

选项 说明
REPOSITORY 表示镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你要使用 centos,docker 将默认使用 centos:latest 镜像

2.搜索某个镜像

1
docker search [OPTIONS] 镜像名字

OPTIONS说明:

1
2
3
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像。
--automated : 只列出 automated build类型的镜像

3.下载镜像

1
docker pull 镜像名字[:TAG]

4.删除镜像

删除单个

1
docker rmi  -f 镜像ID

删除多个

1
docker rmi -f 镜像名1:TAG 镜像名2:TAG 

删除全部

1
docker rmi -f $(docker images -qa)

5.提交容器使之成为一个新的镜像

1
docker commit -m=“提交的描述信息” -a=“作者” <容器ID>  要创建的目标镜像名:[TAG]

容器命令

有镜像才能创建容器,这是根本前提

1.新建并启动容器

1
docker run -it centos /bin/bash

使用镜像centos以交互模式启动一个容器,在容器内执行/bin/bash命令。

OPTIONS说明
–name=”容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
   ip:hostPort:containerPort
   ip::containerPort
   hostPort:containerPort

2.退出容器
方式一:容器停止退出

1
exit

方式二:容器不停止退出
ctrl+P+Q

3.列出当前所有正在运行的容器

1
docker ps [OPTIONS]

OPTIONS说明(常用):

1
2
3
4
5
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出。

4.启动已停止的容器

1
docker start 容器ID或者容器名

5.重启容器

1
docker restart 容器ID或者容器名

6.停止容器

1
docker stop 容器ID或者容器名

7.强制停止容器

1
docker kill 容器ID或者容器名

8.删除已停止的容器

1
docker rm 容器ID

9.查看容器日志

1
docker logs -f -t --tail 容器ID
1
2
3
-t 是加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条

10.查看容器内运行的进程

1
docker top 容器ID

11.查看容器内部细节

1
docker inspect 容器ID

12.进入==正在运行==的容器并以命令行交互
方式一:

1
docker exec -it 容器ID /bin/bash

方式二:

1
docker attach 容器ID

上述两个的区别:
exec 是在容器中打开新的终端,并且可以启动新的进程,如果从这个容器退出,不会导致容器的停止

attach 直接进入容器启动命令的终端,不会启动新的进程,如果从这个容器退出,会导致容器停止

13.从容器内拷贝文件到主机上

1
docker cp  容器ID:容器内路径 目的主机路径

以上就是一些常用命令,更多命令可以参考官网https://docs.docker.com/reference/

Docker 镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

为什么 Docker 镜像要采用这种分层结构呢
最大的一个好处就是 - 共享资源

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

有什么不足之处请多指教,博主一定会及时更改。

评论