在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
注: Docker运行在CentOS-6.5或更高的版本的CentOS上,要求系统为64位,系统内核版本为2.6.32-432或更高版本 Docker运行在CentOS7上,要求系统为64位,系统内核版本为3.10以上
参考地址
Docker CE 镜像源站-阿里云开发者社区
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 解决域名问题
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum install -y docker-ce
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
注:用到哪个端口需要开启对应配置防火墙对应的端口。
docker --version
docker官方镜像仓库网速较差,我们需要设置国内镜像:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rxriprah.mirror.aliyuncs.com"]
}
EOF
2
sudo systemctl daemon-reload
sudo systemctl restart docker
案例:从DockerHub中拉取一个nginx镜像并查看
1 首先去镜像仓库搜索nginx镜像,比如DockerHub:
2 根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx
3 通过命令:docker images 查看拉取到的镜像
docker save -o nginx.tar nginx:版本号
docker load -i nginx.tar
docker images #查看镜像
docker rmi #删除镜像
docker pull #拉取镜像
docker push #推送镜像
docker save #保存镜像
docker load #加载镜像
案例:创建运行一个Nginx容器
步骤一:去docker hub查看Nginx的容器运行命令
docker run --name mn -p 80:80 -d nginx
命令解读:
docker run :创建并运行一个容器
--name : 给容器起一个名字,比如叫做mn
-p :将宿主机端口与容器端口映射,冒号左侧
是宿主机端口,右侧是容器端口
-d:后台运行容器 nginx:镜像名称,例如nginx
步骤二 查看容器和日志
docker ps -a #查看容器
docker logs -f mn #查看日志
案例 : 进入Nginx容器,修改HTML文件内容,添加“helloword”
步骤一:进入容器。进入我们刚刚创建的nginx容器的命令为:
docker exec -it mn bash
命令解读:
docker exec :进入容器内部,执行一个命令
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn :要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
步骤二:进入nginx的HTML所在目录 /usr/share/nginx/html
cd /usr/share/nginx/html
步骤三:修改index.html的内容
sed -i 's#Welcome to nginx#helloword#g' index.html
sed -i 's###g' index.html
数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
数据卷的特性:
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像的更新
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
说明:
docker run :就是创建并运行容器
-- name mn :给容器起个名字叫mn
-v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中
-p 8080:80 :把宿主机的8080端口映射到容器内的80端口 nginx :镜像名称
注:如果容器运行时数据卷不存在,会自动被创建出来
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
# 拉取jdk
#FROM openjdk:8-jdk-alpine
FROM 地址/library/new-openjdk:latest
# 设置工作目录
WORKDIR /home/ppxxfpc
# 将当前目录下的可执行jar文件复制到容器的工作目录
ADD /ppxxfpc.jar /home/ppxxfpc/app/ppxxfpc.jar
# 暴露容器的8080端口,以便从外部访问应用程序
EXPOSE 8085
# 启动Spring Boot应用程序
CMD ["nohup", "java","-Duser.timezone=GMT+08", "-jar", "/home/ppxxfpc/app/ppxxfpc.jar","> /home/ppxxfpc/logs/logs.log &"]
生成镜像
docker build -t ppxxfpc .
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务
我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定 义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某 项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后 端的数据库服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件 (YAML 格式)来定义一组相关联的应用容器为一个项目(project)。有了Compose,我们就不需要再一个个组件去写一份Dockerfile,只需要将整体环境同一起来,写在一份docker-compose.yml文件即可
补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
注 如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
案例
version: '3.3'
services:
ppxxhd:
ports:
- '8085:8085'
container_name: 'ppxxfpc'
image: ppxxfpc
volumes:
- '/home/ppxxfpc/uploadPath:/home/ppxxfpc/uploadPath'
- '/home/ppxxfpc/ppxxfpc.jar:/home/ppxxfpc/app/ppxxfpc.jar'
- '/home/ppxxfpc/logs:/home/ppxxfpc/logs'
ppxxqd:
ports:
- '8100:8100'
- '8183:8183'
container_name: ppxxqd
image: ppxxqd
volumes:
- '/home/ppxxfpc/nginx/conf/nginx.conf:/etc/nginx/nginx.conf'
- '/home/ppxxfpc/nginx/html:/usr/share/nginx/html'
elasticsearch:
image: elasticsearch:7.17.3
container_name: es
volumes:
- /home/ppxxfpc/elasticsearch/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
environment:
- node.name=es
- cluster.name=elasticsearch
- discovery.type=single-node
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- xpack.security.http.ssl.enabled=false
- xpack.security.transport.ssl.enabled=false
privileged: true
mem_limit: 2g
ulimits:
memlock:
soft: -1
hard: -1
kibana:
image: kibana:7.17.3
container_name: kibana
restart: always
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启势
environment:
- I18N_LOCALE=zh-CN
- ELASTICSEARCH_URL=http://192.168.1.116:9200 #设置访问elasticsearch的地址
ports:
- 5601:5601
启动停止命令
docker-compose up -d #创建并后台启动容器
docker-compose down #关闭并移除容器
1 编写文件
2 修改项目的application.yml和 bootstrap,将数据库、nacos地址都命名为docker-compose中的服务名
harbor是VMware公司开源的企业级docker registry项目。主要是为了实现为用户去迅速搭建一个docker registry服务。
Harbor以Docker 公司开源的Registry 为基础,提供了图形管理UI、基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成、以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。
Harbor的每个组件都是以Docker 容器的形式构建的,使用docker - compose来对它进行部署。用于部署Harbor 的docker- compose模板位于harbor/ docker-compose.yml。
①Proxy: Harbor 的Registry、UI、Token 服务等组件,都处在nginx 反向代理后边。
该代理将来自浏览器、docker clients .的请求转发到后端不同的服务上。
②Registry:负责储存Docker 镜像,并处理Docker push/pull 命令。
由于要对用户进行访问控制,即不同用户对Docker镜像有不同的读写权限,Registry 会指向一个Token 服务,强制用户的每次Docker pull/push 请求都要携带一个合法的Token,Registry会通过公钥对Token 进行解密验证。
③core services: Harbor的核心功能,主要提供以下3个服务:
UI (harbor-ui) :提供图形化界面,帮助用户管理Registry. 上的镜像(image) ,并对用户进行授权。
WebHook: 为了及时获取Registry.上 image状态变化的情况,在Registry上配置Webhook, 把状态变化传递给UI模块。
Token 服务:负责根据用户权限给每个Docker push/pull 命令签发Token。 Docker 客户端向Registry 服务发起的请求,如果不包含Token, 会被重定向到Token 服务,获得Token 后再重新向Registry 进行请求。
④Database (harbor-db) :为core services提 供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。
⑤Job services:主要用于镜像复制,本地镜像可以被同步到远程Harbor实例上。
⑥Log collector (harbor-log) :负责收集其他组件的日志到一个地方。
所有的请求都经过proxy代理,proxy代理转发给Core services和Registry,其中Core services包括UI界面、token令牌和webhook网页服务功能,Registry主要提供镜像存储功能。如果要进行下载上传镜像,要经过token令牌验证然后从Registry获取或上传镜像,每一次下载或上传都会生成日志记录,会记入Log collector,而用户身份权限及一些镜像语言信息会被存储在Database中。
主机 操作系统 IP地址 软件
server CentOS7.6 192.168.58.88 docker、docker-compose、harbor-offline-v1.1.2
cd /usr/local
rz docker-compose
chmod +x docker-compose
mv docker-compose /usr/bin 移动到路径环境下,便于系统识别
rz harbor-offline-installer-v1.2.2.tgz
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
[root@harbor local]# vim /usr/local/harbor/harbor.cfg
#修改第五行
hostname = 192.168.58.88
sh /usr/local/harbor/install.sh
cd /usr/local/harbor/
docker-compose ps
浏览器访问访问http://192.168.58.88,默认的管理员用户名和密码是 admin/Harbor12345。
192.168.111.20
用户名:admin
密码:Harbor12345
#登陆
docker login -u admin -p Harbor12345 http://127.0.0.1
#下载镜像进行测试
docker pull tomcat
#镜像打标签
docker tag tomcat 127.0.0.1/public/tomcat:v1
#上传镜像到Harbor
docker push 127.0.0.1/public/tomcat:v1
如果登录不上解决办法:
vim /usr/lib/systemd/system/docker.service
#修改内容地方
......
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.111.20 --containerd=/run/containerd/containerd.sock
......
#重启服务
systemctl daemon-reload
systemctl restart docker
#再次登录
docker login -u admin -p Harbor12345 http://192.168.111.20
可以使用 docker-compose 来管理 Harbor。一些有用的命令如下所示,必须在与
docker-compose.yml 相同的目录中运行。
修改 Harbor.cfg 配置文件
要更改 Harbour 的配置文件时,请先停止现有的 Harbour 实例并更新 Harbor.cfg;然
后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbour 的实例。
#卸载
docker-compose down -v
#编辑配置文件
vim harbor.cfg
#填充配置
./prepare
#启动Harbor
docker-compose up -d
#如果报错
解决思路
关闭防火墙、重启docker
systemctl stop firewalld
setenfore 0
systemctl restart docker
在客户机上操作 192.168.58.99
访客的操作
cd /data/registry/docker/registry/v2/repositories/
ls
docker-compose down -v
#如果需要重新部署,需要移除Harbor服务容器全部数据
#持久数据,如镜像,数据库等在宿主机的/data目录下,日志在宿主机的/var/log/Harbor目录下
rm -rf /data/database
rm -rf /data/registry