首页 > 技术文章 > Docker基础

zhijiyiyu 2021-10-06 19:07 原文

Docker 基本管理


一: Docker 概述

1.1  Docker 是什么

  • Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源
  • Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。

Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。

image-20211006142342964



1.2 Docker 常用场景

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。



1.3 什么是容器

容器是一种轻量级,可移植,自包含的软件打包技术,是一种应用程序,可以在几乎任何地方以相同的方式运行。

一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。



1.4 容器的优点

  • 灵活:即使是在复杂的应用也可以集装箱化
  • 轻量级:容器利用并共享主机内核。
  • 可互换:可恶意即时部署更新和升级
  • 便携式:可以在本地构建,部署到云,并在任何地方运行
  • 可扩展:可以增加并自动分发容器副本
  • 可堆叠:可以垂直和即时堆叠服务



1.5 容器与虚拟机的区别

容器:

容器是在 linux上本机运行,并与其他容器共享主机内核,他运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。


虚拟机:

虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。


Docker容器和虚拟机的区别

特性 Docker容器 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎无 损耗可达50%
性能 接近原生 弱与
系统支持量(单机) 成百上千 几十个
隔离性 资源隔离/限制 完全隔离
镜像体积 镜像MB级别 虚拟机镜像GB级别



1.6 传统环境,虚拟机环境,容器环境的区别

传统环境:是在硬件资源上安装操作系统上安装 app


虚拟化环境:在硬件资源,操作系统上安装一层虚拟层,在虚拟层的基础上,将硬件资源划分,创建虚拟机,在虚拟机的基础上安装操作系统,再构建二进制环境,然后再安装app。对资源损耗大.


容器环境:在硬件资源,操作系统上构建容器引擎,运行容器,在容器内提供二进制环境,然后在二进制环境的基础上提供服务。对于资源的损耗远小于虚拟化环境.

img



1.7 容器在内核中支持的 2 种重要技术

docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过cgroups 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,而是随着使用扩展。)


Linux 的namespace (命名空间)

namespace 的六项隔离

namespace 系统调用参数 隔离内容
UTS CLONE_NEWUTS 主机名和域名
IPC CLONE_NEWWIPS 信号量,消息队列和共享内存
PID CLONE_NEWPID 进程编号
NETWORK CLONE_NEWNET 网络设备,网络栈,端口等
MOUNT CLONE_NEWNS 挂载点(文件系统)
USER CLONE_NEWUSER 用户和用户组(3.8以后的内核才支持)



1.8 Docker 的核心概念

镜像:

  • Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。镜像不包含任何动态数据,其内容在构建之后也不会被改变.
    • docker镜像只需要一个基础的base Image,按照需求不断的叠加就可以了。
    • 共享一份基础的。一个基础镜像出现多个容器,如果容器内的etc文件被修改,但是基础镜像的是不会被改变的。
    • 修改只会在单个的容器内。 例如要安装一个tomcat镜像,新的镜像是在基础的linux下一层一层叠加上来的。
  • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容代码,运行时间,库,环境变量和配置文件。
  • Docker镜像也是一个压缩包只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是docker镜像的精髓。

容器:

  • Docker 的容器是从镜像创建的运行实例,它可以被启动,停止和删除。所创建的每一个容器都是相互隔离,互不可见,以保证平台的安全性
  • 容器是一种轻量级,可移植,自包含的软件打包技术,是一种应用程序,可以在几乎任何地方以相同的方式运行。
  • 可以把容器看做一个简易版的Linux环境(包括root用户权限,尽享空间,用户空间和网络空间等)和运行在其中的应用程序。一个Docker容器包含了所有的某个应用运行所需要的环境

仓库:

  • Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(public)或者私有仓库库(Private)。当下次要在另外一台机器上使用这个镜像时,只需要从仓库获取
  • 公共仓库和私有仓库最大的却别就是网速,公共仓库从公网,私有仓库是从局域网,速度的差别,安全性,公共的肯定没有私有的安全,保存在自己的硬盘上是最稳的

Docker 的镜像,容器,日志等内容全部都默认存储在/var/lib/docker目录下



1.9 为什么镜像如此小

比如centos7.5 的系统镜像,虚拟机的该系统镜像是以GB为单位,然而docker的镜像却只是以MB为单位。


linux操作系统是由内核空间和用户空间组成的,内核空间就是kernel,linux刚启动的时候会加载这个bootfs文件系统,之后这个bootfs会卸载掉,用户文件系统就是rootfs,包含dev,bin等目录。

对于刚下载的centos这个镜像来说,底层会使用docker的内核,自己只需要提供用户空间就可以了 ,对于精简的系统用户空间可以很小,只需要包括最基本的命令和程序库就可以了

我们平时安装的centos除了最基本的还会安装很多的软件,服务,图形桌面等等,所以会有好几个g大小



1.10 小结

容器

  • 提供在多台主机上运行应用程序相同的运行环境

docker

  • 开源的容器引擎,由GO语言开发,是容器运行应用的工具,是一个轻量级的虚拟机。可以利用docker 在多台主机上轻松创建并运行容器
  • docker 容器可以被看作运行在宿主机上的一个进程,容器共享宿主机的内核。容器是通过namespace(命名空间)隔离资源,通过cgroups(资源配额)去限制资源

核心概念

  • 镜像:运行容器的基础,包含运行你应用程序所需的所有内容
  • 容器:是从镜像创建的运行实例
  • 仓库:集中保存镜像的地方,分为公有仓库(docker hub),私有仓库(harbor)





二:安装Docker

目前,Docker 只能支持64 位系统

systemctl stop firewalld

setenforce 0


2.1 安装依赖包

#关闭防火墙和selinux
[root@host103 ~]# systemctl disable --now firewalld
[root@host103 ~]# setenforce 0

#将系统的网络源从备用中移出,启用
[root@host103 ~]# cd /etc/yum.repos.d/
[root@host103 yum.repos.d]# ls
bak  local.repo
[root@host103 yum.repos.d]# mv bak/* .

#安装依赖包
[root@host103 yum.repos.d]# yum -y  install \
yum-utils device-mapper-persistent-data lvm2

yum-utils:

  • ​ 提供了 yum-config-manager 工具

device mapper:

  • 是Linux 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
  • device mapper 存储驱动程序需要 device-mapper-persistent-data lvm2



2.2 设置阿里云镜像源,安装并启动Docker-ce

#配置阿里云镜像源
[root@host103 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@host103 ~]# ls /etc/yum.repos.d/docker-ce.repo 
/etc/yum.repos.d/docker-ce.repo

[root@host103 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@host103 ~]# yum makecache fast

img

img

img



2.3 安装Docker-CE

#安装Docker-CE,并启动,同时设置为开机自启
[root@host103 ~]# yum -y install docker-ce
[root@host103 ~]# systemctl enable --now docker.service 

#查看docker的版本信息
[root@host103 ~]# docker version

#查看当前docker的详细信息
[root@host103 ~]# docker info

安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker 服务端是一个服务进程,负责管理所有容器。

Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下,Docker服务端和客户端运行在一台机器上


image-20211006163850482

image-20211006165408776

img



三:docker 的镜像操作

3.1 搜索镜像

格式: docker search 关键字

#搜索nginx的镜像
[root@host103 ~]# docker search nginx

image-20211006170111641



3.2 获取镜像

格式: docker   pull   仓库名称[:标签]

如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

#拉取 镜像 nginx
[root@host103 ~]# docker pull nginx

image-20211006170639584



3.3 镜像加速下载

(阿里云的镜像加速: 控制台---->在产品与镜像服务搜索容器镜像服务----> 镜像工具------>镜像加速器)

查看加速器地址,选择相应的操作系统,查看操作文档

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://k0ki64fw.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker

img

img

img

image-20211006174114285



3.4 查看镜像信息

镜像下载后存放在 /var/lib/docker

#镜像文件存放在 /var/lib/docker 目录中
[root@host103 ~]# ls /var/lib/docker/

#查看下载的镜像文件信息
[root@host103 ~]# cat  /var/lib/docker/image/overlay2/repositories.json

#查看下载到本地的所有镜像信息
[root@host103 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    f8f4ffc8092c   8 days ago   133MB

#REPOSITORY: 镜像所属仓库
#TAG: 镜像的标签信息,标记同一个仓库中的不同镜像
#IMAGE ID :镜像的唯一ID号,唯一标识一个镜像
#CREATED:  镜像创建时间
#SIZE: 镜像大小

image-20211006175100068

image-20211006175429713



3.5 根据镜像的唯一标识ID 号,获取镜像的详细信息

格式:docker    inspect    镜像ID号

镜像ID 号可以不用打全。

[root@host103 ~]# docker inspect f8f4

image-20211006180139241



3.6 为本地镜像添加新的标签

格式: docker   tag  名称:[ 标签]

[root@host103 ~]# docker tag nginx:latest nginx:nginx01
[root@host103 ~]# docker images | grep nginx
nginx        latest    f8f4ffc8092c   8 days ago   133MB
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB

[root@host103 ~]# docker tag nginx:latest web:nginx01
[root@host103 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    f8f4ffc8092c   8 days ago   133MB
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB
web          nginx01   f8f4ffc8092c   8 days ago   133MB

image-20211006180601141



3.7 删除镜像

格式1: docker   rmi   仓库名称:标签

当一个镜像有多个标签时,只是删除其中指定的标签


格式2: docker   rmi  镜像ID  [-f]

会彻底删除镜像


注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像

#通过仓库:标签 删除镜像
[root@host103 ~]# docker rmi web:nginx01 
Untagged: web:nginx01
[root@host103 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    f8f4ffc8092c   8 days ago   133MB
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB


#使用镜像ID号删除,直接删除则报错。
[root@host103 ~]# docker rmi f8f4
Error response from daemon: conflict: unable to delete f8f4ffc8092c (must be forced) - image is referenced in multiple repositories

#使用镜像号彻底删除该镜像, 要使用 -f 表示强制
[root@host103 ~]# docker rmi f8f4 -f
Untagged: nginx:latest
Untagged: nginx:nginx01
Untagged: nginx@sha256:06e4235e95299b1d6d595c5ef4c41a9b12641f6683136c18394b858967cd1506

[root@host103 ~]# docker images

image-20211006184028771

image-20211006184308754



3.8 存储镜像

将镜像保存为本地文件。

格式: docker   save   -o  存储文件名   存储的镜像

[root@host103 ~]# docker save -o  /opt/nginx nginx:latest
[root@host103 ~]# ls /opt/nginx 
/opt/nginx

image-20211006184620970



3.9 载入镜像

将镜像文件导入到镜像仓库中

格式1: docker   load   <   存储的文件


格式2: docker   load   i   存储的文件

[root@host103 ~]# docker load < /opt/nginx
[root@host103 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    f8f4ffc8092c   8 days ago   133MB

image-20211006184958898



3.10 上传镜像到公有仓库

默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com

可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。(docker logout 登出)

在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

#使用docker login 输入用户名密码登录注册的公有仓库账号
[root@host103 ~]# docker login
Username:zhijiyiyu
Password:

#添加新的标签。在前面添加上自己的dockerhub的username
[root@host103 ~]# docker tag nginx:latest   zhijiyiyu/nginx:web

#上传镜像
[root@host103 ~]# docker push zhijiyiyu/nginx:web

#退出登录
[root@host103 ~]# docker logout

image-20211007161952087

推荐阅读