【Docker】docker基础使用

2023-11-13

docker概念

什么是docker

​ Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术, Docker 只是把这种技术在使用上简易普及了。 Docker 在早期的版本其核心就是 LXC 的二次封装发行版。

​ Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是“Build, Ship and Run Any APP, Anywhere”,即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到 一次封装,到处运行 。

​ 早期 Docker 利用 LXC 做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件, image 文件),**镜像文件集中放在一个仓库中。当需要创建容器时, Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。**所以, Docker 极大的简化了容器的使用难度。以后我们创建启动容器,只需要一个命令, docker-run,docker-stop 就可以启动停止一个容器了。

Docker 从本质上来说,其就是一个基于 Linux 操作系统的 Namespace 和 Cgroup 功能实现的隔离容器,可以模拟操作系统的功能

image-20230705004946618

docker运行流程

image-20230705005015857

通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件, image 文件),镜像文件集中放在一个仓库中。当需要创建容器时, Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。

docker引擎迭代

Docker 早期基于 LXC 容器管理引擎实现。技术成熟之后, Docker 自建了容器引擎叫 libcontainer;后来 CNCF 的介入, Docker 又研发了一个工业化标准的容器引擎 runC,目前所使用的新版 Docker,所使用的容器引擎就是 RunC。

docker与虚拟机

docker与虚拟机的区别

传统虚拟机 Docker容器
磁盘占用 几个GB 到几十个GB 左右 几十 MB 到几百 MB 左右
CPU内存占用 虚拟操作系统非常占用 CPU 和内存,需要通过虚拟层调用,占用率高 Docker 引擎占用资源极低,直接作用于硬件资源, 占用少
启动速度 (从开机到运行项目) 几分钟 从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 手动部署,速度慢 体系化部署,可以自动化,速度快
隔离性 系统级别 进程级别
封装程度 打包整个操作系统 打包项目代码和依赖信息

为什么Docker运行速度比虚拟机快得多?

​ docker 有比虚拟机更少的抽象层。 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。 docker 利用的是宿主机的内核,而不需要Guest OS,节省了 Guest OS 占用的资源 。

image-20230705010838633

​ docker 不需要 Guest OS,Docker在创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个docker 容器只需要几秒钟。

docker版本发展

lxc:lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。

libcontainer: docker 从 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc。在 1.11 版本拆分出 runc 后ibcontainer 也随之成为了 runc 的核心功能模块, runc 后续变成了容器标准。

moby: moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby,事实上这个 moby 就是 dockerd 目前使用的开源项目名称, docker 项目中的 engine(dockerd)仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。

docker基础

docker架构

image-20230326004308546

docker运行的原理

docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

image-20230326004909959

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。

docker运行的基本流程为:

image-20230326010427129

image-20230326010450423

docker Registry(镜像仓库)

什么是Registry?

镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。

镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。

image-20230705235534993

镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com;

一个 Registry 中可以存在多个Repository;Repository 可分为“顶层仓库”和“用户仓库”;用户仓库名称格式为“用户名/仓库名”;每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像

  • Repository: 由某特定的 docker 镜像的所有迭代版本组成的镜像仓库
  • 镜像名称(name) +标签(tag):如 nginx:latest
  • 认证能力:提供用户注册,登录、登出能力
  • 索引:提供镜像的索引信息,方便检索

一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum 这些信息都会记录下来;还有最终的可执行文件是在存储数据里面,存储在一个一个的 blob 里面,真正占有空间的就是这些 blob。

仓库分类

(1)公有仓库:像阿里云、 dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用
(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。

docker镜像仓库的工作机制

镜像仓库使用流程

  • 通过docker login登录仓库
  • Docker pull拉取需要的镜像
  • 通过dockerfile或者commit等方式制作完镜像,通过docker push上传到仓库。

实际研发镜像仓库使用

image-20230706004919691

解释:

  • 开发环境:开发人员使用的一套环境
  • 测试环境:需求开发完成后,发布到供测试人员进行测试的环境
  • 预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布
  • 生产环境:真正面向客户的环境

不同的工作人员在不同的环境完成工作,当产品开发完成后再push到生产环境中。

不同镜像仓库的拉取

DockerHub

Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与团队共享。

DockerHub具有以下功能:

(1)个人可以注册私有仓库,能够发布自己的镜像

(2)提供镜像检索能力

(3)提供海量官方和认证组织的镜像

(4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub

(5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。 )

  • 镜像搜索

image-20230706010344503

  • 镜像tag查找

image-20230706010401590

比如nginx镜像支持哪些版本等。

  • 拉取版本

image-20230706010437753

国内镜像源

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多 云服务商都提供了国内镜像加速器服务,例如:

阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器-> 复制加速器地址)

网易云加速器地址 https://hub-mirror.c.163.com

百度云加速器地址"https://mirror.baidubce.com

可以在docker的配置文件 /etc/docker/daemon.json 添加下面的内容,docker配置加速器

{
# 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
后确保 json 的格式正确
	"registry-mirrors": [
	"https://hub-mirror.c.163.com",
	"https://mirror.baidubce.com"
	]
}

重新加载配置

# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
#查看 docker 状态
sudo systemctl status docke

私有仓库

私有镜像仓库则是指部署在公司或组织内部,用于自身应用 Docker 镜像存储、分发的镜像仓库。

常用的私有仓库构建工具:

  • **Harbor:**Harbor 是 VMware 公司最近开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。 Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。
  • Nexus:Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,目前常被用来作为 Maven 私服、 Docker 私服。
  • Docker registry:由 docker 官方提供的私服,类似于 docker hub。用于保存公司内部上传的 Docker 镜像。

docker常用命令

镜像仓库命令

docker login

登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方的Docker hub。

docker login [OPTIONS] [SERVER]

关键参数

  • -u:登陆的用户名
  • -p:登陆的密码

image-20230707011352818

也可以使用下面的命令登陆

docker login -u 用户名 -p 密码

docker pull

从镜像仓库中拉取或者更新指定镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

别名

docker image pull

关键参数:

  • -a :拉取所有 tagged 镜像
  • –disable-content-trust :忽略镜像的校验,默认开启

案例

docker pull nginx:1.23.3

image-20230707013628317

可以指定拉取DIGEST

docker pull nginx@sha256:f4e3b6489888647ce1834b601c6c06b9f8c03dee6e097e13ed3e28c01ea3ac8c

image-20230707013808862

docker push

将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

docker push [OPTIONS] NAME[:TAG]

别名

docker image push

关键参数

  • -a:推送所有tagged镜像
  • –disable-content-trust :忽略镜像的校验,默认开启

案例:

docker push nginx:1.23.3

image-20230708012938798

失败原因:没有权限,我们个人用户无法向nginx仓库中加镜像。

下面是正确push一个镜像的方法:

docker login -u 用户 -p 密码


# docker的规则,需要我们修改镜像的tag,才能上传我们自己的镜像
# docker push namespace/regname:tagname
#先修改tag的name
docker tag nginx:1.23.4  namespace/regname:v1.23.4
docker push  namespace/regname:v1.23.4

docker search

从 Docker Hub 查找镜像

docker search [OPTIONS] TERM

关键参数:

  • –no-trunc :显示完整的镜像描述
  • -f <过滤条件>:列出收藏数不小于指定值的镜像。

案例:从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像

docker search -f stars=10 nginx

image-20230708020201630

docker logout

退出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker

docker logout [SERVER]

案例

docker logout
# 也可以指定退出仓库
docker logout https://index.docker.io/v1/

镜像命令

docker images

列出本地镜像。

docker images [OPTIONS] [REPOSITORY[:TAG]]
#别名
docker image ls, docker image list

关键参数:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  • –digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • –format :指定返回值的模板文件;
  • –no-trunc :显示完整的镜像信息;
  • -q :只显示镜像 ID。

案例:

查找所有的镜像

docker image ls

查找本地关于nginx的镜像

docker images nginx -a

image-20230708230800064

返回本地关于nginx的镜像,按照json格式返回

docker images nginx --format json

image-20230708231211667

docker image inspect

功能:查看镜像详细信息 ,语法:

docker image inspect [OPTIONS] IMAGE [IMAGE...]

案例:

docker image inspect nginx:1.23.3

image-20230708231733788

也可以使用image的id查看镜像的具体信息:

docker image inspect 

image-20230708231943651

docker tag

功能:标记本地镜像,将其归入某一仓库。

语法:

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

案例

docker tag nginx namespace/regname:v1.23.1
docker push

容器命令

docker run

功能:创建一个新的容器并运行一个命令

语法:

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

# 别名
docker container run

关键参数:

  • -d: 后台运行容器,并返回容器 ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为: 主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=“nginx-lb”: 为容器指定一个名称;
  • -h “mars”: 指定容器的 hostname;
  • -e username=“ritchie”: 设置环境变量;
  • –cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU 运行;
  • -m :设置容器使用内存最大值;
  • –network=“bridge”: 指定容器的网络连接类型;
  • –link=[]: 添加链接到另一个容器;
  • –volume , -v: 绑定一个卷
  • –rm :shell 退出的时候自动删除容器

什么是端口映射?

Docker 端口映射是指将容器内的端口映射到主机上的端口,使得外部可以通过主机的端口访问容器中的应用。这样可以在不更改应用代码的情况下在本地开发和生产环境中运行相同的应用。映射端口的方法可以在运行容器时指定,如 “docker run [image] -p 主机端口:容器端口”。

image-20230709000803074

docker run不带参数

下面我们是实现一个centos 7容器的运行:

docker pull centos:7
docker run centos:7

image-20230709005716967

我们使用docker ps查看运行中的容器时,发现centos7并没有正常运行。使用docker ps -a查看,发现centos7运行过,只是退出了:

image-20230709005933668

这是因为这是一个bash命令,当我们不输入指令时,bash就自动退出了。下面是正确的交互命令:

docker run -it centos:7 bash

image-20230709012319821

docker run -d参数

不带-d参数,容器是以前台的方式进行运行

docker run nginx:1.23.3

以前台的方式运行nginx:

image-20230709012606566

下面以后台的方式运行nginx:

docker run -d nginx:1.23.3

image-20230709012725206

docker run -it参数

-i: 以交互模式运行容器,通常与 -t 同时使用; -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用 。-i和-t参数往往需要配合着使用,才能实现和容器的交互。

docker run -it centos:7
hostname
ps -ef

image-20230709013217642

docker run -p参数:端口映射

-P: 随机端口映射,容器内部端口随机映射到主机的端口 ;-p: 指定端口映射,格式为: 主机(宿主)端口:容器端口;

我们一般很少随机的分配端口进行端口映射,一般都是指定端口进行映射。

docker run -p 80:80 nginx:1.23.3

image-20230709013940309

宿主机的80端口已经被占用,因此我们需要映射其他未被使用的端口。

docker run -p 8080:80 nginx:1.23.3

image-20230709014254516

将宿主机的8080端口和容器的80通过映射后,就可以通过浏览器访问8080端口,访问nginx容器。

docker run --name -h -e 参数

–name=“nginx-lb”: 为容器指定一个名称;-h “mars”: 指定容器的 hostname;-e username=“ritchie”: 设置环境变量;

–name命令使用:

docker run -d --name="mynginx1" nginx:1.23.3
docker ps
docker stop mynginx1
docker ps

image-20230709020053094

–h和–e的使用:

docker run -it --name="mycentos" -h mycentos -e myenv=test centos:7 bash

image-20230709020552427

docker run --cpuset-cpus参数

–cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU 运行;

cat /proc/cpuinfo  # 参考cpu的使用情况

image-20230709021009956

docker run -d nginx:1.23.3 --cpuset-cpus="0-2"

-m参数的使用:设置容器使用内存最大值;

docker run -d --name mynginx2 nginx:1.23.3
docker run -d --name mynginx3 -m 500m nginx:1.23.3

#使用docker stats查看容器的状态
docker stats mynginx2 mynginx3

image-20230709021645880

可以看到:mynginx容器的内存大小为500m。

docker run -link参数

–link=[]: 添加链接到另一个容器;

我们先运行一个centos:7容器,命名为mycentos1。

docker run -it --name="mycentos1" -h mycentos1 centos:7 bash

我们再运行另外一个centos:7容器,命名为mycentos2。并为mycentos2添加mycentos1的链接,并试着ping一下mycentos1:

docker run -it --name="mycentos2" -h mycentos2 --link mycentos1:mywebsite1 centos:7 bash

image-20230709022624575

可以看到,mycentos2可以ping通mycentos1,并且/etc/hosts文件中也有mycentos1的配置信息。

接下来,我们可以在mycentos1中试着ping一下mycentos2:

image-20230709022901282

可以看到mycentos1无法ping通mycentos2,说明docker --link建立链接是单向的。

docker run --rm参数

docker run --rm:shell 退出的时候自动删除容器 。

docker run -it --name="mycentos4" -h mycentos4 --rm centos:7 bash

image-20230709023434145

可以看到shell在退出后,自动的删除了容器。

docker ps命令

功能:列出容器

语法:

docker ps [OPTIONS]

# 别名
docker container ls, docker container list, docker container ps

关键参数:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • –format :指定返回值的模板文件。如 json 或者 table。
  • -l :显示tag为latest 的容器。
  • -n :列出最近创建的 n 个容器。
  • –no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

image-20230709024006421

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Docker】docker基础使用 的相关文章

随机推荐