🍅即日起,更新云原生相关知识,喜欢的小伙伴可以给专栏点个关注喔
🍅收录至专栏 云原生
目录
一、 Docker 概述
1.1 IT架构演变
云计算涌现出很多改变传统IT架构和运维方式的新技术,比如虚拟机、容器、微服务、Serverless(无服务),无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题
1.运行物理机,也称为裸金属
2.虚拟机VM,可以在一台物理机上创建多个虚拟机,并把物理配置分发成多个虚拟配置
缺点:性能损耗大,大约损耗50%
虚拟机常用软件:
VMware workstation(windows)
vm Sphere+ESXI (Windows server)
KVM(linux内核)
3.容器 (常用软件:docker、podman、rocket、container)
容器内部自身有一个小型操作系统
4.函数(函数化,代码化)
1.2 Docker 是什么
- Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源
- Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
- Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。
Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
1.3 Docker的设计宗旨
Build,Ship and Run Any App,Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
1.4 Docker特点
容器化越来越受欢迎,因为容器是:
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并白动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。
1.5 Docker与KVM(虚拟机)的区别
1****、隔离与共享
虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核、文件系统、硬件等资源。
2****、性能与损耗
与虚拟机相比,容器资源损耗要少。同样的宿主机下,能够建立容器的数量要比虚拟机多
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor层,这是极其困难的
而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。
不同点Docker容器虚拟机启动速度快,几秒钟慢,几分钟运行性能接近原生(直接在内核中运行)运行于Hypervisor上,50%左右损失磁盘占用小,甚至几十KB(根据镜像层的情况)非常大,上GB并发性一台宿主机可以启动成百上千个容器最多几十个虚拟机隔离性进程级别 | 资源隔离/限制系统级别(更彻底)| 完全隔离操作系统主要支持Linux几乎所有(KVM)封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离
1.6 容器在内核中支持2种重要技术
docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过cgroups 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,而是随着使用扩展)
1.7 Linux 的namespace (命名空间)
namespace 的六项隔离
namespace系统调用参数隔离内容UTSCLONE_NEWUTS主机名和域名IPCCLONE_NEWWIPS信号量,消息队列和共享内存PIDCLONE_NEWPID进程编号NETWORKCLONE_NEWNET网络设备,网络栈,端口等MOUNTCLONE_NEWNS挂载点(文件系统)USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)
1.8 Docker运行流程
二、Docker核心概念
- 镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
- 容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
- 仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker
三、安装docker
目前docker只支持64位系统
#关闭防火墙
systemctl stop firewalld.service
setenforce 0
3.1 安装依赖包(使用在线源)
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:
- 提供了 yum-config-manager 工具
device mapper:
- 是Linux 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
- device mapper 存储驱动程序需要 device-mapper-persistent-data lvm2
3.2 设置阿里云镜像源,安装并启动Docker-ce
#配置阿里云镜像源[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装Docker-CE并设置为开机自启
#安装Docker-CE,并启动,同时设置为开机自启[root@localhost ~]# yum -y install docker-ce[root@localhost ~]# systemctl enable --now docker.service #查看docker的版本信息[root@localhost ~]# docker version#查看当前docker的详细信息[root@localhost ~]# docker info
目前多数公司使用的docker是19版本的
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker 服务端是一个服务进程,负责管理所有容器。
Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下,Docker服务端和客户端运行在一台机器上
[root@localhost yum.repos.d]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 0#有多少容器
Running: 0#正在运行的数量
Paused: 0#暂停的数量
Stopped: 0#停止的数量
Images: 0#镜像的数量
Server Version: 20.10.17 #服务端版本号
Storage Driver: overlay2 #文件类型的驱动引擎
Backing Filesystem: xfs #文件系统类型
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs #Cgroup引擎类型
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc version: v1.1.2-0-ga916309
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64 #当前系统的内核版本#以下是当前系统的信息,因为docker共享系统配置
Operating System: CentOS Linux 7(Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.781GiB
Name: localhost.localdomain
ID: LQWK:2C26:54YI:XEIW:XZP3:Q44T:LB3J:3PAC:LKE3:HMNW:YE3Q:7FIN
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/ #默认仓库地址
Labels:
Experimental: false
Insecure Registries: #指定私有仓库地址127.0.0.0/8
Live Restore Enabled: false
四、Docker镜像操作
4.1 搜索镜像
格式: docker search 关键字
#搜索nginx的镜像[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16974[OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 169
bitnami/nginx Bitnami nginx Docker Image 131[OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 52
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 18[OK]
rancher/nginx-ingress-controller 10
clearlinux/nginx Nginx reverse proxy server with the benefits… 4
ibmcom/nginx-ingress-controller Docker Image for IBM Cloud Private-CE (Commu… 4
bitnami/nginx-ldap-auth-daemon 3
rancher/nginx 2
bitnami/nginx-exporter 2
vmware/nginx 2
rancher/nginx-ingress-controller-defaultbackend 2
circleci/nginx This image is for internal use 2
vmware/nginx-photon 1
rapidfort/nginx RapidFort optimized, hardened image for NGINX 1
bitnami/nginx-intel 1
kasmweb/nginx An Nginx image based off nginx:alpine and in… 1
wallarm/nginx-ingress-controller Kubernetes Ingress Controller with Wallarm e… 1
ibmcom/nginx-ingress-controller-ppc64le Docker Image for IBM Cloud Private-CE (Commu… 0
rancher/nginx-conf 0
rancher/nginx-ssl 0
continuumio/nginx-ingress-ws 0
rancher/nginx-ingress-controller-amd64 0
ibmcom/nginx-ppc64le Docker image for nginx-ppc64le 0
4.2 获取镜像
格式: docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
#拉取镜像nginx[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
42c077c10790: Pull complete
62c70f376f6a: Pull complete
915cc9bd79c2: Pull complete
75a963e94de0: Pull complete
7b1fab684d70: Pull complete
db24d06d5af4: Pull complete
Digest: sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981bafbb884165e514
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@localhost ~]# [root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
[root@localhost ~]# #拉取soscscs仓库中myapp镜像的v1标签[root@localhost ~]# docker pull soscscs/myapp:v1
v1: Pulling from soscscs/myapp
550fe1bea624: Pull complete
af3988949040: Pull complete
d6642feac728: Pull complete
c20f0a205eaa: Pull complete
438668b6babd: Pull complete
bf778e8612d0: Pull complete
Digest: sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Status: Downloaded newer image for soscscs/myapp:v1
docker.io/soscscs/myapp:v1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
soscscs/myapp v1 d4a5e0eaa84f 4 years ago 15.5MB
[root@localhost ~]#
4.3 镜像加速(阿里云)
获取镜像加速地址
[root@localhost yum.repos.d]# cd /etc/docker/[root@localhost docker]# ls
key.json
[root@localhost docker]# vim daemom.json[root@localhost docker]# systemctl daemon-reload[root@localhost docker]# systemctl restart docker[root@localhost docker]#
4.4 查看镜像信息
镜像下载后存放在 /var/lib/docker
#镜像文件存放在 /var/lib/docker 目录中[root@localhost ~]# cd /var/lib/docker/[root@localhost docker]# ls
buildkit image overlay2 runtimes tmp volumes
containers network plugins swarm trust
---------------------------------------------------------------------------------
#image 存放镜像信息#overlay2 镜像底层文件相关信息#containers 存放容器信息
---------------------------------------------------------------------------------
#查看下载的镜像文件信息[root@localhost ~]# cat /var/lib/docker/image/overlay2/repositories.json#查看下载到本地的所有镜像信息[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f8f4ffc8092c 8 days ago 133MB
#REPOSITORY: 镜像所属仓库#TAG: 镜像的标签信息,标记同一个仓库中的不同镜像#IMAGE ID :镜像的唯一ID号,唯一标识一个镜像#CREATED: 镜像创建时间#SIZE: 镜像大小
4.5 根据镜像的唯一标识ID 号,获取镜像的详细信息
格式: docker inspect 镜像ID号
镜像ID 号可以不用打全。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
soscscs/myapp v1 d4a5e0eaa84f 4 years ago 15.5MB
[root@localhost ~]# docker inspect 0e901e68141f[{"Id":"sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:2bcabc23b45489fb0885d69a06ba1d648aeda973fae7bb981baf
],
....................
4.6 为本地镜像添加新的标签
格式: docker tag 名称:[ 标签]
[root@localhost ~]# docker tag nginx:latest nginx:stevelu[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
nginx stevelu 0e901e6814
1f 3 weeks ago 142MB
soscscs/myapp v1 d4a5e0eaa84f 4 years ago 15.5MB
4.7 删除镜像
格式1: docker rmi 仓库名称:标签
当一个镜像有多个标签时,只是删除其中指定的标签
格式2: docker rmi 镜像ID [-f]
会彻底删除镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
#通过仓库:标签 删除镜像[root@localhost ~]# docker rmi nginx:stevelu
Untagged: nginx:stevelu
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
soscscs/myapp v1 d4a5e0eaa84f 4 years ago 15.5MB
[root@localhost ~]# #使用镜像ID号删除,如果有多个标签只删除其中一个标签#使用镜像号彻底删除该镜像, 要使用 -f 表示强制
root@localhost ~]# docker rmi d4a5e0eaa84f
Untagged: soscscs/myapp:v1
Untagged: soscscs/myapp@sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Deleted: sha256:d4a5e0eaa84f28550cb9dd1bde4bfe63a93e3cf88886aa5dad52c9a75dd0e6a9
Deleted: sha256:bf5594a16c1ff32ffe64a68a92ebade1080641f608d299170a2ae403f08764e7
Deleted: sha256:b74f3c20dd90bf6ead520265073c4946461baaa168176424ea7aea1bc7f08c1f
Deleted: sha256:8943f94f7db615e453fa88694440f76d65927fa18c6bf69f32ebc9419bfcc04a
Deleted: sha256:2020231862738f8ad677bb75020d1dfa34159ad95eef10e790839174bb908908
Deleted: sha256:49757da6049113b08246e77f770f49b1d50bb97c93f19d2eeae62b485b46e489
Deleted: sha256:d39d92664027be502c35cf1bf464c726d15b8ead0e3084be6e252a161730bc82
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
4.8 存储镜像
将镜像保存为本地文件。
格式: docker save -o 存储文件名 存储的镜像
[root@localhost ~]# docker save -o /opt/nginx.tar nginx:latest[root@localhost ~]# ls /opt/
containerd nginx.tar rh
#将本地镜像传给另一台主机[root@localhost ~]# scp /opt/nginx.tar 192.168.109.134:/opt
The authenticity of host'192.168.109.134 (192.168.109.134)' can't be established.
ECDSA key fingerprint is SHA256:uk2RhFkZuoTGCWvs9fyAQSNjlTa7Lz/pi4TLhyIydDU.
ECDSA key fingerprint is MD5:0a:a2:e0:b1:ab:3e:3d:de:37:12:4b:84:e5:1f:ac:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.109.134' (ECDSA) to the list of known hosts.
[email protected]'s password:
nginx.tar 100% 139MB 87.4MB/s 00:01
4.9 载入镜像
将镜像文件导入到镜像仓库中
格式1: docker load < 存储的文件
格式2: docker load i 存储的文件
#在192.168.109.134主机加载[root@localhost opt]# docker load -i nginx.tar#或[root@localhost opt]# docker load < nginx.tar
4.10 上传镜像到公有仓库
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。(docker logout 登出)
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传
#上传到公共仓库,必须在前面添加上自己的dockerhub的仓库名[root@localhost ~]# docker tag nginx:latest stevelugyq/nginx[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
stevelugyq/nginx latest 0e901e68141f 3 weeks ago 142MB
[root@localhost ~]# #使用docker login 输入用户名密码登录注册的公有仓库账号[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: stevelugyq
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#上传镜像[root@localhost ~]# docker push stevelugyq/nginx
Using default tag: latest
The push refers to repository [docker.io/stevelugyq/nginx]
33e3df466e11: Mounted from library/nginx
747b7a567071: Mounted from library/nginx
57d3fc88cb3f: Mounted from library/nginx
53ae81198b64: Mounted from library/nginx
58354abe5f0e: Mounted from library/nginx
ad6562704f37: Mounted from library/nginx
latest: digest: sha256:25dedae0aceb6b4fe5837a0acbacc6580453717f126a095aa05a3c6fcea14dd4 size: 1570#退出登录[root@localhost ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
[root@localhost ~]# #拉取上传到自己仓库的镜像[root@localhost ~]# docker pull stevelugyq/nginx
Using default tag: latest
latest: Pulling from stevelugyq/nginx
42c077c10790: Pull complete
62c70f376f6a: Pull complete
915cc9bd79c2: Pull complete
75a963e94de0: Pull complete
7b1fab684d70: Pull complete
db24d06d5af4: Pull complete
Digest: sha256:25dedae0aceb6b4fe5837a0acbacc6580453717f126a095aa05a3c6fcea14dd4
Status: Downloaded newer image for stevelugyq/nginx:latest
docker.io/stevelugyq/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
stevelugyq/nginx latest 0e901e68141f 3 weeks ago 142MB
总结
面试常问
- docker是什么?能干什么?
docker是基于go语言开发的开源容器引擎,可以在任何主机上运行容器应用,并且每个容器都是一个轻量级的虚拟机
docker 容器和虚拟机的区别?
不同点Docker容器虚拟机启动速度快,几秒钟慢,几分钟运行性能接近原生(直接在内核中运行)运行于Hypervisor上,50%左右损失磁盘占用小,甚至几十KB(根据镜像层的情况)非常大,上GB并发性一台宿主机可以启动成百上千个容器最多几十个虚拟机隔离性进程级别 | 资源隔离/限制系统级别(更彻底)| 完全隔离操作系统主要支持Linux几乎所有(KVM)封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离linux六大namespace?
namespace系统调用参数隔离内容UTSCLONE_NEWUTS主机名和域名IPCCLONE_NEWWIPS信号量,消息队列和共享内存PIDCLONE_NEWPID进程编号NETWORKCLONE_NEWNET网络设备,网络栈,端口等MOUNTCLONE_NEWNS挂载点(文件系统)USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)docker三大核心概念?
镜像、容器、仓库
镜像管理命令
命令说明docker info查看信息docker version / docker -v查看版本docker search <仓库/镜像>查找镜像docker pull <镜像名称>获取镜像docker images查看docker下载的镜像docker inspect <镜像ID>查看镜像详细信息docker rmi <镜像ID/镜像名称:标签> [ -f ]删除镜像docker save -o 导出文件.tar 镜像名称:标签存储镜像docker load -i 或 [<] 镜像文件导入镜像docker login登录仓库docker push 仓库名/镜像名:标签上传镜像到仓库
版权归原作者 Steve lu 所有, 如有侵权,请联系我们删除。