Docker知识汇总

Docker的概述

Docker为什么出现?

一款产品:开发—上线 两套环境!应用环境,应用配置!

开发 -------运维。问题:在我这可以运行,但是在你的电脑就不能运行了。或者版本更新就不能使用了。

开发即运维!!

环境配置十分麻烦,每一个机器都要部署环境(集群redis、ES、Hadoop)。费时费力的。

发布一个项目jar(Redis+mysql+jdk+ES),那么你发送一个jar过去,别人还需要去配置运行这个jar包所需要的环境,而且版本一旦稍有不同就可能会出错。

所以希望项目能够带上环境进行打包发布,而不是单纯的一个jar文件。===>Docker

之前在服务器配置一个应用环境Redis、Mysql、jdk、ES、Hadoop,配置超麻烦,不能跨平台。

Windows开发,发布到Linux。

传统:开发jar,运维来部署

现在:开发打包部署上线,一套流程做完。

比如现在开发了一个Android的应用上线了给别人用:

Java->apk->发布(应用商店)->张三使用apk->到商店下载安装即可

回到我们的开发项目流程

Java->jar(环境)->打包项目带上环境(镜像)->上传到docker仓库(类似上面的商店)->运维下载我们发布的镜像->直接运行即可!

Docker的思想来自于集装箱

同一个JRE->多个应用(可能会出现端口冲突)–>原来的项目是交叉的

隔离:Docker的核心思想,打包装箱,每个箱子都是互相隔离的,每个箱子有自己的环境,即使端口一样也不会冲突。

Docker通过隔离可以使得服务器利用到极致。只要有一点空间,docker就可以利用。

Docker能干嘛

image-20201218001206628

传统的虚拟机技术缺点:

  1. 资源占用十分多

  2. 冗余步骤多

  3. 启动慢

容器技术

容器化技术不是虚拟的一个完整的系统,只要一个核心。

image-20201218001612046

容器内部有自己的运行环境,每个 容器是隔离的,容器是建立在我们的虚拟机之上的,可以充分的使用我们的虚拟机资源。

比较docker和虚拟机的不同

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后再这个操作系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间是互相隔离的,每个容器内都有自己的文件系统,互不影响。

DevOps(开发、运维)

应用更快的交付和部署

传统的:一堆帮助文档,安装程序

Docker:打包镜像发布测试,一键运行。

更便捷的升级和扩缩容

使用了Docker之后,部署应用就和搭积木一样

项目打包为一个镜像,扩展为服务器A,直接把镜像下载到服务器B运行就可以使服务器A的工作量减少,到达负载均衡的目的。

更简单的系统运维

在容器化之后,我们的开发测试环境都是高度一致的。(底层的系统kernel是一样的)

更高效的计算资源利用

1核2G可以运行十几个tomcat

Docker是内核级别的虚拟化,可以在一个物理机上运行多个容器实例,服务器性能可以被压榨到极限。

Docker的基本组成

image-20210122111511121

镜像(image)

docker镜像就好比一个模板,可以通过这个模板来创建容器服务,Tomcat镜像===>run---->tomcat1容器(提供服务器),通过这个镜像创建多个容器(最终服务运行或者项目运行就是在容器里面的)。镜像run起来就是容器了。

容器(container):

docker利用容器口域独立运行一个或者一组应用,通过镜像来创建

启动,停止,创建,删除,基本命令

目前可以理解为一个容器就是一个简易的Linux系统,就是有些基本的内容。

仓库(repository):

仓库就是存镜像的地方。

有公有仓库和私有仓库!(这个概念和git的相似)

Docker Hub(默认是国外的)

阿里云。。。。都有容器服务器(配置镜像加速!这里类似于maven)

所以应该docker的启动流程应该是这样的:client去启动一个镜像,而这个镜像要去仓库里面去获取,然后运行这个镜像来创建得到容器,我们实际上就是在跑这个容器。

安装docker

环境准备

  1. 需要会Linux基础
  2. centos8
  3. 使用远程终端软件来操作服务器(Xshell)

查看官方文档

网址:https://docs.docker.com/get-docker/

image-20210122112806525

我们这里是需要安装在Linux上的。

image-20210122112931404

# 1、卸载旧的版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2、安装的需要的安装包
sudo yum install -y yum-utils

# 3、设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo   #这个仓库地址默认是国外的,非常慢,我们不要这样设置,可以去找国内的加速镜像
   
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #使用阿里云的镜像来安装

#更新yum软件包索引
yum makecache
    
#4、安装docker相关的包
#安装最新版本的docker引擎 docker-ce 社区版 ee是企业版
sudo yum install docker-ce docker-ce-cli containerd.io

#我这里安装的时候出现这个问题:
Error: 
 Problem: package docker-ce-3:20.10.2-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.4.3-3.1.el7.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

#所以需要安装对应的io
sudo dnf install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm 

#接着再重新执行安装命令
sudo yum install docker-ce docker-ce-cli containerd.io

#5、启动docker
systemctl start docker
#查看docker的版本,看看是否安装成功
docker version

image-20210122120046518

#7、运行docker helloworld
docker run hello-world

image-20210122120319764

因为我们没有这个hello-world镜像,所以它去仓库进行pull,拉取这个镜像

然后会返回一个签名,代表拉取完成了。

拉取完成之后就会运行起来了。

#8、查看这个下载的hello-world镜像
[root@iZwz96cj54lr4szndhzbezZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

卸载docker

#1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
#2、删除资源
sudo rm -rf /var/lib/docker

# docker的默认工作路径 /var/lib/docker

阿里云镜像加速

登录阿里云账号,进入控制台

image-20210122121507390

image-20210122121738541

配置使用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
   
  "registry-mirrors": ["https://9eigil3c.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

回顾helloworld的执行流程

image-20210122122426428

底层原理

docker是怎么工作的

Docker是一个client-server结构的系统,Docker的守护进程运行再主机上,通过socket从客户端访问。

DockerServer接受到client的指令,就会执行这个命令。

image-20210122123542804

docker为什么比虚拟机要快

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

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

image-20210122133050161

Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行宿主机OS
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk等)
运行性能 几乎无额外性能损失 操作系统额外的cpu、内存消耗
移植性 轻便、灵活、适用于Linux 笨重、与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者

关于Docker实现原理,简单总结如下

  • 使用Namespaces实现了系统环境的隔离,Namespaces允许一个进程以及它的子进程从共享的宿主机内核资源(网络栈、进程列表、挂载点等)里获得一个仅自己可见的隔离区域,让同一个Namespace下的所有进程感知彼此变化,对外界进程一无所知,仿佛运行在一个独占的操作系统中;
  • 使用CGroups限制这个环境的资源使用情况,比如一台16核32GB的机器上只让容器使用2核4GB。使用CGroups还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等;
  • 使用镜像管理功能,利用Docker的镜像分层、写时复制、内容寻址、联合挂载技术实现了一套完整的容器文件系统及运行环境,再结合镜像仓库,镜像可以快速下载和共享,方便在多环境部署。

Docker常用命令

帮助命令

docker version		#显示docker的版本信息
docker info			#显示docker的系统信息,包括镜像和容器数量
docker 命令 --help	#帮助命令

帮助文档地址:https://docs.docker.com/reference/

镜像命令

**docker images:**查看所有本地的主机上的镜像

[root@iZwz96cj54lr4szndhzbezZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

#解释
REPOSITORY 镜像的仓库源,也就是这个镜像在仓库里面的命名
TAG			镜像的标签,版本
IMAGE ID	镜像的id
CREATED		镜像的创建时间
SIZE		镜像的大小

#可选项
  -a, --all             #列出所有的镜像
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           #只显示镜像的id

docker search搜素镜像

[root@iZwz96cj54lr4szndhzbezZ ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10380     [OK]       
mariadb                           MariaDB is a community-developed fork of MyS…   3848      [OK]       

#可选项,通过收藏来过滤
--filter=stars=3000  搜素出来的镜像的stars就是大于3000的

[root@iZwz96cj54lr4szndhzbezZ ~]# docker search mysql --filter=stars=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10380     [OK]       
mariadb   MariaDB is a community-developed fork of MyS…   3848      [OK]  

docker pull下载镜像

[root@iZwz96cj54lr4szndhzbezZ ~]# docker pull mysql
Using default tag: latest    #如果不写tag,默认就是lates
latest: Pulling from library/mysql
a076a628af6f: Pull complete #分层下载,docker image的核心 联合文件系统
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c  #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址

#等价于
docker pull mysql
docker pull docker.io/library/mysql:latest

#指定版本下载
docker pull mysql:5.7

docker rmi删除镜像

docker rmi -f  #删除所有的镜像
docker rmi -f id #根据镜像的id来删除镜像
docker rmi -f id1 id2 id3 #根据镜像的多个id来删除镜像
docker rmi -f $(docker images -aq)  #删除所有的容器

容器命令

有了镜像才可以创建容器

下载一个centos的镜像

新建容器并启动

docker run [可选参数] image

#参数的说明

--name="name" #容器的名字 tomcat1 tomcat2 用来区分容器
-d            #后台方式运行
-it           #使用交互方式运行,进入容器查看内容
-p 			  #指定容器端口  -p 8080:8080
		-p ip:主机端口:容器端口
		-p 主机端口:容器端口(常用)
		-p 容器端口
-P 			  #随机指定端口

#启动并加入容器
[root@iZwz96cj54lr4szndhzbezZ ~]# docker run -it centos /bin/bash
[root@95ca66a1d3d2 /]# ls   #查看容器内部的centos
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#从容器退出到主机
exit

列出所有的运行的容器

#docker ps命令
	# 列出所有的正在运行的容器
-a	#列出当前正在运行的容器+历史运行过的容器
-n=?	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值