Docker_v1

Docker / 2023-01-10

Docker_v1

一、云原生介绍

到底什么是云原生?

(一)、什么是容器化

  • 基于CGroup原理实现的针对操作系统进程隔离管理的一种打包技术,容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器完全隔离,拥有自己独立的的ip地址,系统文件,主机名,进程管理
    • 实现容器化的方案产品:docker、docker swarm

Docker核心原理之 Cgroup详解

(二)、什么是虚拟化

  • 基于宿主机,虚拟物理硬件(CPU、内核、内存、磁盘),从而实现在一个机器中,同时存在多个操作系统的方案
    • 实现虚拟化技术的方案产品:kvm,vmware-esxi,openstack

(三)、容器和虚拟机的区别

1、虚拟机

  • 需要宿主机的硬件支持(开启虚拟化)
  • 对宿主机硬件性能消耗较大
  • 虚拟化主机性能效率较差

2、容器

  • 执行效率高
  • 对操作系统资源消耗少(只是以一个隔离的进程运行的,而虚拟机需要虚拟各硬件然后虚拟内核,再虚拟操作系统)
  • 轻量化,能够实现秒级启动与关闭
  • 相较于虚拟机来说,稳定性较差
特性 容器 虚拟机
启动速度 秒级 分钟级
算力损耗 几乎无 损耗50%左右
性能 接近原生 弱于
系统支持量 上千个 几十个
隔离性 资源限制 完全隔离
e3ae4edbab790889652a344b9fb4e91b

二、什么是Docker

(一)、介绍

  • docker是一种打包技术,通过共用宿主机的内核、CPU,在此基础上通过依赖一些根镜像,打包成一个独立的空间,这个空间是于其他系统完全隔离的,在此空间内可以用于运行一些应用程序。
  • 隔离是Docker的核心思想,相当于打包集装箱,每一个箱子都是相互隔离的。而通过Docker能将服务器的性能利用到极致。

(二)、Docker隔离性的实现

虚拟化的技术是用来解决宿主机与虚拟机之间的耦合问题(俗称“解耦”),传统的虚拟化技术是属于完全解耦的,而Docker的虚拟化技术是属于半解耦的。

  • Namespace:解决进程、网络、文件系统的资源隔离问题。
  • CGroups:解决内存、CPU等物理资源隔离问题。
  • UnionFS:解决镜像问题。

Namespace 是Linux提供的一种内核级别隔离机制,提供了一下几个功能:

  • UTS:主机名或域名
  • IPC:信号,消息
  • PID:进程隔离
  • Network:网络隔离(ip,端口)
  • Mounted:设备挂载(文件系统)
  • user&group:用户,用户组完全独立

docker核心技术简介之namespace

容器核心:cgroups

耦合:就是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象;

解耦:解除耦合、冲突现象;

三、Docker安装

Docker 官方文档

## 环境准备,关闭防火墙及SElinux
systemctl disable iptables && iptables -F
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

## 配置时间同步
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org 
# 写入定时任务
crontab -e 
* */1 * * * /usr/sbin/ntpdate  cn.pool.ntp.org  &>/dev/null
# 重启crond服务使配置生效
systemctl restart crond

## 安装基础软件包
yum -y install  wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack yum-utils

## 安装docker依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

## 配置docker-ce国内yum源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 安装docker ce(社区版), ee是企业版
yum -y install docker-ce

## 配置镜像加速,如果配置多个加速站点需要用‘ , ’隔开
mkdir -p /etc/docker
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://gk0lnxyj.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
EOF
# 让配置文件生效
systemctl daemon-reload

### br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发
## 加载 br_netfilter 模块
modprobe br_netfilter
## 使用脚本实现开机自动加载br_netfilter模块
# 先创建模块文件
cat > /etc/sysconfig/modules/br_netfilter.modules <<EOF
modprobe br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
# 使用脚本for循环加载创建的模块文件
cat > /etc/rc.sysinit <<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF

## 开启包转发功能和修改内核参数
# 如果将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。当linux主机有多个网卡时一个网卡收到的信息是否能否传递给其他的网卡,取决于ip_forward的设置。如果设置成1的话,则可以进行数据包转发,可以实现Vx LAN等功能。如果不开启会导致docker部署应用无法访问。
cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 使参数生效
sysctl -p /etc/sysctl.d/docker.conf

## 启动docker,并设置开机自启
systemctl start docker && systemctl enable docker

## 使用docker version 查看是否安装成功
docker version

Docker Hub镜像加速器列表

四、Docker镜像

(一)、什么是镜像

  • 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
  • 镜像是只读层,而容器在启动时会在镜像最外层上建立一层可读写的容器层

(二)、联合文件系统

  • Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是 Docker 镜像的基础。基于基础镜像,可以制作各种具体的应用镜像
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
  • 所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。

(三)、镜像命令

1、Docker镜像的基础管理命令

## 查看所有镜像(images是 image ls 的简写),-aq 可接可不接,根据实际情况来定
docker images -aq
	· -a 	 # 列出所有镜像
	· -q  	 # 只显示镜像id

## 查看镜像元数据信息
docker image inspect image:tag
	· inspect:获取容器或者镜像的元数据

## 用于打印出指定 Docker镜像 的历史版本信息,构建过程
docker history image:tag
	· --no-trunc:显示完整的提交记录
	· -q:仅列出提交记录 ID
	· -H:以可读的格式打印镜像大小和日期,默认

## 搜索镜像
docker search 镜像名
	· --filter=STARS=3000  # 可接该参数,搜索出来的镜像就是STARS大于3000的

## 下载镜像,可直接下载镜像,也可以指定版本镜像下载,也可直接写真实下载地址,如果不写版本,默认是最新的
docker pull 镜像名:版本(真实下载地址)

## 给镜像打版本标签,删除改过版本标签的镜像不会影响到源镜像
docker tag 镜像名:版本 镜像名:要改的版本标签

## 以压缩包的形式导出镜像
docker save 镜像:版本 -o xxx.tar.gz	
	· -o:输出的意思
	· 翻译:将 “镜像:版本” 输出到 “xxx.tar.gz” 中

## 导入镜像
docker load  -i xxx.tar.gz
	· -i:导入
	· 翻译:将 “xxx.tar.gz” 导入到docker中

## 删除镜像
docker rmi -f 镜像id(名字:版本)  	# 删除指定镜像
docker rmi -f 镜像id 镜像id 镜像id       # 删除多个镜像
docker rmi -f $(docker images -aq)     # 删除全部镜像

## 清理none镜像(虚悬镜像)
docker image prune

## 清理无容器使用的镜像
docker image prune -a

## 清理没有使用的数据
docker system prune

# 查看docker整体磁盘使用率的情况
docker system df -v(详细信息)

2、Docker查看及搜索镜像详解

[root@docker ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
centos                latest    5d0da3dc9764   7 months ago    231MB
# 解释
REPOSITORY  	# 镜像的仓库源
TAG         	# 镜像标签
IMAGE ID    	# 镜像id
CREATED     	# 镜像的创建时间
SIZE        	# 镜像的大小

[root@docker ~]# docker search centos
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                            The official build of CentOS.                   7120      [OK]       
centos/systemd                    systemd enabled base container.                 108                  [OK]
# 解释
DESCRIPTION     # 描述
STARS		# 收藏、点赞数
OFFICIAL	# 是否为官方所提供
AUTOMAT         # 自动更新,指源镜像有改动,所下载的镜像也会同步改动

五、Dcker容器

(一)、帮助命令

docker version        # 显示docker的版本信息
docker info           # 显示docker的系统信息,包括镜像和容器的数量
docker XXX --help     # 帮助命令

Docker 官方命令文档

(二)、容器基础管理命令

  • Docker通过镜像来利用容器技术,可以独立运行一个或者一组应用。
## 创建并运行容器
docker run 参数 image:tag
	· --name name 		 # 指定容器名字
	· -i		         # -i是指即使没有连接,也要保持标准输入保持打开状态
	· -t           	 	 # -t是指分配一个伪终端
	· -d             	 # 在后台运行容器,并且打印容器id,一般和 t 结合使用。注意容器使用后台运行时必须要有一个前台进程让它夯在后台 
	· -e			 # 给运行容器的时候对变量进行赋值
	· --restart= always	 # 此参数能实现当docker服务端重启后,之前在运行的容器也会跟着启动,而不是停止状态

## 容器的端口映射
docker run -it 参数 image:tag
	· -p 主机端口:容器端口     		 # 指定宿主机端口映射到容器端口,可以接多个-p来映射多个不同的端口。
		· -p ip:端口:容器端口		 # 可指定另外绑定ip的端口映射80,eth0需要绑定ip( 绑定命令:ip a add 10.0.0.200/24 dev eth0 label eth0:1 )
		· -p 80-83:80-83		 # 通过范围映射端口
		· -P				 # 随机映射端口

## 挂载数据卷,可以接多个 -v 实现多个数据卷挂载 【ro:只读(只能通过宿主机操作) rw:读写】
docker run -it -v 宿主机目录:容器目录:ro
	· -v 容器内路径		   # 匿名挂载:映射出来的目录没有名字
	· -v 卷名:容器内路径	   # 具名挂载:映射出来的目录有名字,如果数据卷名实际存在,就会将实际存在的数据卷挂载到容器中
	· -v 宿主机路径:容器内路径    # 将宿主机的目录挂载到容器中,但是这种挂载不会再宿主机中创建数据卷
	· --volumes-from            # 跟某一个容器挂载所有相同的卷
		· 注意:任何数据卷在没有指定目录的情况下都在 /var/lib/docker/volumes/xxxx/_data 下
		· 注意:挂载数据卷后,容器的删除不会删除数据卷内的数据,
		· 可以通过 docker inspect r/id | grep Mount 来查看挂载情况

## 查看挂载的数据卷
docker volume ls
	· rm		# 删除
	· create	# 创建

## 进入已创建的容器
# 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec	容器id
# 进入容器正在执行的终端,不会启动新的终端
docker attach 容器id

## 动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O
docker stats 容器
	· -a:查看所有容器信息(默认显示运行中的)
	· –format:Go模板展示镜像信息。
	· –no-stream:不展示容器的一些动态信息。

## 更新一个或多个 Docker容器 的配置
docker update 参数 容器
	· –cpu-shares:更新 cpu-shares
	· –kernel-memory:更新内核内存限制
	· –memory:更新内存限制
	· –restart:更新重启策略

## 退出容器
# 直接退出容器
exit 
# 容器不停止退出
Ctrl + p + q 

## 删除容器
# 删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm 容器id		
# 删除所有容器,或者用 $(docker ps -aq)
docker rm -f `docker ps -aq`

## 管理容器
# 只创建容器不运行
docker create
# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止当前正在运行的容器
docker stop 容器id
# 强制停止当前正在运行的容器
docker kill 容器id
# 重命名一个容器
docker rename 容器名 要改的容器名

## 查看容器列表
docker ps 参数
	· (不加参数) # 列出当前正在运行的容器
	· -a         # 列出当前正在运行的容器和历史运行过的容器
	· -q         # 只显示当前容器的编号
	· -n=x       # 显示最近创建的几个容器
	· --no-trunc # 详细显示

## 列出该容器的端口映射
docker port 容器

## 查看容器日志
docker logs -tf --tail xx 容器id
	· -tf 		# 显示日志,实时监控
	· --tail xx     # 要显示的日志条数
	· -f nameid	# 滚动
## 查看容器中进程信息
docker top 容器

## 从容器内拷贝文件到宿主机上
docker cp 容器:容器内文件路径 宿主机路径

## 将 Docker容器里的文件系统作为一个 tar 归档文件导出到标准输出
docker export -o 容器 xxx.tar

## 手动构建镜像
docker commit -m="描述信息" -a="作者" 容器  image:tag

## Docker hub使用
# 登录docker hub
docker login -u 用户名
# 推送镜像,需要在自己docker账号中创建一个容器镜像仓库
docker push 镜像名:版本标签
image-20220428212004816 image-20200611085918923

image-20220505195036446

(三)、官方文档命令合集

attach      Attach to a running container 	        # 当前shell下attach连接指定运行的镜像
build       Build an image from a Dockerfile        # 通过Dockerfile定制镜像
commit      Create a new image from a container changes  		#提交当前容器为新的镜像
cp          Copy files/folders between a container and the local filesystem #从容器中拷贝指定文件或目录到宿主机中
create      Create a new container 				  			  # 创建一个新的容器,同run,但不启动容器
diff        Inspect changes to files or directories on a containers filesystem #查看docker容器的变化
events      Get real time events from the server 	  # 从docker服务获取容器实时事件
exec        Run a command in a running container      # 在已存在的容器上运行命令
export      Export a container filesystem as a tar archive 	# 导出容器的内容流作为一个tar归档文件[对应import]
history     Show the history of an image              # 展示一个镜像形成历史
images      List images                               # 列出系统当前的镜像
import      Import the contents from a tarball to create a filesystem image 	# 从tar包中的内容创建一个新的文件系统镜像[对应export]
info        Display system-wide information           # 显示系统相关信息
inspect     Return low-level information on Docker objects # 查看容器详细信息
kill        Kill one or more running containers       # 杀死指定的docker容器
load        Load an image from a tar archive or STDIN # 从一个tar包加载一个镜像[对应save]
login       Log in to a Docker registry			  # 注册或者登录一个docker源服务器
logout      Log out from a Docker registry		  # 从当前Docker registry退出
logs        Fetch the logs of a container		  # 输出当前容器日志信息
pause       Pause all processes within one or more containers 	        # 暂停容器
port        List port mappings or a specific mapping for the container  # 查看映射端口对应容器内部源端口
ps          List containers						  # 列出容器列表
pull        Pull an image or a repository from a registry # 从docker镜像源服务器拉取指定镜像或库镜像
push        Push an image or a repository to a registry   # 推送指定镜像或者库镜像至docker源服务器
rename      Rename a container					  # 给docker容器重新命名
restart     Restart one or more containers		  # 重启运行的容器
rm          Remove one or more containers			  # 移除一个或者多个容器
rmi         Remove one or more images				  # 移除一个或者多个镜像[无容器使用该镜像时才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run         Run a command in a new container		  # 创建一个新的容器并运行一个命令
save        Save one or more images to a tar archive (streamed to STDOUT by default) # 保存一个镜像为一个tar包[对应load]
search      Search the Docker Hub for images		  # 在docker hub中搜索镜像
start       Start one or more stopped containers	  # 启动容器
stats       Display a live stream of container(s) resource usage statistics 	# 实时显示容器资源使用统计
stop        Stop one or more running containers	  		# 停止容器
tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE 	# 给源中镜像打标签
top         Display the running processes of a container   	  		# 查看容器中运行的进程信息
unpause     Unpause all processes within one or more containers # 取消暂停容器
update      Update configuration of one or more containers	  	# 更新一个或多个容器配置
version     Show the Docker version information	  	# 查看docker版本号 
wait        Block until one or more containers stop, then print their exit codes 	# 截取容器停止时的退出状态值

六、Docker仓库

(一)、docker-registry

  • 相当于创建一个容器出来,跑一个仓库服务,但是不稳定,局限性较大
## 创建registry容器
docker run --name registry -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry

## 编辑配置文件
vim /etc/docker/daemon.json
"insecure-registries": ["10.0.0.199:5000"],

## 重启docker
systemctl restart docker

## 对要推送的镜像打标签
docker tag centos:centos7 10.0.0.199:5000/centos:centos7

## 推送打完标签的镜像
docker push 10.0.0.199:5000/centos:centos7

## 查看registry仓库的镜像
curl 10.0.0.199:5000/v2/_catalog

## 通过仓库镜像运行容器
docker run -d --name centos  10.0.0.199:5000/centos:centos7 tail -f /etc/hosts

(二)、harbor

  • harbor需要通过docker-compose来运行

harbor下载地址

### 建议使用单独的服务器作为docker仓库
## 为harbor自签发证书,可以实现https访问,如果不需要https访问的话再配置文件中将https的配置注释掉就行了,可省略这一步
# 创建证书目录
mkdir -p /data/ssl && cd /data/ssl/
##  生成ca证书
#生成一个3072位的key,也就是私钥
openssl genrsa -out ca.key 3072
# 生成一个数字证书ca.pem,3650表示证书的有效时间是3年
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem

## 生成域名的证书
# 生成一个3072位的key,也就是私钥
openssl genrsa -out harbor.key  3072
# 生成一个证书请求,稍后签发证书时需要,注意此处的hostname行要写主机名
openssl req -new -key harbor.key -out harbor.csr

## 签发证书
openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650


## 安装docker-compose,上传harbor包并解压
yum -y install docker-compose
tar -zxvf harbor-offline-installer-v2.5.0.tgz

## 编辑配置文件,如果需要配置https访问需要将hostname修改成和证书域名一样,不需要就注释掉https的配置(13、15、17、18)
cd harbor/ &&cp harbor.yml.tmpl harbor.yml && vim harbor.yml

5 hostname: h.z.com
34 harbor_admin_password: 123

## 安装
./install.sh
# 查看进程是Up即为成功
[root@docker harbor]# docker-compose ps
      Name                     Command               State                  Ports                
-------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up                                          
harbor-db           /docker-entrypoint.sh 96 13      Up                                          
harbor-jobservice   /harbor/entrypoint.sh            Up                                          
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up      127.0.0.1:1514->10514/tcp           
harbor-portal       nginx -g daemon off;             Up                                          
nginx               nginx -g daemon off;             Up      0.0.0.0:80->8080/tcp,:::80->8080/tcp
redis               redis-server /etc/redis.conf     Up                                          
registry            /home/harbor/entrypoint.sh       Up                                          
registryctl         /home/harbor/start.sh            Up  

## 默认用户名为admin,密码为配置文件中的 123,端口为80

## 创建项目并添加信任仓库
vim /etc/docker/daemon.json
"insecure-registries": ["10.0.0.199:5000","h.z.com"]

## 在推送镜像的主机登录认证harbor
docker login harbor.michaelxia.com

## 打标签
docker tag alpine:latest h.z.com/test/alpine:v1

## 推送镜像到harbor仓库
docker push h.z.com/test/alpine:v1

## harbor的web界面有同步复制的选项,依托于此选项可以建立一个harbor高可用集群。