Docker与K8s
关系:
- docker通过dockerfile 将应用程序所需的设置和依赖打包到一个容器中,从而实现迁移性的特点。
- kubernets用于关联和编排在多个主机上运行的容器。
容器化技术
Docker 相对比较简单
K8s 概念较多(虚拟化,集群),不易理解
容器和虚拟机的主要区别
传统虚拟机的运行需要依赖虚拟硬件,必须要安装系统才能运行软件。
虚拟软件和虚拟系统会占用和浪费大量资源。
容器是运行在容器引擎上,会直接共享真机的操作系统内核运行,可以节省大量的资源,
对比传统虚拟机总结:
特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为 MB 一般为 GB 性能 接近原生 弱于,有损耗 系统支持量 单机支持上千个容器 一般几十个
Docker基础
概念:
Docker是一个容器引擎。是一个用于管理容器的软件。(镜像 => 容器)
属于IT行业的集装箱。(使用go语言开发实现的)
容器:
“精简”的虚拟机,但和传统虚拟机是有较大的区别。
虚拟化技术
虚拟化与物理主机:
与**物理主机(一台真实的电脑)**相对应
为了更好的,更充分的利用物理主机的硬件资源,而产生的一种技术,可以在一台物理主机上同时使用多个操作系统在相对独立的环境中去
特点:
- 容器几乎可以在所有平台上运行
- CentOS6.5+
- Ubuntu14.04 + Ubuntu16.04 Ubuntu18.04 Ubuntu20.04 Ubuntu22.04 LTS版本
- Windows 10/server
- 占用资源少
- 使用镜像部署更加高效,更加方便,一条命令足以安装整个项目
Docker架构
C/S架构 Client/Server (MySQL,Redis)
docker命令是客户端
docker deamon(守护进程,后台服务)命令是服务端
【systemctl start docker】
容器 — 镜像 — 仓库 — daemon — client 之间的关系
- Containers 被docker daemon 管理的容器,用于运行应用。
- Images 镜像(远程和本地),用于生成可运行的容器。
- Registry 注册中心(远程仓库),用于镜像的下载。
- 公共
- 开源镜像(个人或公司上传的),给所有人免费使用
- 私有
- 公司或个人的闭源镜像
- 无状态的服务:Nginx,Tomcat,Httpd,PHP
- 有状态的服务:MySQL,数据卷技术将数据保留在本地。
安装Docker
一·yum安装:
先将yum源进行更换:更换为阿里云
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
安装依赖
# 安装依赖 [root@zuolaoshi ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 # 替换成清华源 [root@zuolaoshi ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
安装docker
如果有旧版本则需删除
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装
yum -y install https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.31-3.1.el7.x86_64.rpm
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
启动docker
systemctl enable docker
systemctl start docker
验证启动
systemctl status docker
验证版本
docker -v
docker -v Docker version 26.0.1, build d260a54 docker run --name zabbix-agent -t \ -v zabbix_agent:/etc/zabbix \ -e ZBX_HOSTNAME="host-01" \ -e ZBX_SERVER_HOST="172.17.0.4" \ -e ZBX_SERVER_PORT=10051 \ -p 10050:10050 \ --restart=unless-stopped \ --privileged \ -d zabbix/zabbix-agent:alpine-6.2-latest
二·docker client 和 daemon分离
关闭docker
systemctl stop docker
修改docker启动方式,要求加载配置文件启动
sed -i.bak ‘/^ExecStart=/c\ExecStart=/usr/bin/dockerd’ /usr/lib/systemd/system/docker.service
设置docker配置文件(默认没有)
vim /etc/docker/daemon.json
{ "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"] }
重载docker服务、重启docker生效配置
systemctl daemon-reload
systemctl restart docker
查看docker的监听地址和端口
netstat -ntpl |grep 2375 tcp6 0 0 :::2375 :::* LISTEN 21219/dockerd
客户端连接docker daemon,执行命令
docker -H 192.168.8.14 images
Docker镜像
查找镜像
docker search centos
[root@zuolaoshi ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL centos DEPRECATED; 7720 [OK] ......以下省略 #字段说明: NAME:镜像名称 DESCRIPTION:镜像描述 STARS:镜像星级,数字越大表示用的人越多 OFFICIAL:是否为官方 跟[OK]说明是官方 AUTOMATED: 是否为自动化构建的镜像
镜像下载
docker pull centos
镜像下载加速(各种云厂家)
阿里云:
{ "reg istry-mirrors": ["https://vgqctehu.mirror.aliyuncs.com"] }
本地镜像查看-images命令
docker images
[root@zuolaoshi ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB #字段说明: REPOSITORY:镜像的名字 TAG:镜像的标签 IMAGE ID:镜像的ID号 CREATED:镜像建立时间 SIZE: 镜像大小
镜像详细信息-inspect命令
docker inspect centos
镜像保存-save命令
docker save -o centos_base.tar centos
本地镜像删除-rmi命令
先找到镜像的id号
docker images
输入第一个id号进行删除
docker rmi id
(当容器使用镜像时默认不能删除)
docker rmi 605c77e624dd Untagged: nginx:latest Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85 Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5 Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14 Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4 Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5 Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
强制删除:
docker rm -f
[root@manage01 ~] docker rmi -f ba6acccedd29 Untagged: ubuntu:latest Untagged: ubuntu@sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322 Deleted: sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1 Deleted: sha256:9f54eef412758095c8079ac465d494a2872e02e90bf1fb5f12a1641c0d1bb78b]
镜像载入load命令
导入由save保存出来的压缩文件镜像
docker load -i centos_base.tar
docker容器管理
容器查看-ps命令
docker ps
容器详细信息-inspect命令
docker inspect centos
容器运行(镜像->容器)
docker run [options]
#后台执行容器 docker run -it --name centos7_1 centos #但是看不到centos7_1的进程 docker ps #docker容器运行必须有一个进程, 如果没有进程执行,容器认为空闲,就会自行退出 docker ps -a #前台执行的容器 docker run -it --name centos7_2 centos /bin/bash
/bin/bash
当容器中没有正在运行的进程时,会被挂起(暂时执行),以节省
删除容器:
先找到容器id
docker ps -a
通过id进行删除
docker rm id
[root@manage01 ~]# docker rm 98d99dd0df62 98d99dd0df62
容器的导入与导出
将容器导出:一个镜像为压缩文件
Docker安装WordPress
先安装mysql:
#下载指定版本的镜像 docker pull mysql:8.0.20 #创建本地文件夹目录,用于挂载容器中的数据目录 mkdir -p /data/mysql/{data,conf} cat > /data/mysql/conf/my.cnf << EOF [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci EOF docker run -itd --name mysql-test \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/ \ --restart=always \ mysql
Docker运行报错docker0: iptables: No chain/target/match by that name.
一般是关于防火墙的问题,启动docker服务的时候,防火墙是开着的,那么docker会默认对其进行操作,我关掉防火墙之后docker不能去操作防火墙,自然就报错了
两个解决办法:
- 把防火墙开起来: systemctl start firewalld
- 在防火墙关闭的情况下直接重启一下docker服务,让他默认不操作防火墙: systemctl restart docker
安装wordpress
mysql 中创建wp1库
mysql> create database wp1 charset utf8mb4;
安装wordpress
docker run -itd --name wodpress1 \ -e WORDPRESS_DB_HOST=192.168.8.101:3306 \ -e WORDPRESS_DB_USER=root \ -e WORDPRESS_DB_PASSWORD=123456 \ -e WORDPRESS_DB_NAME=wp1 \ -p 8086:80 \ --restart=always \ wordpress
Docker 安装nginx进行反向代理
# 创建本地目录用于映射nginx容器 mkdir -p /data/nginx/conf cat > /data/nginx/conf/default.conf << EOF server { listen 80; listen [::]:80; server_name localhost; location / { proxy_pass http://本机地址:8086; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } EOF # 搜索镜像 docker search nginx # 下载镜像 docker pull nginx # 查看镜像 docker images # 启动镜像 docker run -itd --name nginx01 \ -p 80:80 \ -v /data/nginx/conf:/etc/nginx/conf.d \ --restart=always \ nginx # 查看容器 docker ps # 本机自测 curl localhost
Docker安装nextcloud网盘
mysql 中创建 nextcloud 库
create database nextcloud charset utf8mb4;
安装nextcloud
docker run -d --name nextcloud \ -v nextcloud:/var/www/html \ --link mysql-text:mysql \ -p 8080:80 nextcloud
DockerFile文件
用于构建镜像的一种脚本格式。
手动构建镜像:nginx -> nginx01 -> docker cp -> game -> commit -> save.tar 文件 -> load
- 镜像:由联合文件系统构成的文件,镜像的特点
- 分层
- 只读
- 容器:镜像+容器层构成的。特点
- 容器层是可读可写的
- 当将容器转换为新的镜像时,我们修改的数据会成为新镜像的上层
联合文件:可以将不同目录挂载到同一个虚拟文件系统下,支持对文件系统的修改作为一次提交来一层层的叠加,是docker镜像的基础。
构建发布镜像的基本流程
- 编写Dockerfile文件,设计
- docker build 构建成一个镜像
- docker run 镜像
- 将docker镜像发布到公有仓库(Docker Hub,阿里云镜像仓库等。。)或私有仓库。
- docker pull
DOCKERFILE 指令 说明 FROM 指定基础镜像,用于后续的指令构建。 MAINTAINER 指定Dockerfile的作者/维护者。(新版已弃用,推荐使用LABEL指令) LABEL 添加镜像的元数据,使用键值对的形式。 RUN 在构建过程中在镜像中执行命令。 CMD 指定容器创建时的默认命令。(可以被覆盖) ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖) EXPOSE 声明容器运行时监听的特定网络端口。 ENV 在容器内部设置环境变量。 ADD 将文件、目录或远程URL复制到镜像中。(自动解压缩)。 COPY 将文件或目录复制到镜像中。 VOLUME 为容器创建挂载点或声明卷。 WORKDIR 设置后续指令的工作目录。 USER 指定后续指令的用户上下文。 ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。 ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。 STOPSIGNAL 设置发送给容器以退出的系统调用信号。 HEALTHCHECK 定义周期性检查容器健康状态的命令。 SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
Docker-Compose
用于生成容器的一种yaml的一种文件格式,使用docker-compose的命令生成容器。
- 一条命令可以同时管理多个容器。
- 创建,删除,启动,关闭,重启,查看容器
- 通过docker-compose.yml文件来进行管理一组容器
文本基本结构
关键字:
- 开头先写版本:
version: 3
#docker-compose的版本格式- 服务:
services
#定义了每个容器的基本设置,依赖文件,环境变量。
db\log\web
: #容器在集群中的名称,只在当前文件中生效。
- 镜像:
image
#镜像不存在时,自动下载- 容器名:
container_name
#容器运行时在 docker ps 中可以看到- 重启:
restart
#控制容器的重启策略。在容器退出时,根据指定的策略自动重启容器。
- no: #不自动重启。
- always: #无论退出状态码如何,总是重启容器。
- on-failure: #仅在容器非正常退出时(退出状态码非零)重启。
- unless-stopped: # 除非手动停止,否则总是重启
- 数据卷:
volumes
- 宿主机目录:容器目录
- /data/mysql:/var/lib/mysql
- data:/var/lib/mysql
- /var/lib/mysql #随机生成一个挂载目录
- :ro #只读
- :rw #读写
- 😒 #安全模式
- 端口:
ports
:
- 127.0.0.1:1514:10514
- 80:80 0.0.0.0
- 80 #随机指定一个端口
- 网络:
networks
- harbor 网桥名
- 依赖:
depends_on
#依赖容器集群中的其他容器别名- 环境变量:
env_file
#环境变量配置文件路径网络:
network
#用于创建新的网桥
docker-compose down
删除当前项目所有的容器
docker-compose restart
重启当前项目所有的容器
docker-compose up -d
启动当前项目所有的容器
Docker网络
让容器联网的几种方式(4种)。
- 容器 -> 宿主机
- 容器 -> 容器
- 容器 -> 外网
网络模式
- bridge 网桥(默认的网络模式):会默认生成docker0的虚拟网卡(docker0)
- 使用该docker0(172.17.0.2)网卡可以让容器和宿主·外网服务器通信。
- NAT(网络地址转换),容器会被自动分配一个IP和子网掩码
- 172.17.0.2 ~ 172.17.255.254(65534个)
- docker0作为“路由”和“交换机”。
- 通过宿主机iptables防火墙的nat表实现与外网的联系。
- host 主机
- 容器和真机共用网卡及对应的端口,缺点就是同一个端口只能宿主机或者某个容器使用,其他容器不能用。
- none 空
- 容器仅有lo网卡,是一个不能联网的本地容器
- container 容器网络或联盟网络
Docker卷组
数据的持久化。将容器的数据目录挂载到宿主机上,当删除容器时可以保留数据。
- ECS 弹性云服务器
宿主机目录 容器目录 为空 为空 空目录 不为空 为空 宿主机内容 为空 不为空 容器的内容 不为空 不为空
案例:
创建一个docker管理的卷(–rm 是指临时创建的)
在Docker中运行一个名为httpd1的容器,使用busybox镜像,并且将本地磁盘中的/disk目录挂载到容器内的/data目录。容器启动后会进入交互模式,并在容器停止后会自动删除。
[root@host1 ~]# docker run --name httpd1 -it --rm -v /data busybox / # / # echo "test message">>/data/test.txt / #
[root@host1 ~]# docker inspect httpd1 "Mounts": [ { "Type": "volume", "Name": "636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c", "Source": "/var/lib/docker/volumes/636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]
[root@host1 ~]# cd /var/lib/docker/volumes/636a1967c63705161f941550edf4b0ced1584bf71087596ad61a49df4cd6ae4c/_data [root@host1 _data]# cat test.txt test message [root@host1 _data]#
Docker Swarm
Docker Swarm是什么:
集群版的docker,容器编排技术。和k8s类似,但比较简单。
官方提供的一个容器集群编排管理工具。
Docker Swarm干什么:
管理多台主机上的容器,创建容器,修改容器,删除容器
管理Docker网络
管理节点信息
Docker Swarm使用条件:
当单机性能不足时,增加主机。
主机较多,容器分散在不同的服务器上,就可以使用容器的集群编排管理工具(docker swarm)
Docker Swarm与k8s的区别:
Docker swarm 是单体架构应用 (所有功能包括资源调度,网络连接,路由转发,容器管理),Docker Swarm自带的
k8s 是分布式,微服务化的架构应用,所有功能由不同的软件应用提供。
- 只是一个框架,本身并不提供网络,容器管理,数据存储等功能。需要安装一大堆
Docker镜像私有仓库
为了更好的管理镜像
- 公网仓库:docker hub
- 私网仓库: registry、harbor
搭建私有registry仓库
搭建步骤
- 拉取 registry 容器镜像
- 创建 registry 仓库容器
- 测试容器应用
安装registry仓库
docker pull registry #1、创建持久化存储,将容器镜像存储目录/var/lib/registry挂载到本地/opt/myregistry下: mkdir /opt/myregistry # 2、创建 registry 容器: docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry --restart=always registry:latest # 显示仓库中没有任何镜像 curl http://192.168.1.150:5000/v2/_catalog {"repositories":[]}
上传步骤
#1.修改标签tag,将私有仓库的域名或IP地址添加到镜像上。 docker tag hello 192.168.8.14:5000/hello-lasest:latest #2.使用docker push上传 docker push 192.168.8.14:5000/hello-lasest:latest #3.如果上传成功则可输入查看 curl http://192.168.1.150:5000/v2/_catalog
push过程报错
Get https://172.18.11.126:5000/v2/: http: server gave HTTP response to HTTPS client
排错
#docker默认要求仓库是https的协议 #1.服务端nginx反向代理,配置ssl加密证书。 #2.修改客户端的配置文件,让客户端允许不安全的http网址 cat /etc/docker/daemon.json { "insecure-registries": ["http://192.168.8.14:5000"] } #忽略https
进行重启Docker
systemctl daemon-reload systemctl restart docker
进行下载
设置机器的docker仓库为registry仓库
#1、设置docker启动文件 [root@zuolaoshi_node1 ~]# sed -i.bak '/^ExecStart=/c\ExecStart=\/usr\/bin\/dockerd' /usr/lib/systemd/system/docker.service #2、设置docker配置文件 [root@zuolaoshi_node1 ~]# cat /etc/docker/daemon.json { "insecure-registries": ["http://182.168.8.14:5000"] }
拉取镜像
docker pull 192.168.8.14:5000/hello-lasest:latest
最后进行验证
docker images
如果显示有即为正确!