Docker

怎么限制一个进程的CPU、内存、磁盘IO、网络等资源

使用docker容器就可以限制各个进程

k8s可以管理容器,是容器集群管理软件,它们都是go语言开发的

centos安装部署

由于docker的repo源无法从官方下载

所以用阿里云的repo源

先配置yum.repos.d源
cd /etc/yum.repos.d
rm -rf *
curl -O http://mirrors.aliyun.com/repo/Centos-7.repo

再配置docker源
yum install yum-utils -y
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

生成安装docker的缓存

yum makecache fast

安装docker

yum install docker-ce -y

启动docker

systemctl start docker

设置开机启动

systemctl enable docker

记得关闭防火墙和SELINUX

docker基础命令

docker  version 查看docker版本

docker  images 查看docker镜像(镜像:是docker容器启动的软件所在的文件)

docker  pull  xxx 拉取镜像(不过它是从官方拉取,拉取不下来,所以镜像要通过其他方式获取镜像)

docker  load  -i  xxx.tar (将xxx.tar镜像文件导入到docker软件里)

docker  run  -d  -p  80:80  --name  nginx-1  nginx(创建并启动一个nginx软件)

(-d 容器进程在后台运行 daemon)

(-p 将容器发布出去,让外面的机器可以访问 publish)

(80:80  前面的80是宿主机的端口,它是对外的端口,可以修改且唯一,映射容器软件的端口;后面的80是软件的端口,可以一样)

(--name nginx-1 指定容器的名字,必须唯一)

(nginx  使用的镜像文件的名字)

docker  ps(查看所有运行的容器软件进程)

docker  ps  -a(查看所有状态的容器软件进程)

docker  create  -p  81:80  --name=nginx-2  nginx(创建一个容器软件,这里是以创建第二个nginx软件举例)

docker  start  nginx-2 (开启容器的nginx)

docker  stop  nginx-2(关闭)

docker inspect nginx-1(可以查看容器ip)

docker logs nginx-1(查看对应容器日志)

拉取镜像我们依靠阿里云私人仓库来拉取

也可以配置docker加速器

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
	"registry-mirrors": ["https://hub.docker-alhk.dkhun.com/"]
}
EOF
systemctl daemon-reload
systemctl restart docker
1、登陆阿里云Docker Registry

docker login --username=*** registry.cn-hangzhou.aliyuncs.com
用于登陆的用户名为阿里云账号全名,密码为开通服务时设置的密码

2、从Registry中拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/***/mysql:5.7.41

3、将镜像改名

docker tag [image ID]  mysql:5.7.41

进入docker的MySQL-1或nginx-1容器内部,打开一个交互式命令行终端

docker  exec  -it  mysql-1  bash

docker  exec  -it  nginx-1  bash 

docker 3大核心概念

镜像:image 是一个文件,里面包含了一个微型操作系统+核心代码程序+依赖库环境 -->镜像文件越小越好

docker  save  -o  mysql.tar  mysql:5.7.41(导出镜像)

docker  load  -i  mysql.tar(导入镜像)

##删除镜像操作要先停止容器,再删除容器,再删除镜像##

docker  stop  mysql-1(停止容器)

docker  rm  mysql-1(删除容器)

docker  rmi  mysql:5.7.41(删除镜像)

仓库:Registry 存放镜像的地方

​ 公共镜像仓库:对外开放,官方库,阿里云等等

​ 私人镜像仓库

容器:container 运行镜像的地方,容器本质上是一个进程,需要消耗cpu等资源

容器的3个状态

up created exited

将文件从容器里拷贝出来到宿主机(nginx为例)

docker  cp  nginx-1:/usr/share/nginx/html/index.html 

将文件从宿主机拷贝到容器里

docker  cp  index.html  nginx-1:/usr/share/nginx/html/index.html

限制容器使用资源

查看容器内的进程

docker top nginx-1

查看各个容器的资源消耗(cpu、内存、磁盘io、网络io)

docker stats

命令解析

docker run -d -p 81:80 --name nginx-2 --cpu-shares 200 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 -device-write-bps /dev/sda:20MB nginx
--cpu-shares 200 可以使用的cpu算力的份额(不管cpu有多少个,都只看作总的为1000份,这里设置200也就是占了20%)
--cpus 2 可以使用cpu的核心的数量
--cpuset-cpus 0,1 指定在哪些cpu里运行
-m 2000000000 指定使用的内存的大小 默认以字节bytes为单位
-device-write-bps /dev/sda:20MB 指定磁盘读写大小

docker底层技术

cgroup:限制资源

​ v1模式(传统):每个子系统独立树形结构,配置复杂、易冲突

​ v2模式(统一、推荐):单一树形结构,所有控制器共用,逻辑清晰、配置一致

命名空间namespace(隔离)

类型:Mount(挂载命名空间)、PID(进程命名空间)、Network(网络命名空间)、IPC(进程间通信资源)、UTS(隔离主机名和域名)、USER(用户命名空间)、cgroup

容器与虚拟机的区别是什么?

docker网络模式

docker network ls (查看已有的网络及其模式)
docker network create -d bridge xxx(创建bridge网络模式,xxx是网络名)
docker run -d -p 3306:3306 --name mysql-1 --network xxx -e 'MYSQL_ROOT_PASSWORD=密码' mysql(创建并运行一个使用自己创的网络模式的容器)

bridge模式(桥接)、host模式、null模式、 container模式

这四种模式都只考虑一台宿主机与容器的通信

那么什么模式可以让docker和多台宿主机之间通信呢

overlay模式

容器运行起来是一个进程,进程的数据默认都在内存里,内存里的数据停电容易丢失,容器里运行的app的数据需要永久保存(持久化),存放在磁盘里就可以永久保存

卷 volume:容易保存数据到宿主机里

​ 数据持久化:永久保存

​ 数据共享:容器和容器之间共享,容器和宿主机之间共享

​ 卷本质就是宿主机的一个文件夹

案例:1、在一台宿主机上实现容器和宿主机之间的数据共享

​ 2、在一台宿主机上实现多个容器之间的数据共享

​ 3、使用nfs服务器实现多个宿主机上的容器之间的数据共享

卷的存放路径:/var/lib/docker/volumes
docker volume ls(查看有哪些卷)
docker volume create xxx(创建名为xxx的数据卷)

案例1用法:
*写法1:docker run -d -p 82:80 --name nginx-3 -v xxx:/usr/share/nginx/html nginx
(-v xxx:/usr/share/nginx/html 就是将容器里的html文件挂载到名为xxx的卷下)

写法2:docker run -d -p 82:80 --name nginx-3 --mount source=xxx,target=/usr/share/nginx/html nginx
(--mount就是挂载 source=xxx就是挂载源,xxx是卷的名字 target=/usr/share/nginx/html就是容器里的目标文件夹)

案例2用法:
docker run -d -p 82:80 --name nginx-3 -v xxx:/usr/share/nginx/html nginx
docker run -d -p 83:80 --name nginx-4 -v xxx:/usr/share/nginx/html nginx
(这样两个nginx容器里的html文件都被挂载到一个卷上了)

案例3用法:
服务端操作:
先下载nfs服务
yum install nfs-utils -y
systemctl start nfs
systemctl enable nfs
mkdir -p /web(创建一个共享文件夹)
cd web
vim index.html(随便输入)
配置核心exports
vim /etc/exports
	/web 192.168.194.0/24(rw,no_root_squash,sync)
然后修改权限
chmod 777 /web
再刷新服务配置
exportfs -rv
客户端操作:
先下载nfs服务
yum install nfs-utils -y
在第二台宿主机上执行
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.194.128,nolock,soft,rw,sync --opt device=:/web nfs-web-1

镜像制作

yum install golang -y
cd /Dockerfile
ls(这个目录下都是需要找来的)
	go+html+mysql+redis.zip  go.sum    Readme.md  static
	go.mod                   info.sql  server.go  templates
#编译网站成一个二进制程序
go env -w GOPROXY=https://goproxy.cn,direct #配置国内下载源
go build -o server server.go
ls
	go+html+mysql+redis.zip  go.sum    Readme.md  static
	go.mod                   info.sql  server.go  server  templates
#编写dockerfile
mkdir docker
cd docker
vim Dockerfile
	FROM centos:7 #指定容器里使用的微型的系统是centos7 -->基础镜像
	WORKDIR /go #进入容器会进入这个目录,工作目录,在执行镜像的时候会自动创建-->家目录-->docker exec
	COPY . /go  #复制宿主机当前目录下的所有的内容到容器的/go目录下 -->docker cp
	ENTRYPOINT ["/go/server"] #容器启动运行的时候执行的命令,使用的是绝对路径执行/go/sever程序
#复制二进制程序等文件夹到目录下
[root@docker docker]# cp /Dockerfile/server .
[root@docker docker]# cp /Dockerfile/static/ . -r
[root@docker docker]# cp /Dockerfile/templates/ . -r
[root@docker docker]# ls
Dockerfile  server  static  templates
执行命令完成镜像制作
docker build -t web:1.0 .
[root@docker docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
web          1.0       e455d6dfa1d2   19 seconds ago   222MB
启动容器
docker run -d -p 8080:8080 --name web-1 web:1.0

再练习制作一个没什么内容的Dockerfile
vim Dockerfile
	FROM centos:7
	WORKDIR /
	RUN rm -rf /etc/yum.repos.d/CentOS*
	COPY /etc/yum.repos.d/Centos-7.repo /etc/yum.repos.d/Centou-7.repo
	RUN yum install vim -y
练习:
1.以centos7为基础镜像
2.在里面安装好ip、vim、ping命令
3.编译好nginx
4.启动容器的时候就启动nginx
5.网页代码上传到容器里:1.直接做到镜像里 2.使用数据卷挂载使用/usr/local/nginx1/html
FROM centos:7
WORKDIR /nginx
RUN rm -rf /etc/yum.repos.d/*
COPY Centos-7.repo /etc/yum.repos.d/
COPY install_nginx.sh /nginx
RUN yum clean all && yum makecache
RUN yum install vim -y \
    && bash /nginx/install_nginx.sh
EXPOSE 80
VOLUME /usr/local/nginx1/html
ENV PATH=/usr/local/nginx1/sbin/:$PATH
CMD ["nginx", "-g", "daemon off;"]            
Dockerfile指令
指令	                    核心作用	          执行时机
*FROM	                 基础镜像	            构建开始
*RUN	               安装依赖 / 执行命令	     构建时
*COPY/ADD	           复制文件到镜像	          构建时
*WORKDIR	             设置工作目录	        构建 / 运行时
ENV	                    设置环境变量	        构建 / 运行时
EXPOSE	                  声明端口	             声明
CMD	                   容器默认启动命令	          运行时
*ENTRYPOINT	           容器固定启动命令	          运行时
VOLUME                   声明数据卷              运行时
docker3大概念
1.镜像
	docker images\pull\search\rmi\save\load\tag\inspect
2.仓库
	公共的仓库
	私人的仓库
	docker login
	docker pull
	docker push
		阿里云的ACR aliyun cloud register
		1、注册阿里云的账号
		2、访问ACR控制台,开通个人服务
		3、创建一个命名空间
		4、访问命名空间需要密码,设置一个密码
		5、创建一个镜像仓库
	将镜像推送到Registry
	docker login --username=*****@**.com registry.ap-southeast-1.aliyuncs.com
	docker tag [imageID] registry.ap-southeast-1.aliyuncs.com/**/**:镜像版本号
	docker push registry.ap-southeaast-1.aliyuncs.com/**/**:镜像版本号
3.容器

harbor

harbor 是存放镜像的仓库,公司内部可以使用自己的镜像
docker compose 是在一台机器上进行容器编排的工具
		编排:可以同时启动很多个容器,多个容器之间可以链接
		编排文件:yaml文件--里面定义了如何去启动很多容器,以及容器的参数,例如:镜像,卷,链接,网络等信息
k8s:是在多台机器上进行容器编排的工具

harbor的安装
1、安装好docker和docker compose
2、下载harbor的源码
...
...

更多推荐