一.容器镜像与docker
docker是一种开源工具,负责管理容器和镜像,
镜像是容器的模版,容器是镜像的运行实例
容器具有一致性(在任何环境中行为一致)、隔离性(进程、文件系统、网络等相互隔离)和可移植性(一次打包,到处运行)。
二.安装部署docker
先配置yum源

安装docker-ce

如果有podman就先删除podman
yum remove podman -y
systemctl enable --now docker 启动docker
查看信息

编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables

如果没有iptables顺便安装
docker速度非常慢需要配置加速地址

三.docker镜像命令
docker search 镜像:版本号 #搜索镜像,需要加速地址,但我这个搜不了
docker pull 镜像:版本号 #拉取镜像
docker images #查看镜像库

docker rmi 镜像:版本号 #删除镜像
docker load -i 镜像 #导入镜像

docker save -o 名称.tar 镜像:版本号 #保存镜像

四 容器相关的命令
docker run --name 名字 -t 镜像:版本号 创建一个容器(最基础)

run 运行 -i 交互式 -t 启动一个终端 -d代表后台运行 -p端口映射 第一个80代表本地主机的端口第二个代表容器里的端口

查看正在运行的容器
查看所有容器
停止容器运行.
开启容器运行
进入容器
删除容器(删掉容器后开启新的容器文件不存在)

删除正在运行的容器
容器内容提交(会保存为一个镜像)

从虚拟机中拷文件到docker容器中

从docker容器中拷文件到虚拟机中

查询日志:docker logs name
五.镜像构建
FROM
指定base镜像 eg:FROM busybox:version
COPY
复制文件 eg:COPY file /file 或者 COPY ["file","/"]
MAINTAINER
指定作者信息,比如邮箱 eg:MAINTAINER user@example.com 在最新版的docker中用LABEL KEY="VALUE"代替
ADD
功能和copy相似,指定压缩文件或url eg: ADD test.tar /mnt 或者 eg:ADD http://ip/test.tar /mnt
ENV
指定环境变量 eg:ENV FILENAME test
EXPOSE
暴漏容器端口 eg:EXPOSE 80
VOLUME
申明数据卷,通常指数据挂载点 eg:VOLUME ["/var/www/html"]
WORKDIR
切换路径 eg:WORKDIR /mnt
RUN
在容器中运行的指令 eg: touch file
CMD
在启动容器时自动运行动作可以被覆盖 eg:CMD echo FILENAME 会调用shell解析 eg:CMD \["/bin/sh","-c","echo FILENAME"] 不调用shell解析
ENTRYPOINT
和CMD功能和用法类似,但动作不可被覆盖
实例
在/root/docker底下创建这些

add会帮助解压 copy是直接复制

创建镜像

创建容器
cmd与ENTRYPOINT
创建镜像与容器后
cmd


cmd命令会被刷掉
ENTRYPOINT
命令不会被刷掉
在容器里面下东西


六.镜像优化
1.缩减镜像层
减少run的层数
2.多阶构建
在run后面在创一层
第二阶只需要安装第一台安装好了的内容


3.最简镜像

七.搭建私人仓库
普通的registry仓库

在docker ps中查看是否up如果up就给要存入仓库的镜像大标签

做完之后访问不了是因为默认是加密的,所以通过daemon.json文件告诉它我是http登录,不要https登录

做完之后就可以了
为Registry提加密传输
提前在根下创建一个certs目录

查看文件是否在

启动registry仓库

看是否up
存入镜像
发现不行是因为没有把证书挂载到容器里的目录和给大标签
访问
为仓库建立登陆认证
提前创建认证用户
登录
登录之后才能上传镜像
企业级仓库构建harbor
先把前面配的registry删了,留个registry镜像就行
解压harbor-offline-installer-v2.5.4.tgz 之后进去
mv harbor.yml.tmpl harbor.yml #这个是模版
vim harbor.yml (与先前的证书息息相关)
要和认证信息存放的目录保持一致
自动化安装部署命令
有些容器可能不会自动打开,要重启harbor

进去


登录


在harbor上看

八.Docker 网络
docker原生bridge网路
默认的,不设定就是bridge
docker原生网络
host容器创建时指定 --network=host
docker 原生网络none
禁用网络功能,只有lo接口

docker的自定义网络
默认桥接网络
创建新容器时会默认使用桥接网络安装bridge-utils
打开路由内核,rehl9自动开,其他手动开
测试在容器里ping通node2的ip
开启nginx会生成一个网卡,与docker0同一网段,docker0与eth0相连,所以容器可以与虚拟机相连

让不同的自定义网络互通
方法1

需要把my_net2给到test1才会互相访问,同时test1也会有my_net2网络的IP地址


方法2
这是因为test2用的是test1的网络,使用的是同一个网络接口,所以centos可以访问nginx
joined网络
Joined容器一种较为特别的网络模式,•在容器创建时使用--network=container:vm1指定。
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通 信。
安装php和mysql的镜像


-e指定变量,在外部制定,内部会自动识别
容器内外网的访问iptables -t nat -nL
外网访问docker容器
打开网卡混杂模式

九.Docker 数据卷管理及优化
一般容器被删了之后,里面的数据就会消失,而数据卷可以把数据记录下来,并共享出去,一个数据卷可以被一个或多个容器使用
bind mount数据卷
手动建立并挂载,挂载后会覆盖容器里的内容
/data1可读写 /data只读
将虚拟机上的/tmp挂载到容器的/var上,原来var上的内容被覆盖了

docker managed数据卷
把内容追加到容器里,不会覆盖。默认创建的数据卷目录都在 /var/lib/docker/volumes 中

docker volume prune #清理未使用的 Docker 数据卷
通过宿主机操作卷 (/var/lib/docker/volumes/xxx/_data/leefile
) 创建的文件,出现在容器内的 /var/lib/mysql
目录,是因为 Docker 卷实现了目录映射。这证明了卷的正确挂载
将容器里的数据外挂到虚拟机上


-
使用
docker rm -v
删除容器时: 添加-v
(或--volumes
) 标志会同时删除 与该容器关联的匿名 volume。 -
使用
docker run --rm
运行容器时: 容器停止后自动删除容器本身及其关联的匿名 volume。
实例
当在卷里的/_data里写了数据后,可以在容器内访问,同时容器被删,卷的内容也不会消失
数据卷容器
数据卷容器(Data Volume Container)是 Docker 中一种特殊的容器,主要用于方便地在多个容器之间 共享数据卷。

备份与迁移数据卷
备份数据卷
/backup
是容器内部的一个目录

-
--volumes-from test1
:让新容器共享test1
容器的卷,因此能访问test1
容器内的/etc
目录 -
-v
pwd:/backup
:将宿主机当前目录挂载到容器的/backup
,用于输出打包文件 -
tar zcf /backup/data1.tar.gz /etc
:在容器内执行打包,将/etc
压缩到/backup/data1.tar.gz
(即宿主机当前目录)
数据恢复

-it
:交互式终端,允许你与容器内的 shell 交互--name test
:给容器命名为test
-v leevol1:/data1
:将命名卷leevol1
挂载到容器的/data1
目录-v "$(pwd)":/backup
:将宿主机当前目录挂载到容器的/backup
目录sh -c "..."
:执行两个命令:tar zxf /backup/data1.tar.gz
:解压备份文件到容器当前目录(即根目录/
)&& /bin/sh
:解压成功后启动一个交互式 shell
十.docker的安全优化
修改当前运行内核的启动参数,主要是为了调整 cgroup 层级结构 的配置
cgroup
是 Linux 内核提供的一种资源管理机制 ,用于限制、记录和隔离进程组对系统资源(如 CPU、内存、磁盘 I/O、网络带宽等)的使用
被隔离的内容

查看特定 Docker 容器的内存限制

Docker的资源限制
查看 cgroup 挂载信息(mount -t cgroup也行)
CPU限制
要提前安装Ubuntu,效果会很明显
root@docker \~\]# docker run -it --rm --name test \\ --cpu-period 100000 \\ #设置 CPU 周期的长度,单位为微秒(通常为 100000,即 100 毫秒) --cpu-quota 20000 ubuntu #设置容器在一个周期内可以使用的 CPU 时间,单位也 是微秒。 dd if=/dev/zero of=/dev/null \& #在容器里面输入会把资源充满 docker在受到攻击后,会开启超多进程,导致cpu爆满,系统最终宕机,但是重启虚拟机,容器会关闭 查看docker的cpu资源限制 cat /sys/fs/cgroup/system.slice/docker-许多数字.scope/cpu.max **cpu的优先级:**最大值是1024,值越大优先级越高 #### 内存使用限制 查看容器内存使用限制  在系统中/dev/shm这个目录被挂在到内存中 **安装 libcgroup**  cgexec -g memory:docker/容器id dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=150 可写150m,当超过200m会被杀死,在200以内会被写入  #### 磁盘IO限制 磁盘IO:计算机与磁盘之间的数据传输操作 每秒写入的速度不能超过30兆,但是开启容器后会发现速度和设定不匹配, 是因为系统的缓存机制  写入的速度其实还是大于我们设定的,因为还不是和硬盘直连的oflag=direct硬盘直连  #### Docker的安全加固  一模一样是因为docker做的是安全隔离,不是系统隔离 运行lxcfs并解决容器隔离性 lxcfs /var/lib/lxcfs \& #### 容器特权 添加了--privileged 参数(默认=true)开启容器,容器获得权限近乎于宿主机的root用户 #### 容器特权的白名单 --privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供 给容器必须的权限。此时Docker 提供了权限白名单的机制,使用--cap-add添加必要的权限  ## 容器编排工具Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 前面harbor就有一些docker compos的内容,创建多个容器 主要功能 1. 定义服务: 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。 2. 一键启动和停止: 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 dockercompose down 命令可以停止并删除这些服务。 3. 服务编排: 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。 4. 环境变量管理: 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。 #### 常用命令 docker compose up -d 启动配置文件中定义的所有服务。 docker compose down 停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。 docker compose start 启动已经存在的服务,但不会创建新的服务。 docker compose stop 停止正在运行的服务。 docker compose restart 重启服务。 #### 创建docker compose服务 创建一个yum源  创建一个dockerfile文件来生成镜像  通过生成的镜像来创建docker compose服务  创建docker compose服务  查看 #### 企业实例   networks: mynet1: driver: bridge #使用桥接驱动,也可以使用macvlan用于跨主机连接 volumes: web1_data: #项目名 name: web1_data #名称(可以随便改,但最好与项目名一致) 拆包  vim haproxy.cfg   实现了haproxy的负载均衡