Docker的概述和操作

发布于 2021-09-17  1.87k 次阅读


一,Docker的概述

任何一种新技术或框架的产生,都有其特定的需求,Docker也不例外

Docker使用虚拟容器技术解决了传统软件开发后的部署问题

一,传统软件开发部署

传统项目的开发部署分为三个阶段:

  • 开发人员进行本地开发(本地环境)
  • 运维人员进行项目部署(部署环境)
  • 测试人员进行项目测试

这一过程中存在的问题:

1,开发环境和Linux部署环境不一致导致项目启动报错

例:假如开发使用的是Mysql5.7,部署环境使用Mysql5.4导致版本不一致

2,Linux部署软件环境多,配置繁琐,容易出错

例:Linux需要安装JDK,Mysql,Redis,Nginx,RabbitMQ等,安装繁琐

3,分布式环境下多台Linux需要重复搭建环境,效率低

例:分布式一般三台起步,这就要重复安装三台环境,假如要50台分布式,那就的崩溃

而将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作且避免了传统部署产生的问题

二,Docker的产生

Docker最初是dotClould公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革命,并于2013年3月以Apache 2.0授权协议开源,主要项目代码在GitHub上维护,Docker项目还加入了Linux基金会,并成功推到开发容器联盟(OCI)

Docker自开源后受到了广泛的关注和讨论,在github已经有5万7千个星标()和一万个fork,在2013年底,doCloud公司决定改名为Docker,Docker最初是在Ubuntu12.04上进行开发实现得到,Red Hat则从RHEL6.5开始对Docker进行支持,Google也在其PAAS产品中广泛应用Docker

Docker使用Google公司推出的GO语言进行开发实现,基于Linux内核cgroup,namespace,overlayFS类的Union FS技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离进程,因此被称为容器

三,Docker是什么

官方定义:提供一整套完整容器解决方案,帮助开发人员以及开发团队构建和发布应用

注:本质上Docker使用容器技术,实现应用容器化,且每一个容器都有独立的进程执行

四,Docker的优势

1,一致的运行环境,更轻松的迁移

传统部署面临的问题:开发的时候,本机测试环境可以跑,生产环境就报错

例:在Linux部署一个java web应用程序,涉及到很多东西,如:jdk,tomcat,mysql等软件环境,当其中某一个软件版本不一致的时候,可能就会导致应用程序跑不起来的情况,Docker则将应用程序以及软件环境直接打包在一起,无论在那个机器都能保证环境一致

2,对进程进行封装隔离,容器和容器之间互不影响,更高效的利用系统资源

传统部署面临的问题:服务器上运行两个应用程序,但某一个应用程序把系统内存资源用完了,另一个程序直接挂了

例:这种情况是一种比较常见的情况,如果你的应用程序重用性不是特别高的话,一般公司不会让你这个应用程序独享一台机器,这个时候的服务器就会跟其他程序一起共享机器,所以在运行过程中程序会互相干扰,导致某个程序出现问题

3,通过镜像复制多个环境一致容器,方便分布式项目环境部署

传统部署面临的问题:项目需要进行横向扩容,需要多部署几十台服务器

例:在传统部署中,在几台部署几十台服务器,对运维来说是一件非常耗时间的事,而且服务器的环境可能还不一致,会出现各种问题,有Docker的话,只需要将程序打包到镜像,需要部署多少台服务,就可以跑多少容器,极大的提高了部署效率

二,Docker容器和传统虚拟机的区别

Docker在定义之初就避免和虚拟机的对比

一,传统虚拟机

虚拟机模拟的就是一整套的操作系统,它需要在虚拟机软件中安装系统镜像(如:CentOS-7-x86_64-DVD-1810.iso),然后运行在真实的宿主机上(如:在window是系统中安装vmware运行Linux系统),部署在虚拟机上的应用程序是毫无感知的,因为虚拟机看上去是跟真实系统一模一样的,对于底层系统来说,虚拟机只是一个普通文件,不需要就可以删除,对本地系统毫无影响

本质上虚拟机是建立在PC硬件和宿主机(本地操作系统)上的另一套系统,但是能够使应用程序,操作系统,pc硬件三者逻辑不变

虚拟机模拟一整套操作系统,它包含了操作系统的一切要求,如:内存,处理器,硬盘,网络适配器,显示器,打印机,USB控制器等……

缺点:

  • 宿主机资源占用多
  • 冗余多
  • 启动慢

二,Docker虚拟容器

由于虚拟机存在的缺点,Linux发展了另一种虚拟化技术:Linux容器(Docker就是使用此技术开发)

Linux容器不是模拟一个完整的操作系统,而是对进程相互隔离,有了容器,就可以将软件运行所需的所以资源打包到一个隔离容器中,容器与虚拟机不同,不需要捆绑一整套系统,只需要软件工作所需的库资源和设置,系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行

Doker容器与传统虚拟机的不同之处:

  1. 传统虚拟机是虚拟出一条硬件,在其运行一个操作系统,在该系统上再运行所需应用进程
  2. 而容器内的应用程序直接运行再宿主机的内核中,容器没有自己的内核,而且没有硬件虚拟,因此容器要比传统虚拟机更加轻便
  3. 每个容器之间相互隔离,容器都有自己的文件系统,容器之间进程不会相互影响

三,传统虚拟机和Docker容器的对比

 
传统虚拟机
Docker容器
磁盘占用
几个GB到几十个GB左右
几十MB到几百MB左右
CPU内存占用
虚拟操作系统非常占CPU和内存
Docker引擎占用极低
启动速度
开机到运行项目几分钟
开启容器到运行项目几秒
安装管理
需要专门的运维
安装,管理方便
应用部署
每一次部署费时费力
从第二次部署开始轻松便捷
耦合性
多个应用服务器安装在一起,容易相互影响
每一个应用服务一个容器,达到隔离
系统依赖
需要相同或相似的内核,推荐Linux系统

三,Docker的安装和镜像加速

Docker提供了三大系统的安装Window,Linux,MacOS,其中关于Linux系统它也提供不同发行版本的安装(如:CentOS,SLSE,Ubuntu等),此外它还提供通用系统的安装

我们主要以CentOS和通用系统安装来演示

官网下载文档:https://docs.docker.com/engine/install/

一,CentOS安装Docker(CentOS7)

1,卸载yum源的原始docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2,设置docker的yum源

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3,安装最新版本的docker

 yum install docker-ce docker-ce-cli containerd.io

4,指定版本安装docker(默认直接安装的是最新版本如第三步)

yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

5,启动docker

 systemctl start docker 

6,关闭docker

 systemctl stop docker

7,测试docker安装是否成功

docker run hello-world

注:这种安装方式只能在CentOS7中运行

二,bash安装(通用所有平台)

在测试和开发环境中Docker官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS系统和其他系统都可以使用这套脚本安装

1,使用curl命令下载安装脚本

 curl -fsSL https://get.docker.com -o get-docker.sh 

2,运行脚本

 sh get-docker.sh 

3,启动docker

systemctl start docker

4,测试docker安装是否正确

 docker run hello-world 

三,镜像加速

镜像加速设置就是设置镜像下载源,默认配置中下载地址是在https://index.docker.io/,但这个下载地址服务器在国外,下载效率有延迟,国内阿里云进行了镜像复制并提供了源下载,可以切换为国内下载源来提高下载速度

1,登录阿里云

2,在管理控制的产品服务中搜索容器镜像服务并进入

3,点击镜像工具中的镜像加速器

4,配置命令(复制后直接粘贴执行)

5,查看是否配置成功(命令:docker info)

四,Docker的三大核心和架构

一,Docker的三大核心

Docker的核心由镜像,容器,仓库组成

1,镜像(image)

一个镜像代表一个软件,如:Mysql镜像,Redis镜像,nginx镜像……

2,容器(container)

基于某个镜像运行一次就生成一个程序实例,这个实例被称为一个容器

3,仓库(repository)

用来存储docker中的所有镜像具体位置

docker仓库分两类:

  • 远程仓库:为使用Docker用户维护的一个共有仓库
  • 本地仓库:当前自己机器本地下载镜像存储的位置

远程仓库搜索网站(https://hub.docker.com/):为了方便用户使用,Docker提供了一个远程仓库网站,上面可以搜索镜像的信息(版本,镜像ID等)

 

 

类比:仓库,镜像,容器就好比java的maven仓库,类,对象,maven获取各种依赖框架,保存了各种类,我们通过new将类实例化成对象,在提供对象调用方法编写业务逻辑

二,Docker架构

Docker是使用的是CS架构即服务端server和客户端client,在启动Docker服务端时默认也会启动一个客户端,客户端负责接收消息并发送给服务端,任何服务端处理,客户端进行回显

一般这个架构模式并不局限于一种客户端,命令行客户端只是其中一种,其中IDEA和其他工具也可以作为客户端连接服务端进行操作

注:CS架构的框架其实有很多比如Hadoop,Zookeeper等,它们都是CS架构,我们可以在IDEA中下一个客户端jar包进行连接

五,Docker的命令

一,Docker引擎相关命令

1,docker

docker的帮助命令会将所有的操作命令都展示出来

2,deock info

用来展示docker信息(版本,镜像等)

Server:
Containers: 0      #当前主机运行的容器总数
  Running: 0       #有几个容器正在运行
  Paused: 0      #有几个容器是暂停的
  Stopped: 0      #有几个容器是停止的
Images: 0      #当前服务器的镜像数量
Server Version: 19.03.3      #服务端版本
Storage Driver: overlay2      #正在使用的存储引擎
  Backing Filesystem: xfs      #后端文件系统,即服务器的磁盘文件系统
  Supports d_type: true      #是否支持d_type
  Native Overlay Diff: true      #是否支持差异数据存储
Logging Driver: json-file      #日志类型
Cgroup Driver: cgroupfs      #Cgroups
Plugins:      #插件
  Volume: local      #卷
  Network: bridge host ipvlan macvlan null overlay      #支持的网络类型,overlay实现跨主机通信
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslo #支持的日志类型
Swarm: inactive      #是否支持swarm(docker的容器编排工具)
Runtimes: runc      #已安装的容器运行机制
Default Runtime: runc      #默认使用的容器运行机制
Init Binary: docker-init      #初始化容器的守护进程,即pid为1的进程
containerd version:       b34a5c8af56e510852c35414db4c1f4fa6172339      #容器版本ID
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657      #runc版本ID
init version: fec3683      #init版本
Security Options:      #安全选项
  Apparmor      #安全模块,https://docs.docker.com/engine/security/apparmor
  seccomp      #审计模块,https://docs.docker.com/engine/security/seccomp
   Profile: default      #默认的配置文件
Kernel Version: 3.10.0-1062.el7.x86_64      #宿主机内核版本
Operating System: CentOS Linux 7 (Core)      #宿主机操作系统
OSType: linux      #宿柱机操作系统类型
Architecture: x86_64      #宿主机架构
CPUs: 1      #宿主机CPU数量
Total Memory: 972.4MiB      #宿主机总内存
Name: localhost.localdomain      #宿主机hostname
ID: DIPK:XV7U:XY42:FTSH:T3AQ:TBXG:XK4F:WGZ6:YH2J:7LLQ:ZHMV:V45L      #宿主机ID
Docker Root Dir: /var/lib/docker      #宿主机数据保存目录
Debug Mode: false      #是否开启debug
Registry: https://index.docker.io/v1/      #镜像仓库
Labels:      #其他标签
Experimental: false      #是否是测试版
Insecure Registries:      #非安全的镜像仓库
  127.0.0.0/8
Live Restore Enabled: false      #是否开启活动重启(重启docker-daemon不关闭容器)
Product License: Community Engine      #产品许可证

3,docker version

查看docker的版本信息

Client: Docker Engine - Community  #客户端的版本信息
Version:           20.10.8 #客户端版本
API version:       1.41  #API版本
Go version:        go1.16.6 #使用到的Go语言版本
Git commit:        3967b7d  #在git上的公开id
Built:             Fri Jul 30 19:55:49 2021 #客户端创建时间
OS/Arch:           linux/amd64 #当前系统
Context:           default
Experimental:      true

Server: Docker Engine - Community  #服务端的版本信息
Engine:
  Version:          20.10.8 #服务端版本
  API version:      1.41 (minimum version 1.12)  #API版本
  Go version:       go1.16.6  #使用到的Go语言版本
  Git commit:       75249d8
  Built:            Fri Jul 30 19:54:13 2021 #服务端创建时间
  OS/Arch:          linux/amd64
  Experimental:     false
containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

二,Docker镜像相关命令

1,查看docker本地仓库中的镜像

命令:docker images

参数:

  1. -a:列出所有镜像(包括中间映像层)
  2. -q:只显示镜像ID
镜像名称       版本      镜像ID         创建时间       大小
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   6 months ago   13.3kB

信息说明:

  • 镜像版本:latest为最新版本,5.4等浮点数为固定版本
  • 镜像ID:每一个镜像都有一个唯一的ID,之后可以通过ID操作指定镜像
  • 创建时间:指进行的当前镜像的创建时间(不是下载到本地的时间)
  • 大小:占有的空间资源

2,下载镜像到本地仓库

命令:docker pull 镜像名称:版本号

例:下载mysql5.7.35

 docker pull mysql:5.7.35

3,搜索需要的镜像

命令1(普通搜索):decker search 镜像名称

命令2(带版本号):docker search 镜像命令:版本号

4,镜像导入和导出

导入命令(系统 -> 本地仓库):docker load -i 镜像包名

导出命令(本地仓库 -> 系统):docker save 镜像标识 -o 导出后的文件名

  • -o:设置镜像导出后的文件名

例:

#打包自定义镜像(tomcat_tast:1.0)到本地
docker save tomcat_tast:1.0 -o tomcat_tast1.0.tar
#将自定义镜像再导入本地仓库
docker load -i tomcat_tast1.0.tar

5,删除镜像

命令1(普通删除):docker image rm 镜像名称:版本 | 镜像ID

命令1(强制删除):docker image rm  -f 镜像名称:版本 | 镜像ID

例:删除mysql

docker image rm mysql:5.7.35(名称)
#或者
docker image rm bf756fb1ae65(镜像ID)

三,Docker容器相关命令

一,通过镜像运行容器

基础命令:docker run 镜像名:tag | 镜像ID

参数:

  • -p:映射主机
  • -d:后台运行
  • --name:指定运行容器的名称
  • -it :运行容器成功后进入容器
  • -v:创建数据卷

几种常见的操作:

  • 映射主机运行命令:docker run -p port(系统主机端口):port(容器内服务监听端口) 镜像名:tag | 镜像ID
  • 启动容器后台运行:docker run  -d 镜像名:tag | 镜像ID
  • 指定容器name启动:docker run --name 名称 镜像名:tag | 镜像ID

run的运行过程:通过run通过镜像运行容器,首先会从本地仓库中寻找镜像如果有则运行容器,如果没有寻找到,会从远程仓库中寻找下载该镜像到本地,假如本地仓库也没有则报镜像不存在错误

二,查看当前运行的容器

命令:docker ps

注:默认只查看运行的容器

参数:

  • -a:查看所有容器(包括运行和非运行容器)
  • -q:返回正在运行容器ID
  • -qa:返回所有容器ID
#容器ID        #容器基于的镜像  #容器内执行的命令    #容器的创建时间    #容器当前状态    #容器监听的端口     #容器的名称
CONTAINER ID   IMAGE          COMMAND             CREATED          STATUS          PORTS              NAMES

两种容器状态:

  • UP:运行状态
  • Exited:退出状态

容器监听的端口:这是容器内部的监听端口,每一个容器都有一个进程隔离,这个端口和操作系统的端口没有关系,是容器内部的端口,在浏览器输入主机IP:端口号是无法访问的,假如要访问需要与主机端口进行映射

容器名称:一般创建时自己进行指定,如果使用系统分配,运行容器多了不好管理

注:容器启动时会自动分配一个容器ID,它和镜像ID不一样,容器的名称可以指定和容器ID一样作为容器的标识

三,停止,启动,重启容器

开启容器:docker start 容器名称 | 容器ID

重启容器:docker restart 容器名称 | 容器ID

正常停止容器运行:docker stop 容器名称 | 容器ID

立即停止容器运行:docker kill 容器名称 | 容器ID

注:停止,启动,重启容器的前提是通过docker run命令从镜像中生成了容器

四,删除容器

1,删除停止的容器:docker rm 容器名称 | 容器ID 

2,删除正在运行的容器:docker rm -f 容器名称 | 容器ID 

3,删除所有容器:docker rm -f ${docker ps -aq}

五,查看容器运行日志

1,docker logs 容器名称 | 容器ID

2,实时展示日志:docker logs -f 容器名称 | 容器ID

3,实时展示日志并加入时间戳:docker logs -tf 容器名称 | 容器ID

4,展示日志尾部的多少行:docker logs --tail number  容器名称 | 容器ID 

六,查看容器内进程

命令:docker top 容器名称 | 容器ID

七,与容器进行交互

进入容器:docker exec -it 容器名称 | 容器ID bash

进入容器后可以使用系统最基础的一些命令比如ll,rm,ls等,但没有比较高级的命令比如vi,vim等

注:因为docker容器是隔离每一个容器都类似于搭载了一个服务器操作系统,所有容器类的所有目录和真实主机的目录是不能相匹配的,例:上面的/usr/local/tomcat在系统中是找不到tomcat的

退出容器:exit

八,操作系统与容器文件传输

容器复制文件到操作系统:docker cp 容器标识:容器内资源路径 操作系统路径

操作系统复制文件到容器:docker cp 文件|目录 容器标识:容器路径

九,查看容器内部细节

命令:docker inspect 容器ID|容器名称

这条命令展示的信息很多,比如容器的绑定IP,映射的端口,挂载的信息等,实际开发有很大用处

十,打包容器称为镜像

命令:docker commit -m "描述信息" -a "作者信息" 容器标识 打包镜像名称

  • -a:设置作者名称
  • -m:文件描述信息

例:

#打包自定义容器tom为一个镜像
docker commit -m "my tom" -a "WQL" tom tom:1.0
#注:镜像名和版本号要用:隔开

这条命令结合镜像的导入导出可以很快的迁移和部署镜像


路漫漫其修远兮,吾将上下而求索