Docker基础——Docker Server安装(ubuntu)和Docker镜像相关命令

目录

安装 docker

Docker Server安装步骤

Docker 镜像源修改

Docker目录修改

Docker生态

新时代软件诉求

Docker 解决方案

Docker Registry(镜像仓库)

什么是 Docker Registry

镜像仓库分类

镜像仓库工作机制

镜像仓库命令

docker login

docker pull

docker push

docker search

docker logout

镜像命令

docker images

docker image inspect

docker tag

容器命令(run和ps)

docker run

docker ps


安装 docker

Docker Sverver支持的os

Docker Server安装步骤

1、确定 CPU,可以看到我们的是 X86_64,是支持的,如果是 arm 一般会显示aarch64,我们ubuntu是X86架构的

2、配置 docker 下载源

#curl 命令安装

sudo apt install curl -y

#创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
#下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3、安装

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

4、自启动配置

#配置加载

sudo systemctl daemon-reload

#启动服务

sudo systemctl start docker

#开启启动

sudo systemctl enable docker

#查看服务状态

sudo systemctl status docker

5、检查安装版本

Docker 镜像源修改

对于使用 systemd 的系统(Ubuntu 16.04+、Debian 8+、CentOS 7), 如果是腾讯云在配置文件 /etc/docker/daemon.json 中加入

JSON

{

"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]

}

如果是阿里云,因为只对企业开放海外代理,只能找私人的一些开放的源,目前可以使用的源如下:

{

"registry-mirrors": [

"https://docker.m.daocloud.io",

"https://dockerhub.timeweb.cloud",

"https://huecker.io"

]

}

重新启动 dockerd:

sudo systemctl daemon-reload

sudo systemctl restart docker

Docker目录修改

Docker 默认的安装目录为/var/lib/docker,这里面会存放很多很多镜像,所以我们在安装的时候需要考虑这个目录的空间,有三种解决方案。

(1)将/var/lib/docker 挂载到一个大的磁盘,这种一般我们能控制挂载目录,像腾讯云这种云厂商在安装 K8s 的节点的时候提供了挂载选项,可以直接挂载这个目录过去

(2)安装之前挂载一个大的磁盘,然后创建一个软链接到/var/lib/docker,这样就自动安装到我们空间比较大的磁盘了

(3)安装了 docker,然后发现忘了配置这个目录,我们需要修改 docker 的配置文件

#假定我们磁盘的大的目录为 /data

mkdir -p /data/var/lib/docker

# 编辑配置文件

vi /etc/docker/daemon.json

# 输入下面的 json

{

"data-root": "/data/var/lib/docker"

}

# 加载配置

sudo systemctl daemon-reload

# 重启 docker

sudo systemctl restart docker

#查看 docker 状态

sudo systemctl status docker

Docker生态

新时代软件诉求

我们来考虑 2 个问题,Docker 为什么要设计镜像,然后又搭建个 Docker Hub,搞个镜像仓库呢?

我们来看下现在的时代发生了什么

数据量疯狂增长:

随着物联网、边缘计算等智能终端设备不断普及,受到来自物联网设备信号、元数据、娱乐相关数据、云计算和边缘计算的数据增长的驱动,全球数据量呈现加速增长。根据 IDC 分布的《数据时代 2025》预测,全球数据量将从 2018 年的 33ZB 增至 2025年的 175ZB,增长超过 5 倍;中国平均增速快于全球 3%,预计到 2025 年将增至48.6ZB,占全球数据圈的比例由 23.4%提升27.8%。其中,中国企业级数据量将从2015 年占中国数据量的 49%增长到 2025 年的 69%。

处理能力快速增加:

腾讯云全球服务器数量 100w+,数据量 EB+;2020 年阿里云:在全国已建成 5 大超级数据中心,阿里云在全球 22 个地域部署了上百个数据中心,服务器的总规模数已经接近 200 万台。

某省疾控中心疫苗预约系统、全员核酸检测系统、健康码系统共 300 余台服务器,并为核酸检测系统快速扩容计算和存储资源

软件需求爆发式增长:

  • 研发模式从瀑布开发演变为敏捷开发,原来 3 个月上一次新功能,现在两周一次,而开发过程中我们也经常遇到需要修改需求,然后变更再发布的情况
  • 软件上线有问题需要快速回滚,对软件有着极强的版本管理和回滚诉求。
  • 软件的研发人员、研发公司在设计、研发好一款软件的时候,如何方便的共享给他人,而又能快速的使用起来
  • 每个项目组使用的语言不一样,需要不同的环境,每个都得搞一套。每次都要一个个完成部署安装,每次都有各种奇怪的问题

Docker 解决方案

云时代需要我们针对这些诉求有一套针对的解决方案。

我们要处理海量的数据,如何处理呢?

购买大量的服务器,并研发对应软件

开发的需求需要频繁的变更上线,如何才能将修改的代码快速的分发到几百或者几千台服务器呢?如何共享软件呢?

搞一个中心仓库,让各个服务器去下载软件包,安装,所以 CentOS 搞了 yum 仓库,docker 设计了镜像仓库,docker hub 是公共的托管仓库。

软件设计好以后,怎么快速安装启动,有问题回滚呢?

将 docker 需要的所有信息设计一套软件格式,把所有的依赖搞进去,并打上版本标签,这样不会换一个服务器各种问题,所以 Docker 设计了镜像。

不同的开发环境怎么搭建呢,一会 java,一会 c++?

docker 设计了镜像来应对,镜像里面存放了需要运行的环境,就像我们的 iPhone 内置 ios,我们的华为 mate 50 内置鸿蒙一样,一条命令就可以完成某个环境的搭建。

Docker Registry(镜像仓库)

什么是 Docker Registry

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

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

镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com;一个 Registry 中可以存在多个Repository·Repository 可分为“顶层仓库”和“用户仓库”;·用户仓库名称格式为“用户名/仓库名”·每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像

Repository: ·由某特定的 docker 镜像的所有迭代版本组成的镜像仓库镜像名称(name)+标签(tag):如 nginx:latest

认证能力:提供用户注册,登录、登出能力

索引:提供镜像的索引信息,方便检索

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

镜像仓库分类

按是否对外开放划分,也是研发人员常说的

1)公有仓库:像阿里云、dockerhub等放到公有网络上,不用登录就可以下载镜像,供大家访问使用

(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。

按供应商和面向群体划分

(1)sponsor(赞助)registry:第三方的registry,供客户和docker社区版使用

(2)mirror(镜像)registry:第三方的registry,只让客户使用,例如阿里云必须注册才能使用

(3)vendor(供应商) registry:由发布docker镜像的供应商提供的registry,例如像Google 和Redhat提供了镜像仓库服务

(4)private registry:通过没有防火墙和额外的安全层的私有实体提供的registry,仅供内部使用

镜像仓库工作机制

镜像仓库使用流程 :

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

Docker HubDocker提供的托管存储库服务,用于查找容器映像并与您的团队共享。具有以下功能:

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

2)提供镜像检索能力

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

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

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

私有仓库

私有镜像仓库则是指部署在公司或组织内部,用于自身应用Docker镜像存储、分发的镜像仓库。在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应用的打包镜像一般情况下只会被存储在私有镜像仓库中,CI/CD流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操作来完成的

镜像仓库命令

docker login

功能:登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 DockerHub

语法:

docker login [OPTIONS] [SERVER]

关键参数:

-u :登陆的用户名

-p :登陆的密码

docker pull

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

语法:

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

关键参数:

-a :拉取所有tagged镜像

--disable-content-trust :忽略镜像的校验,默认开启

docker push

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

语法:

docker push [OPTIONS] NAME[:TAG]

关键参数:

-a :推送所有tagged镜像

--disable-content-trust :忽略镜像的校验,默认开启

docker search

功能 :从 Docker Hub查找镜像,因docker网站被封,该命令暂时国内无法实操,需要国外网络联系。

语法:

docker search [OPTIONS] TERM

关键参数:

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

功能:登出一个 Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库Docker Hub

语法:

docker logout [SERVER]

镜像命令

docker images

功能 :列出本地镜像

语法:

docker images [OPTIONS] [REPOSITORY[:TAG]]

关键参数:

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

--digests :显示镜像的摘要信息;

-f :显示满足条件的镜像;

--format :指定返回值的模板文件;

--no-trunc :显示完整的镜像信息;

-q :只显示镜像ID

docker image inspect

功能 :查看镜像详细信息

语法:

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

docker tag

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

语法:

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

容器命令(run和ps)

docker run

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

语法:

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

关键参数:

-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 ps

功能 :列出容器

语法:

docker ps [OPTIONS]

关键参数:

-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。如json或者table

-l :显示latest的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。