docker

一.容器镜像与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(即宿主机当前目录)

数据恢复

  1. -it:交互式终端,允许你与容器内的 shell 交互
  2. --name test:给容器命名为 test
  3. -v leevol1:/data1:将命名卷 leevol1 挂载到容器的 /data1 目录
  4. -v "$(pwd)":/backup:将宿主机当前目录挂载到容器的 /backup 目录
  5. 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的负载均衡

相关推荐
好好风格12 分钟前
宝塔面板 HTTPS 端口证书不生效排查记录
linux·运维·nginx
zzipeng1 小时前
Linux LCD驱动
linux·运维·服务器
浮生若城1 小时前
Linux库制作与原理(2):理解链接与加载
linux·运维·服务器
Cat_Rocky1 小时前
Gitlab安装与配置
linux·运维·gitlab
志栋智能2 小时前
超自动化巡检:降低运维总成本(TCO)的有效路径
大数据·运维·网络·人工智能·自动化
陈陈CHENCHEN2 小时前
【Kubernetes】Kubeadm 搭建生产级 K8s 高可用集群
云原生·容器·kubernetes
Yang96112 小时前
一站式网络检测 鼎讯信通网络综合测试仪科普
运维·服务器·网络·能源
越强越不秃2 小时前
大模型驱动的PoC脚本自动化生成:从挑战到实践
运维·自动化·安全工程师
杰克逊的日记3 小时前
K8s+GPU+大模型运维主要技术点
运维·容器·kubernetes