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![](https://i-blog.csdnimg.cn/direct/98dfc997664940a0b9403cbbd57f653a.png) **cpu的优先级:**最大值是1024,值越大优先级越高 #### 内存使用限制 查看容器内存使用限制 ![](https://i-blog.csdnimg.cn/direct/fa5b9cfcd58b4a3e8494ed2e5cb1e8a2.png)![](https://i-blog.csdnimg.cn/direct/14bcff13c74949bc926e04c5e86e1ad3.png)![](https://i-blog.csdnimg.cn/direct/855811e40b0f407a81f67956e557aa45.png) 在系统中/dev/shm这个目录被挂在到内存中 ![](https://i-blog.csdnimg.cn/direct/56e6b586fdee4f709eedd1d80ac61f37.png)**安装 libcgroup** ![](https://i-blog.csdnimg.cn/direct/360d6610ef5f42a88285b7230737980b.png) cgexec -g memory:docker/容器id dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=150 可写150m,当超过200m会被杀死,在200以内会被写入 ![](https://i-blog.csdnimg.cn/direct/0c6b47211c664b44b067379d89156641.png)![](https://i-blog.csdnimg.cn/direct/952c1350ee7a4296b7a0659641447150.png) #### 磁盘IO限制 磁盘IO:计算机与磁盘之间的数据传输操作 每秒写入的速度不能超过30兆,但是开启容器后会发现速度和设定不匹配, 是因为系统的缓存机制 ![](https://i-blog.csdnimg.cn/direct/30a54bf129c54af286f7db688036c6d7.png) 写入的速度其实还是大于我们设定的,因为还不是和硬盘直连的![](https://i-blog.csdnimg.cn/direct/503b0e2cd0a74028b810f7a69cc97a5f.png)oflag=direct硬盘直连 ![](https://i-blog.csdnimg.cn/direct/f1efb9b5229b4de9b75362c2f6b1a4dc.png) #### Docker的安全加固 ![](https://i-blog.csdnimg.cn/direct/327e63c6c96749ddb8703c7e87e1cb2c.png) 一模一样是因为docker做的是安全隔离,不是系统隔离 运行lxcfs并解决容器隔离性 lxcfs /var/lib/lxcfs \& #### ![](https://i-blog.csdnimg.cn/direct/639f0860c33a4b24b4f2dbae0e702cf8.png)容器特权![](https://i-blog.csdnimg.cn/direct/cc3f4ba80aec4f9f88256a3978cdef63.png) 添加了--privileged 参数(默认=true)开启容器,容器获得权限近乎于宿主机的root用户 #### ![](https://i-blog.csdnimg.cn/direct/04d69ea167284d748b4a37d84b40b27a.png)容器特权的白名单 --privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供 给容器必须的权限。此时Docker 提供了权限白名单的机制,使用--cap-add添加必要的权限 ![](https://i-blog.csdnimg.cn/direct/04aaf8a2ab8249989bf71aa0bf8e964c.png) ## 容器编排工具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源 ![](https://i-blog.csdnimg.cn/direct/fd4e4d5e3e2d411790d19b8a72161271.png) 创建一个dockerfile文件来生成镜像 ![](https://i-blog.csdnimg.cn/direct/bb69f139c970421f9ff09ce9bb92abc7.png) 通过生成的镜像来创建docker compose服务 ![](https://i-blog.csdnimg.cn/direct/0ce72e2da3834772a9e6220adf50456a.png) 创建docker compose服务 ![](https://i-blog.csdnimg.cn/direct/8febdd0db4bd4af2bc248d1e7b8be4fe.png) 查看![](https://i-blog.csdnimg.cn/direct/88a5a2e044d141e8a9d891d107d37310.png) #### 企业实例 ![](https://i-blog.csdnimg.cn/direct/b3929addfbc648c292be2a52f235f085.png) ![](https://i-blog.csdnimg.cn/direct/42b1a381937d433dbccdbc5a78644e4b.png) networks: mynet1: driver: bridge #使用桥接驱动,也可以使用macvlan用于跨主机连接 volumes: web1_data: #项目名 name: web1_data #名称(可以随便改,但最好与项目名一致) 拆包 ![](https://i-blog.csdnimg.cn/direct/ee8e301105b44d23b8f79071c295e947.png) vim haproxy.cfg ![](https://i-blog.csdnimg.cn/direct/a61fef59c729446c9a31025ca2992921.png)![](https://i-blog.csdnimg.cn/direct/a462c7355d514a43b46dd81f0d0ed333.png) ![](https://i-blog.csdnimg.cn/direct/cfeaffa7208d4bd0890557cc75ac6172.png)![](https://i-blog.csdnimg.cn/direct/960a841e76cf45d5b616105ffb32182c.png) 实现了haproxy的负载均衡

相关推荐
morliz子轩2 小时前
基于WSL搭建Ubuntu 22.04.x LTS开发环境
linux·运维·ubuntu
BJ_Bonree3 小时前
数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系
运维·科技
Janspran3 小时前
嵌入式linux学习 -- 进程和线程
linux·运维·学习
Cosmoshhhyyy4 小时前
linux远程部署dify和mac本地部署dify
linux·运维·macos
SirLancelot14 小时前
K8s-kubernetes(二)资源限制-详细介绍
微服务·云原生·容器·kubernetes·k8s·devops·kubelet
路多辛6 小时前
Debian新一代的APT软件源配置文件格式DEB822详解
linux·运维·ubuntu·debian
油丶酸萝卜别吃7 小时前
nginx配置代理服务器
运维·网络·nginx
maomao1713147 小时前
Jenkins 环境部署
运维·jenkins
dessler7 小时前
Hadoop HDFS-部署和基本操作
linux·运维·hdfs