Docker介绍

一、什么是容器?

# 容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的系统文件,ip地址,主机名等。

二、什么是Docker?

'Docker 属于 Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案'

	Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里面运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
	
	总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

三、为什么要用Docker?

3.1 Docker容器虚拟化的好处

	在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足"任何时间任何地点"可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正式Docker所能够提供的最大优势。
	Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程中出现问题的风险

3.2 Docker的用途

1. 提供一次性的环境。比如,本地测试他人的软件,持续集成的时候提供单元测试和构建的环境

2. 提供弹性的云服务。因为docker容器可以随开随关,很适合动态扩容和缩容

3. 组件微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构

四、Linux容器化与传统虚拟化的区别

4.1 传统虚拟化

# 我们之所以需要使用容器,主要是因为在不同平台不同环境下,每台计算机运行出来的状态很可能不一样,所以我们需要这种带环境等等一块安装的容器

	虚拟机也是一种带环境安装的解决方案,它可以在一种操作系统里面运行另一种操作系统,比如windows系统里面运行linux系统。应用程序对此毫无感知,因为虚拟机看上去和真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删除,对其他部分毫无影响
	
	虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点
	
# 1. 占用资源多
	虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,虚拟机依然需要几百MB的内存才能运行
	
# 2. 冗余步骤多
	虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录
	
# 3. 启动慢
	启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

4.2 Linux容器化

# 由于虚拟机存在以上缺点,Linux发展出了另一种虚拟化技术: Linux容器(Linux Containers,缩写为LXC)

'Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离'

'由于容器是进程级别的,相比虚拟机有很多优势'

# 1. 启动块
	容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多
	
# 2. 资源占用少
	容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源
	
# 3. 体积小
	容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多
	
	
'总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多'

五、Docker的核心概念

Docker中有三个核心概念: 镜像、容器和仓库。

5.1 镜像(Image)

Docker把应用程序及其依赖,打包在Image文件里面。只有通过这个文件,才能生成Docker容器
  'image文件可以看做是容器的模板。Docker根据image文件生成容器的实例,同一个image文件,可以生成多个同时运行的容器实例'

5.2 容器(Container)

镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等~

5.3 仓库(Repository)

用来保存镜像的仓库。当我们构建好自己的镜像之后,需要存放在仓库中,当我们需要启动一个镜像时,可以在仓库中下载下来。

六、Docker的安装

官方安装文档------> 传送门

# 1. 安装yum-utils(提供yum-config-manager 程序)并设置官方源文件
[root@docker ~]# yum -y install yum-utils
[root@docker ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 2. 安装特定版本的社区版Docker
'先查看yum源中可用的版本,并进行结果从高到低排序'
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
[root@docker ~]# yum -y install docker-ce-19.03.9


----------------------------------'以上是官方安装源,还可使用如下方法'----------------------------------
# 1. 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 安装yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
	
# 3. 安装Docker
[root@localhost ~]# yum install docker-ce-19.03.9 -y

七、Docker常用操作

7.1 验证Docker是否安装成功

[root@docker ~]# docker version
# 或者
[root@docker ~]# docker info

7.2 启动docker

'Cent7'
[root@docker ~]# systemctl start docker

'Cent6'
[root@docker ~]# service docker start

7.3 关于镜像(image)的相关命令

	image是二进制文件。实际开发中,一个image往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Ubuntu的image基础上,往里面添加Apache服务,形成你的image。
	
'image文件是通用的,一台机器的image文件拷贝到另一台机器,照样可使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的image文件,而不是自己制作。即使要定制,也应该基于别人的image文件进行加工,而不是从零开始制作'

# 1. 列出本机的所有image文件
[root@docker ~]# docker image ls
'or'
[root@docker ~]# docker images



# 2. 下载image镜像
'镜像名称的构成'
[root@docker ~]# docker image pull docker.io/library/hello-world:latest
[root@docker ~]# docker image pull library/hello-world
[仓库url]/[仓库的名称空间]/[仓库的名称]:[镜像的版本号]

默认的仓库URL:	docker.io
默认的仓库名称空间:	library
仓库的名称:	没有默认
镜像版本号:	默认是latest(最新的)

'可省略到如下命令'
[root@docker ~]# docker pull hello-world


# 3. 搜索镜像
[root@docker ~]# docker search hello-world
NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
hello-world                                Hello World! (an example of minimal Dockeriz…   1548      [OK]       
kitematic/hello-world-nginx                A light-weight nginx container that demonstr…   150                  


# 4. 查看镜像的详情
docker inspect [镜像名]
[root@docker ~]# docker inspect hello-world


# 5. 更改镜像的名称
docker tag [旧名称] [新名称]
[root@docker ~]# docker tag hello-world "nihao"


# 6. 上传镜像(将镜像上传至远程仓库)
	(1) 登录阿里云docker镜像仓库
	'fatesl为阿里云镜像仓库的用户名,登录registry的用户名是你的阿里云账号全名,密码是你开通namespace时设置的密码'
	[root@docker ~]# docker login --username=fatesl registry.cn-hangzhou.aliyuncs.com

	(2) 为本地镜像添加tag
	'nihao为你的 ImageID, v1为你设置的镜像版本号'
	[root@docker ~]# docker tag nihao registry.cn-hangzhou.aliyuncs.com/sl_test/test:v1

	(3) 推送镜像
	[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/sl_test/test:v1
	
# 7. 删除镜像
	docker rmi [仓库的名称ID]
	[root@docker ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/sl_test/test:v2
	[root@docker ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/sl_test/test:v2