0
点赞
收藏
分享

微信扫一扫

Docker介绍和基础操作

九月的栩 2023-03-18 阅读 91

一、Docker介绍

1.1 容器与虚拟机的对比

传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行软件。而容器内的应用直接运行在宿主机的内核之上,容器没有自己的内核,也不需要虚拟硬件,相当轻量化。多个容器可共享宿主机的操作系统(内核)。

每个容器间是互相隔离的,即每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等。所以在同一个宿主机上的多个容器之间彼此不会相互影响。

总之,容器技术既借鉴了虚拟机的隔离性,又避免了安装虚拟机带来过多的资源消耗。具体表现可以看下表:

特性

虚拟机

容器

隔离级别

操作系统级

进程级

隔离策略

运行于Hypervisor上

直接运行在宿主机内核中

系统资源

5~20%

小,0~5%

启动速度

慢,分钟级

快,秒级

占用磁盘空间

大,GB级

小,MB级

并发性

一台宿主机运行十几个,最多几十个

几百个

高可用策略

备份、容灾、迁移

弹性、负载、动态

注意:容器是一种通用技术,包括但不限于docker

1.2 相关概念(核心概念)

1.2.1 Namespace(命名空间)

创建容器就是创建一个隔离良好的环境来运行服务(进程)。为了达到这种级别的隔离,容器应该要有自己的文件系统、IP地址、挂载点、进程ID等,这就需要使用Linux命名空间来实现这一点。
      命名空间为容器设置了边界,让容器拥有了自己的挂载点、用户、IP地址、以及进程管理等。
      Linux 中的重要的命名空间有:

  • pid namespace:负责隔离进程(PID:Process ID)。
  • net 命名空间:负责管理网络接口(NET:网络)。
  • ipc 命名空间:负责管理对 IPC 资源的访问(IPC:进程间通信)。
  • mnt 命名空间:负责管理文件系统挂载点(MNT:Mount)。
  • uts 命名空间:隔离内核和版本标识符。(UTS:Unix 分时系统)。
  • usr 命名空间:隔离用户 ID。简单来说,它隔离了主机和容器之间的用户 ID。
  • Cgroup 命名空间:将控制组信息与容器进程隔离

使用这些命名空间,容器可以拥有自己的网络接口、IP地址等。每个容器都拥有自己的命名空间,并且在该命名空间内运行的进程在其他命名空间中没有任何权限。

1.2.2 Linux Control Groups(Linux Cgroups,控制组)​

Linux 控制组管理着容器使用的资源,我们可以限制容器(或一个进程)使用的资源上限(包括CPU、内存、网络和 IO 资源)。Docker可通过对应的参数指定对资源的限制。

如果不限制容器的CPU和内存资源,单个容器可能最终会占用所有的主机资源,导致其他容器的崩溃。

注意:Cgroups在内核层默认已经开启,内核越新支持的功能越多

1.3 什么是Docker

Docker 是一个流行的用Go语言开发的开源项目,由Dotcloud公司开发,基于Linux 内核功能(如命名空间和控制组)在操作系统之上创建容器,并通过(namespace及cgroup 等)来提供容器的资源隔离与安全保障。
      Docker 最早采用 LXC 技术。LXC 是 Linux 原生支持的容器技术,可提供轻量级的虚拟化,可以说 Docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,标准的配置方法,在LXC的基础之上,Docker提供了一系列更强大的功能。后来Docker 改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。

1.4 Docker的主要目标​

针对应用组件可以实现“一次封装,到处运行”。将应用运行在Docker 容器上,可以实现跨平台,跨服务器,只需一次配置准备好相关的应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问题, 从而极大提升了部署效率,减少故障的可能性。
      在Docker出现之前,需要部署开发环境、测试环境、生产环境,部署&管理的工作量大。而有了Docker,可以将应用程序的安装、配置打包成镜像,构建后在开发环境、测试环境、生产环境均可使用,实现基础设施环境、程序的打包方式、程序的运行方式的统一。

1.5 Docker的组成

  • Docker主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点
  • Docker服务端(Server): Docker守护进程,运行docker容器
  • Docker客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
  • Docker镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
  • Docker仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库 harbor
  • Docker容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程

1.6 Docker的优点

  • 快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上
  • 高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率
  • 节省开支: 提高服务器利用率,降低IT支出
  • 简化配置: 将运行环境打包保存至容器,使用时直接启动即可
  • 环境统一: 将开发、测试、生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题
  • 快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台
  • 更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚、低耦合的要求,减少不同服务之间的相互影响

1.7 Docker的缺点

  • 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
  • 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
  • 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

二、Docker安装及基础命令介绍

2.1 Ubuntu 22.04安装Docker​

#更新必要的系统工具
apt-get -y update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
#添加GPG 密钥
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#设置存储库
add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#更新包索引
apt-get -y update
#查询docker-ce版本
apt-cache madison docker-ce
#安装指定版本docker
apt-get -y install docker-ce=5:20.10.23~3-0~ubuntu-jammy docker-ce-cli=5:20.10.23~3-0~ubuntu-jammy

2.2 查看Docker相关信息

2.2.1 查看Docker版本信息

Docker介绍和基础操作_Docker

2.2.2 Docker存储引擎​

  • AUFS:是一种Union FS,是文件级的存储驱动。所谓 UnionFS就是把不同物理位置的目录合并 mount 到同一个目录中。简单来说就是支持将不同目录挂载到一个虚拟文件系统下的。这种可以层层地叠加修改文件。无论底下有多少层都是只读的,最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用写时复制将文件从只读层复制到可写进行修改,结果也保存在Docker中,底下的只读层就是 image,可写层就是 Container
  • Overlay:一种 Union FS 文件系统,Linux 内核3.18后支持
  • Overlay2:Overlay的升级版,到目前为止,所有Linux发行版推荐使用的存储类型,也是docker 默认使用的存储引擎。相比AUFS而言Overlay2有以下优势:更简单地设计;从3.18开始就进入了Linux内核主线;资源消耗更少

三、镜像管理

3.1 镜像结构和原理

Docker介绍和基础操作_Docker_02

镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器。

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS(联合文件系统)。UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、overlayFS 及Devicemapper 都是一种UnionFS。

镜像的最底层是bootfs,这与Linux系统类似。用户不会与这一层直接打交道。bootfs包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,系统会卸载bootfs。

bootfs的上层镜像叫作根镜像(rootfs),通常情况下它是一个操作系统,如Ubuntu、 Debian或CentOS等,包含的就是Linux 系统中的/dev、/proc、/bin、/etc等标准目录和文件。用户的镜像必须构建于根镜像之上。

镜像最上层(容器层)是有可写权限的,其它层(镜像层)均为只读权限。但容器层写入的数据只是临时的,容器被删除时写入的数据会丢失。

注意:图例是以tomcat镜像为例,需要jdk、tomcat镜像。如果是nginx镜像,则rootfs上面一层就直接是nginx镜像

3.2 镜像搜索​

##官网搜索:http://hub.docker.com
##命令搜索
语法:docker search 镜像名
#搜索点赞100个以上的镜像
语法:docker search --filter=stars=100 镜像名

3.3 下载镜像​

#如果不指定版本号,则下载最新版镜像
语法:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
说明:
1.NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
2.:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像

3.4 查看本地镜像

语法:docker images [OPTIONS] [镜像名:版本号]
OPTIONS说明:
-a:列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
-f:显示满足条件的镜像
--format:指定返回值的模板文件
--no-trunc:显示完整的镜像信息
-q:只显示镜像ID

执行结果的显示信息说明:
• REPOSITORY:表示镜像的仓库源
• TAG:镜像的标签
• IMAGE ID:镜像ID
• CREATED:镜像创建时间
• SIZE:镜像大小

eg:查看所有镜像

Docker介绍和基础操作_Docker_03


3.5 Docker镜像加速配置​

vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
systemctl daemon-reload && systemctl restart docker

3.6 镜像导出

语法:docker save [OPTIONS] IMAGE [IMAGE...]    
OPTIONS说明:
-o:输出到的文件
常见用法:
docker save -o /path/file.tar IMAGE1 IMAGE2 ...
docker save IMAGE1 IMAGE2 ... > /path/file.tar

3.7 镜像导入

 语法:docker load [OPTIONS] 或 
docker load < 归档文件名
OPTIONS说明:
--input , -i : 指定导入的文件,代替STDIN。
--quiet , -q : 精简输出信息。

常见用法:
docker load -i /path/file.tar
docker load < /path/file.tar

注意:生产环境中要把一台机器的所有镜像要迁移到另一台服务器上,怎么迁移?

先将镜像导出为一个tar文件,再在另一台服务器导入该tar文件

#使用image ID导出镜像,再导入后的镜像没有REPOSITORY和TAG,显示为none
docker save `docker images -aq` -o all.tar

Docker介绍和基础操作_Docker_04


Docker介绍和基础操作_Docker_05

#将所有镜像导出到一个文件中,此方法导入后可以看到REPOSITORY和TAG
docker save `docker images | awk 'NR!=1{print $1":"$2}'` > all.tar 或
docker save `docker images --format "{{.Repository}}:{{.Tag}}"` -o all.tar

Docker介绍和基础操作_Docker_06


Docker介绍和基础操作_Docker_07


3.8 删除镜像

语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-f:强制删除

      eg:删除所有镜像

Docker介绍和基础操作_Docker_08

3.9 查询镜像详细信息​

语法:docker inspect 镜像名:[版本号]

3.10 镜像打标签​

语法:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

#TARGET_IMAGE[:TAG]格式一般形式
仓库主机或IP[:端口]/项目名(或用户名)/image名字:版本

注意:标签默认为latest

四、容器操作基础命令​

4.1 启动容器

4.1.1 流程

Docker介绍和基础操作_Docker_09

4.1.2 用法​

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS

作用

-i

以交互模式运行容器,通常与 -t 同时使用

-t

启动容器后,为容器分配一个命令行,通常与 -i 同时使用

-v

目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>

-d

守护进程,后台运行该容器

-p

指定端口映射。格式:主机(宿主)端口:容器端口

宿主机本地IP:宿主机本地端口:容器端口

-P

随机端口映射,容器内部端口随机映射到主机的端口

-u

以什么用户身份创建容器

-w

指定容器的工作目录

--name

容器名字

--add-host

在启动容器时,向/etc/hosts文件添加一个host:ip的映射

-m, --memory bytes

设置容器使用内存最大值

-h, --hostname string

指定容器的主机名

--dns 8.8.8.8

指定容器 dns 服务器

-e username="www" 或 --env-file 参数文件

为容器运行设置环境变量,不会影响docker build时环境变量的值

--restart

指定容器停止后的重启策略

--privileged

容器内是否使用真正的 root 权限

--net

设置容器网络模式

--privileged OPTIONS说明

大约在0.6版,--privileged OPTIONS被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。以privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。

--restart=’xxx’,指定容器停止后的重启策略:

  • no:默认设置,容器退出时不重启
  • on-failure:容器故障退出(返回值非0)时重启
  • always:容器退出时总是重启。

注意:生产环境中对外提供业务服务的容器需要设置为随着宿主机的启动而启动(即restart=always)

--net=’xxx’,设置容器网络模式:

  • bridge,默认使用的模式。此模式创建的容器会为每一个容器分配自己的网络 IP 等信息,并将容器连接到一个虚拟网桥与外界通信
  • host,容器使用主机的网络
  • container,使用其他容器的网络,共享IP和PORT等网络资源。使用参数--network container:容器名称或ID指定
  • none,容器使用自己的网络(类似--net=bridge),但是不进行配置

注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止;

#一次性运行容器命令(容器中有要执行的命令才行),执行完命令即退出容器。用于测试
docker run --name=alpine alpine cat /etc/issue

Docker介绍和基础操作_Docker_10

创建容器后直接进入并退出有两种方式(参考下面两幅图做对比):

  • 要从容器内退出并停止容器,则进入容器后按exit;
  • 要从容器内退出且不停止容器,则进入容器后按ctrl+p+q;

#执行exit退出,容器关闭​

Docker介绍和基础操作_Docker_11

#同时按ctrl+p+q 三个键退出后,容器不停止

Docker介绍和基础操作_Docker_12

4.2 查看容器信息

4.2.1 显示当前存在的容器

语法:docker ps [OPTIONS]

OPTIONS说明:
-a:显示所有的容器,包括未运行的
-f:根据条件过滤显示的内容
--format:指定返回值的模板文件
-l:显示最近创建的容器
-n:列出最近创建的n个容器
--no-trunc:不截断输出
-q:静默模式,只显示容器ID
-s:显示总的文件大小

4.2.2 查看容器内的进程

语法:docker top CONTAINER

Docker介绍和基础操作_Docker_13

4.2.3 查看容器资源使用情况

语法:docker stats [OPTIONS] CONTAINER

OPTIONS说明:
-a:显示所有的容器,包括未运行的
--format:指定返回值的模板文件
--no-stream:展示当前状态就直接退出了,不再实时更新
--no-trunc:不截断输出

#查看单个容器的资源使用情况
docker stats alpine

Docker介绍和基础操作_Docker_14

#查看所有容器的资源使用情况
docker stats

Docker介绍和基础操作_Docker_15

4.2.4 查看容器的详细信息

docker inspect 可以查看docker各种对象的详细信息,包括:镜像、容器、网络等。

语法:docker inspect [OPTIONS] NAME|ID [NAME|ID…]

OPTIONS说明:
-f:指定返回值的模板文件
-s:显示总的文件大小
--type:为指定类型返回JSON

#查看镜像alpine的元信息
docker inspect alpine

Docker介绍和基础操作_Docker_16


4.3 删除容器

docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉。

语法:docker rm [OPTIONS] CONTAINER [CONTAINER…]

OPTIONS说明:
-f:通过 SIGKILL信号强制删除一个运行中的容器
-l:移除容器间的网络连接,而非容器本身
-v:删除与容器关联的卷

#删除所有容器
docker rm -f `docker ps -aq`

Docker介绍和基础操作_Docker_17

#删除所有停止的容器
docker container prune -f

Docker介绍和基础操作_Docker_18

4.4 容器的启动和停止​

语法:docker start|stop|restart|pause|unpause CONTAINER
##批量启停容器
docker start `docker ps -aq`
docker stop `docker ps -aq`

4.5 进入正在运行的容器

4.5.1 attach命令

attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器
      语法:docker attach CONTAINER

Docker介绍和基础操作_Docker_19

4.5.2 exec命令​

使用此方式进入容器,再使用exit退出,容器还在运行。此为推荐方式。

语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

OPTIONS说明:
-d:分离模式: 在后台运行
-i:即使没有附加也保持STDIN 打开
-t:分配一个伪终端
-e:设置环境变量
-w:需要执行命令的目录
-u:指定访问容器的用户名

Docker介绍和基础操作_Docker_20

4.6 查看容器日志

docker logs可以查看容器中运行的进程在控制台输出的日志信息。

语法:docker logs [OPTIONS] CONTAINER

OPTIONS说明:
-t,--timestamps:显示时间戳
--tail n:从尾部开始显示n行日志
--since string:从某个时间开始显示容器日志
-f,--follow:将当前时间点,容器日志文件 <container-id>-json.log 中的日志信息全部打印
--details: 显示更多的信息

#只查看一次容器日志
docker logs web01

Docker介绍和基础操作_Docker_21

#持续查看,就会看到日志新增的部分
docker logs -f web01

Docker介绍和基础操作_Docker_22

4.7 容器内部的hosts文件

容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP。

Docker介绍和基础操作_Docker_23

4.8 指定容器DNS

      容器的dns服务器,默认采用宿主机的dns地址,可以用如下方式指定其它的DNS地址:

  • 将dns地址配置在宿主机
  • 在容器启动时加OPTIONS--dns=x.x.x.x
  • 在/etc/docker/daemon.json文件中指定,这样会作用于新创建的所有容器

#在daemon.json指定dns
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"dns": ["114.114.114.114", "119.29.29.29"]
}
systemctl daemon-reload && systemctl restart docker

      #用--dns指定优先级更高

Docker介绍和基础操作_Docker_24

4.9 容器与宿主机之间复制文件​

语法
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

OPTIONS说明
-a:归档模式
-L:保持源目标中的链接

举报

相关推荐

0 条评论