Docker第一篇:简介和入门安装

Docker简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

DOCKER的组成

虚拟机、容器和镜像

虚拟机:虚拟机在本质上就是在模拟一台真实的计算机设备,同时遵循同样的程序执行方式。虚拟机能够利用“虚拟机管理程序”运行在物理设备之上。反过来,虚拟机管理程序则可运行在主机设备或者“裸机”之上。

主机虚拟机管理程序运行在主机设备的操作系统之上。举例来说,一台运行有OS X的计算机可以在操作系统之上安装虚拟机(例如VirtualBox或者VMware Workstation 8)。该虚拟机并不会直接访问硬件,因此其需要经由主机操作系统(也就是Mac OS X)实现资源获取。

优势:其基本摆脱了对底层硬件的要求。该主机操作系统负责提供硬件驱动程序,而非由虚拟机管理程序自身提供,因此我们认为其具备更理想的“硬件兼容性”。
缺点:这种介于硬件与虚拟机管理程序之间的额外层会带来更多资源消耗,进而降低虚拟机性能表现。

容器:容器通过对“用户空间”的抽象化处理提供操作系统层级的虚拟化机制。

出于各种考量与需求,容器在外观上与虚拟机非常相似。容器会把应用直接运行在宿主机的内核中,这样会比虚拟机有更好的性能。
和虚拟机的共同点:二者皆拥有专有处理空间、能够作为root执行命令、提供专有网络接口与IP地址、允许定制化路由及iptable规则,且可启动文件系统等等。
容器与虚拟机间的最大区别:虚拟机单独使用自己的内核,而各容器系统共享主机系统的内核。默认情况下,容器和宿主机是完全隔离的,最多也只会在配置了的情况下,使用宿主机的hosts文件和端口。
优势:性能优越,因为虚拟机只能通过hypervisor(超级监督者)来间接的使用宿主机资源的虚拟权限。容器可以获得原生的资源使用权限,每个都运行在独立的进程中,不需要额外的内存。

镜像:是轻量的,独立的,可执行的包。镜像属于只读模板,大家可以借此配合Dockerfile中的编写指令集进行容器构建。镜像定义了打包的应用程序以及其相关依赖。这些依赖就好像是其启动时需要运行的进程。

Docker镜像利用Dockerfile实现构建。Dockerfile中的每条指令都会在镜像中添加一个新的“层”,这些层则表现为镜像文件系统中的一个分区——我们可以对其进行添加或者替换。层概念正是Docker轻量化的基础。Docker利用一套Union
File System建立起这套强大的结构:

Docker为基于Linux容器的开源项目,其利用Linux内核中的各项功能——例如命名空间与控制组——以在操作系统之上创建容器,提供对应的底层Linux系统视图,同时也实现了系统隔离:即限制容器的查看与访问范畴。

容器概念并不是什么新鲜事物; 谷歌公司多年来一直在使用自己开发的容器技术。其它Linux容器技术方案还包括Solaris Zones、BSD jails以及LXC,且其都已经拥有多年的发展历史。

####概述
从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统视角。例如一个ubuntu:14.04的镜像,提供了一个基本的ubuntu:14.04的发行版,当然此镜像是不包含操作系统Linux内核的。

说到此,可能就需要注意一下,linux内核和ubuntu:14.04Docker镜像的区别了。传统虚拟机安装ubuntu:14.04会包含两部分,第一,某一个Linux内核的发行版本,比如Linux 3.8版本的内核;第二,第一个特定的Ubuntu发行版,这部分内容不包含Linux内核,但是包含Linux之外的软件管理方式,软件驱动,如apt-get软件管理包等。

理解以上内容之后,就可以理解,为什么在一个Linux内核版本为3.8的ubuntu:14.04基础上,可以把Linux内核版本升级到3.18,而ubuntu的版本依然是14.04。最主要的就是:Linux内核版本与ubuntu操作系统发行版之间的区别。

####缺点以及安装必备要求
安装docker的先决条件:

  1. 必须是64位CPU架构的计算机,Docker目前不支持32位CPU;
  2. 运行Linux3.8或更高版本内核,CentOS时内核必不小于3.10;
  3. 内核必须支持一种合适的存储驱动,可以是Device Manager、AUFS、vfs、btrfs、以及默认的驱动Device Mapper中的一个;
  4. 内核必须支持并开启cgroup和命名空间namespace功能。

安装常见的情况:
linux安装,window和mac安装可以参考官网的版本安装指导

window最新版本下载[2017-11-9的版本]
https://download.docker.com/win/stable/Docker for Windows Installer.exe

其他容器

容器运行时是执行容器并在节点上管理容器镜像的软件,目前,最广为人知的容器运行时是Docker,但在生态系统中还有其他容器运行时软件,比如Rkt、Containerd和Lxd,Docker实现在于Kubernetes环境中使用。

DOCKER架构及相关概念

从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

####Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

运行和交互模式
1、Docker守护进程
Docker守护进程运行在一台主机上,用户不直接和守护进程交互,而是通过Docker客户端交互.
2、Docker客户端
Docker客户端,实际是Docker的二进制程序,是主要的用户与Docker的交互方式。它接收用户指令,并与背后的Docker守护进程交互,如此来回往复.

容器与镜像的关系类似于面向对象编程中的对象与类。

|Docker |面向对象|
|-- -|- -|
|容器| 对象|
|镜像| 类|

Docker第一篇:简介和入门安装_第1张图片

|概念|说明
|-- -|- -|
|Docker 镜像(Images)|Docker 镜像是用于创建 Docker 容器的模板。
|Docker 容器(Container)|容器是独立运行的一个或一组应用。
|Docker 客户端(Client)|Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
|Docker 主机(Host)|一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
|Docker 仓库(Registry)|Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
|Docker Machine|Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

基础环境准备

VM12.0创建的虚拟机模拟真实环境
操作系统:centos7.0
安装方式:更新yum镜像库使用最新镜像文件安装

centos7安装步骤

安装前的准备工作

Docker 需要安装在64位系统的CentOS上,而且linux内核至少在3.10版本以上,这个版本的内核在CenOS7上运行. 所以只要安装一个CenOS7 64位的系统就可以了.作为学习,大家只需安装个虚拟机就OK.
可以通过uname -r 来查看linux内核版本

1、用一个用户登录你的机器,这个用户必须拥有sudo或root权限.
2、为了确保你的yum包是最新的,用下面脚本做下更新.

安装yum-config-manager修改yum的资源地址为国内

yum-config-manager: command not found问题
系统默认没有安装这个命令,这个命令在yum-utils 包里,
可以通过命令安装就可以了

yum -y install yum-utils 

强烈建议使用国内源,官方源请在注释中查看。
方式1:执行下面的命令添加ustc的yum 软件源:

$ sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

方式2:一键设置阿里云的资源地址
添加阿里云的Docker仓库:(如果虚拟机不能够连互联网可尝试自己搭建Docker私服,私服搭建详情可自行查看
https://www.cnblogs.com/Eivll0m/p/7089675.html)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum makecache fast

卸载旧版本

旧版本的 Docker 称为 docker 或者 docker-engine ,使用以下命令卸载旧版本:
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine

yum安装

更新 yum 软件源缓存,并安装 docker-ce

$ sudo yum install docker-ce

启动服务DockerCE设置自启动

$ sudo systemctl enable docker
$ sudo systemctl start docker

检查配置是不是开机运行

[root@localhost ~]#  chkconfig docker on  
Note: Forwarding request to 'systemctl enable docker.service'.  
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. 

提示要求设置为系统服务并启用

二、问题ransaction check error

1、因为之前已经安装过旧版本的docker,在安装的时候报错如下:
Transaction check error:
file /usr/bin/docker from install of docker-ce-cli-1:19.03.1-3.el7.x86_64 conflicts with file from package docker-common-2:1.13.1-75.git8633870.el7.centos.x86_64
file /usr/bin/dockerd from install of docker-ce-3:19.03.1-3.el7.x86_64 conflicts with file from package docker-common-2:1.13.1-75.git8633870.el7.centos.x86_64
主要是没有按照我上面的步骤 删除掉相应的组件,或者卸载时漏掉了该组件的
2、卸载旧版本的包

$ sudo yum erase docker-common

3、再次安装docker

$sudo  yum install docker-ce

配置镜像加速器

Windows和mac以及1.8之前的版本修改和这里不同请参看docker使用文档

对于使用 systemd 的系统docker1.8之后的版本修改,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

之后重新启动服务

 service docker restart

测试run hello-world

安装完成docker后运行 hello-word,如下提示请不要终止命令,它会自动下载该镜像并安装完成,然后输出hello word

[root@localhost ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world
9a0669468bf7: Pull complete
Digest: sha256:0e06ef5e1945a718b02a8c319e15bae44f47039005530bc617a5d071190ed3fc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.


建立docker 用户组

默认情况下, docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

退出当前终端并重新登录,进行如下测试。
为方便后面的测试我依然使用root权限。

Docker 卸载

  1. 列出你已安装的Docker package.
[root@localhost ~]# yum list installed | grep docker
docker-engine.x86_64                 17.05.0.ce-1.el7.centos         @dockerrepo
docker-engine-selinux.noarch         17.05.0.ce-1.el7.centos         @dockerrepo

  1. 移除这个package
$ sudo yum -y remove docker-engine.x86_64  

这个命令没有移除images、containers、volumes或者你主机上用户创建的配置文件.


[root@localhost ~]# ll /var/lib/docker/
total 4
drwx------. 5 root root  222 Nov  9 21:18 containers
drwx------. 3 root root   21 Nov  9 20:00 image
drwxr-x---. 3 root root   19 Nov  9 20:00 network
drwx------. 9 root root 4096 Nov  9 21:18 overlay
drwx------. 4 root root   32 Nov  9 20:00 plugins
drwx------. 2 root root    6 Nov  9 20:00 swarm
drwx------. 2 root root    6 Nov  9 21:18 tmp
drwx------. 2 root root    6 Nov  9 20:01 tmp-old
drwx------. 2 root root    6 Nov  9 20:00 trust
drwx------. 2 root root   25 Nov  9 20:00 volumes
 
  1. 要删除所有的images、containers、volumes,运行如下命令.
$ rm -rf /var/lib/docker  
  1. 查找和删除任何用户创建的配置文件.

参考资料

centos安装docke
Unable to find image ‘hello-world:latest’ locally如何处理

你可能感兴趣的:(docker)