编辑
2023-03-15
容器虚拟化学习
00
请注意,本文编写于 553 天前,最后修改于 553 天前,其中某些信息可能已经过时。

本文目录

  • Docker 容器技术初识
  • Docker 环境构建方法
  • Docker 私有仓库构建
Docker容器技术初识

Docker容器技术简介

Docker是一个开源项目,诞生与2013年初,由Docker公司(前dotCloud公司,PaaS市场中的老牌提供商)的团队编写,

最初是dotCloud公司内部的一个业余项目,整个程序是基于google公司推出的Go语言实现。

Docker的思想来自于集装箱,集装箱解决了什么问题?

在一艘大船上,可以把货物规整的摆放起来,并且各种各样的货物被装在集装箱里,集装箱和集装箱之间不会互相影响。

那么我就不需要专门运送蔬菜的船和专门运送货物的船了。

只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

简而言之:可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器环境。

Docker官方网站:https://docs.docker.com

Docker参考资料:https://github.com/moby/moby

Docker仓库网站:https://registry.hub.docker.com

Docker容器技术优势

  • 简单轻量的建模

Docker上手非常快,用户只需要几分钟,就可以把自己的程序“Docker化”。

  • 职责的逻辑分离

使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。

  • 快速高效的开发生命周期

Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。

  • 鼓励使用面向服务的架构

Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型

image-20220713161848564

从上图容器技术与虚拟技术对比可知:

  • 容器技术:

是隔离的环境中运行的一个进程,如果容器对应的进程结束,容器就会随之停止;

容器在隔离环境中,拥有自己的IP地址、系统文件、主机名称、进程管理等信息;

容器不需要物理硬件CPU的支持,是共用宿主机内核,启动容器环境并运行容器中的进程

容器环境启动流程较快,运行性能较高,资源损耗较小,属于比较轻量级的服务。

  • 虚拟技术:

需要物理主机CPU支持(vt虚拟化),并且虚拟主机是模拟计算机硬件运行的环境,会正常有开启运行启动流程;

虚拟主机启动流程较慢,运行性能较低,资源损耗较大,属于比较重量级的服务。

性能对比分析:

image-20220713161836692

Docker容器组件简介

Docker技术包含以下几个核心组件部分:

  • Docker客户端和服务器(也成为Docker引擎);
  • Docker镜像;
  • Docker仓库(Registry);
  • Docker容器

Docker客户端和服务器

Docker是一个客户端/服务器(C/S)架构的程序。

Docker客户端只需要向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。

Docker守护进程有时也称为Docker引擎。

Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。

  • 用户可以在同一台宿主机上运行Docker守护进程和客户端;
  • 用户可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

image-20220713161813704

Docker镜像

可以把镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Docker仓库(Registry)

Docker用Registry来保存用户构建的镜像。

Registry分为公共和私有两种:Docker公司运营的公共Registry称为Docker Hub。

用户可以在Dcoker Hub注册账号,分享并保存自己的镜像。

Docker容器

Docker可以帮助用户构建和部署容器,用户只需要把自己的应用程序或服务打包放进容器即可。

容器是基于镜像启动起来的,容器中可以运行一个或多个进程。

可以这样认为,镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。

Docker环境构建方法

Docker主机环境规划

在部署docker主机环境时,先对需要进行部署的主机地址与名称信息,以及用途进行规划:

image-20220713161748673

系统虚拟主机部署完毕后,需要进行基本的系统初始化操作:

配置虚拟主机名称

hostnamectl set-hostname docker-01

关闭系统安全软件

# 关闭系统防火墙软件 [root@docker-01 ~]# systemctl stop firewalld [root@docker-01 ~]# systemctl is-active firewalld.service inactive [root@docker-01 ~]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@docker-01 ~]# systemctl is-enabled firewalld.service disabled 说明:如果需要使用iptables防火墙可以进行安装,在部署docker是可以先关闭iptables # 安装iptables [root@docker-01 ~]# yum install iptables-services -y # 禁用iptables [root@docker-01 ~]# systemctl stop iptables && systemctl disable iptables # 清空iptables规则配置 [root@docker-01 ~]# iptables -F # 关闭系统selinux程序 [root@docker-01 ~]# setenforce 0 [root@docker-01 ~]# getenforce Permissive -- 表示临时关闭selinux [root@docker-01 ~]# sed -i '7s#enforcing#disabled#g' /etc/selinux/config [root@docker-01 ~]# sed -n '7p' /etc/selinux/config SELINUX=disabled -- 表示永久关闭selinux(需要重启生效)

进行系统时间同步

# 下载时间同步软件 [root@docker-01 ~]# yum install -y ntp ntpdate [root@docker-01 ~]# ntpdate cn.pool.ntp.org # 编写计划任务 [root@docker-01 ~]# crontab -e * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null # 重启crond服务使配置生效: [root@docker-01 ~]# systemctl restart crond

安装系统基础软件

[root@docker-01 ~]# yum install -y 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容器软件部署

Linux系统命令行界面安装:

进行docker下载源优化

# 配置docker-ce国内下载yum源(阿里云/清华源) [root@docker-01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo … 省略部分内容… repo saved to /etc/yum.repos.d/docker-ce.repo 说明:将指定下载源文件保存到/etc/yum.repos.d/目录中 --清华源配置:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

进行docker依赖包安装

[root@docker-01 ~]# yum install -y device-mapper-persistent-data lvm2

进行docker社区版安装

[root@docker-01 ~]# yum install docker-ce -y [root@docker-01 ~]# docker version Client: Docker Engine - Community Version: 20.10.7 -- 查看使用的Docker版本信息 API version: 1.41 Go version: go1.13.15 Git commit: f0df350 Built: Wed Jun 2 11:58:10 2021 OS/Arch: linux/amd64 Context: default Experimental: true Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

进行docker社区版启动

[root@docker-01 ~]# systemctl start docker && systemctl enable docker [root@docker-01 ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-07-31 04:11:16 CST; 9s ago Docs: https://docs.docker.com 说明:看到running,表示docker正常运行

Docker容器内核配置

修改内核参数实现数据包转发功能:

br_netfilter模块用于将桥接流量转发至iptables链,br_netfiter内核参数需要开启转发

# 进行内核参数信息配置: [root@docker-01 ~]# modprobe br_netfilter [root@docker-01 ~]# 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 # 查看内核参数配置信息: [root@docker-01 ~]# cat /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # 加载内核参数配置信息: [root@docker-01 ~]# sysctl -p /etc/sysctl.d/docker.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # 检查确认内核模块状态: [root@docker-01 ~]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter

重启系统主机后模块会失效,可以设置开机自动加载模块

# 在/etc/sysconfig/modules目录下新建模块文件 [root@docker-01 ~]# vim /etc/sysconfig/modules/br_netfilter.modules modprobe br_netfilter # 对新增的模块文件增加执行权限 [root@docker-01 ~]# chmod +x /etc/sysconfig/modules/br_netfilter.modules 或者 [root@docker-01 ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules # 在/etc目录下新建rc.sysinit文件 [root@docker-01 ~]# vim /etc/rc.sysinit #!/bin/bash for file in /etc/sysconfig/modules/*.modules do [ -x $file ] && $file done # 系统重启后查看内核模块是否加载 [root@docker-01 ~]# lsmod | grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter

在未开启内核参数时,docker安装运行时会经常出现如下错误:

WARNING: bridge-nf-call-iptables is disabled # 需要将iptables的内核参数开启,才不会影响docker容器之间的通讯 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1

将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。

当linux主机有多个网卡时一个网卡收到的信息是否能够传递给其他的网卡,如果设置成1的话可以进行数据包转发,

可以实现VxLAN等功能,不开启会导致docker部署应用无法访问。

# 开启系统主机数据包内核转发功能 net.ipv4.ip_forward = 1

所有内核参数信息配置完毕后,需要重启docker服务程序

[root@docker-01 ~]# systemctl restart docker

Docker容器加速配置

docker镜像加速器可以提升拉取镜像的效率。

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

镜像加速器服务配置_阿里云

登录阿里云镜像仓库:(如果没有开通,可开通阿里云的镜像服务)

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

image-20220713161642661

CentOS系统配置docker镜像加速器方法:

# 1. 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce # 2. 配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 [root@docker-01 ~]# mkdir -p /etc/docker [root@docker-01 ~]# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com"] -- 根据自己阿里云加速器地址配置 } EOF # 3. 查看镜像加速器配置文件信息 [root@docker-01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com"] -- 单一加速器配置 或者 "registry-mirrors": ["https://y1edhblz.mirror.aliyuncs.com","https://registry.docker- cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"] -- 多个加速器配置 } # 4. 重新加载docker配置环境并重启docker服务 [root@docker-01 ~]# systemctl daemon-reload [root@docker-01 ~]# systemctl restart docker
Docker私有仓库构建

Docke私有镜像仓库介绍

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑;

部署企业私有环境内的Registry也是非常必要的。

Harbor是由VMware公司开源的企业级的Docker Registry管理项目;

它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

官网地址:https://github.com/goharbor/harbor

私有镜像仓库构建环境:

图片

Docke私有仓库签发证书

私有镜像仓库在进行访问时,需要进行HTTPS访问,可以提供更加安全的外网访问,所以需要获取证书文件;

课程讲解过程中使用自签发证书方式,进行HTTPS环境部署,实现最终测试环境访问。

创建证书保存目录,并进入到此目录中:

[root@harbor-01 ~]# mkdir -p /data/ssl [root@harbor-01 ~]# cd /data/ssl/

在指定证书目录中,生成证书文件信息:(CA证书文件)

# 在指定证书目录中,生成私钥文件信息: [root@harbor-01 ssl]# openssl genrsa -out ca.key 3072 Generating RSA private key, 3072 bit long modulus ........................................................................................................++ e is 65537 (0x10001) # 在指定证书目录中,生成数字证书信息: [root@harbor-01 ssl]# openssl req -new -x509 -days 3650 -key ca.key -out ca.pem You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BJ Locality Name (eg, city) [Default City]:BJ Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []: 说明:以上命令中3650表示证书的有效时间是3年,-x509表示生成的证书格式标准

在指定证书目录中,生成证书文件信息:(域名证书文件)

# 在指定证书目录中,生成私钥文件信息: [root@harbor-01 ssl]# openssl genrsa -out harbor.key 3072 Generating RSA private key, 3072 bit long modulus ................................................................++ e is 65537 (0x10001) # 在指定证书目录中,生成证书请求文件: [root@harbor-01 ssl]# openssl req -new -key harbor.key -out harbor.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BJ Locality Name (eg, city) [Default City]:BJ Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:harbor Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: # 在指定证书目录中,生成签发证书文件: [root@harbor-01 ssl]# openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650 Signature ok subject=/C=CH/ST=BJ/L=BJ/O=Default Company Ltd/CN=harbor Getting CA Private Key 说明:至此证书签发生成完毕

Docke私有仓库程序安装

创建私有仓库程序安装目录:

[root@harbor-01 ~]# mkdir /data/install -p [root@harbor-01 ~]# cd /data/install/

将harbor的离线包程序包上传到这个目录,离线包下载地址为:

https://github.com/goharbor/harbor

将上传好的离线包进行解压:

[root@harbor-01 install]# ll total 614492 -rw-r--r-- 1 root root 629238614 Aug 25 18:52 harbor-offline-installer-v2.3.0-rc3.tgz [root@harbor-01 install]# tar zxvf harbor-offline-installer-v2.3.0-rc3.tgz harbor/harbor.v2.3.0.tar.gz harbor/prepare harbor/LICENSE harbor/install.sh harbor/common.sh harbor/harbor.yml.tmpl You have new mail in /var/spool/mail/root [root@harbor-01 install]# ls harbor harbor-offline-installer-v2.3.0-rc3.tgz [root@harbor-01 install]# ls harbor common.sh harbor.v2.3.0.tar.gz harbor.yml.tmpl install.sh LICENSE prepare

修改harbor程序的配置文件信息:

[root@docker-01 install]# cd harbor [root@harbor-01 harbor]# pwd /data/install/harbor [root@harbor-01 harbor]# cp harbor.yml.tmpl harbor.yml [root@harbor-01 harbor]# vim harbor.yml 5 hostname: harbor -- 修改主机名称和上面签发的证书域名保持一致 17 certificate: /data/ssl/harbor.pem 18 private_key: /data/ssl/harbor.key

邮件和ldap不需要配置,在harbor的web界面可以配置,其他配置采用默认即可,修改之后保存退出。

harbor默认的账号密码:admin/Harbor12345

安装部署docker-compose程序软件包

docker-compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

docker-compose的工程配置文件默认为docker-compose.yml,运行目录下的必要有一个docker-compose.yml。

docker-compose可以管理多个docker实例。

# 上传课件里的docker-compose-Linux-x86_64文件到harbor机器 [root@harbor-01 install]# ll docker-compose-Linux-x86_64.64 -rw-r--r-- 1 root root 12254160 Aug 25 19:11 docker-compose-Linux-x86_64.64 [root@harbor-01 install]# mv docker-compose-Linux-x86_64.64 /usr/bin/docker-compose [root@harbor-01 install]# chmod +x /usr/bin/docker-compose

安装harbor需要的离线镜像包:

# 上传课件里的docker-harbor-2-3-0.tar.gz文件到docker机器 [root@harbor-01 install]# docker load -i docker-harbor-2-3-0.tar.gz [root@harbor-01 install]# cd /data/install/harbor [root@harbor-01 harbor]# ./install.sh ...省略部分信息... ✔ ----Harbor has been installed and started successfully.---- 说明:看到以上内容信息,说明harbor安装部署成功

修改系统主机host文件的域名解析:

image-20220713161523371

在hosts文件添加如下一行,然后保存即可

192.168.30.101 harbor

如何停止和运行harbor程序运行状态:

# 如何停掉harbor: [root@harbor-01 harbor]# cd /data/install/harbor [root@harbor-01 harbor]# docker-compose stop # 如何启动harbor: [root@harbor-01 harbor]# cd /data/install/harbor [root@harbor-01 harbor]# docker-compose start

Docke私有仓库界面操作

harbor网站页面访问过程

在浏览器输入:https://harbor;接收风险并继续,出现如下界面,说明访问正常

image-20220713161452578

账号:admin 密码:Harbor12345,输入账号密码出现如下:

image-20220713161438225

所有基础镜像都会放在library里面,这是一个公开的镜像仓库。

harbor网站页面配置过程

新建项目->起个项目名字test(把访问级别公开那个选中,让项目才可以被公开使用)

image-20220713161250481

harbor网站仓库容器访问:

修改docker容器主机配置信息

[root@docker-01 ~]# vim /etc/docker/daemon.json { "registry-mirrors":["https://y1edhblz.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"], "insecure-registries": ["192.168.30.101","harbor"] } 说明:添加的insecure-registries,表示内网访问harbor时走的是http,指定地址是安装harbor机器的ip

修改docker配置之后重启服务:

[root@docker-01 ~]# systemctl daemon-reload [root@docker-01 ~]# systemctl restart docker [root@docker-01 ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2021-08-26 00:03:25 CST; 1min 14s ago Docs: https://docs.docker.com 说明:看到active信息,表示docker服务启动成功

利用docker主机登录私有仓库:

# 配置docker主机本地hosts文件信息 [root@docker-01 ~]# cat /etc/hosts 10.0.0.101 docker-01 192.168.30.101 harbor # 进行登录访问harbor私有仓库 [root@docker-01 ~]# docker login 192.168.30.101 Username: admin 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 说明:输入账号和密码之后看到以上信息,说明登录成功

harbor私有仓库镜像上传

# 在docker主机上拉取测试镜像 [root@docker-01 ~]# docker pull tomcat # 在docker主机上生成离线镜像包 [root@docker-01 ~]# docker save -o tomcat.tar.gz tomcat # 在docker主机上加载离线镜像包 [root@docker-01 ~]# docker load -i tomcat.tar.gz # 在docker主机上给要进行上传的镜像打标签 [root@docker-01 ~]# docker tag tomcat:latest 192.168.30.101/test/tomcat:v1 # 在docker主机上将指定打标的镜像进行上传到harbor私有仓库中 [root@docker-01 ~]# docker push 192.168.30.101/test/tomcat:v1 说明:执行上面命令就会把192.168.30.101/test/tomcat:v1上传到harbor里的test项目下

harbor私有仓库查看镜像

图片

harbor私有仓库下载镜像

# 删除docker主机上已经存在的镜像 [root@docker-01 ~]# docker rmi -f 192.168.30.101/test/tomcat:v1 # 从harbor私有镜像仓库中拉取指定镜像 [root@docker-01 ~]# docker pull 192.168.30.101/test/tomcat:v1 v1: Pulling from test/tomcat Digest: sha256:f03ed41f43d82dc8fd1d5fd5c7f6633eb62e4a0d7d3d83243f08d5acc5424c4d Status: Downloaded newer image for 10.0.0.201/test/tomcat:v1 10.0.0.201/test/tomcat:v1 [root@docker-01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.30.101/test/tomcat v1 266d1269bb29 6 days ago 668MB 说明:以上操作说明已经可以从harbor上进行私有镜像的拉取
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Gustav

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!