Docker

1、简介

(1)、特点及其优势

Docker 是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术
它具有以下几个重要特点和优势:
轻量级虚拟化
Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源
一致性
确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。
可移植性
可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差异。
高效的资源利用 :多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资源。
易于部署和扩展 :能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。

(2)、docker****在企业中的应用场景


在企业中 docker 作为业务的最小载体而被广泛应用
通过 docker 企业可以更效率的部署应用并更节省资源

(3)、docker****与虚拟化的对比


2、部署

复制代码
#安装docker
]# yum install -y docker-ce
#编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--iptables=true
]# systemctl enable --now docker
]# docker info

A、docker的安装部署

3、Docker****镜像管理

复制代码
#从镜像仓库中拉取镜像
[root@Docker100 ~]# docker pull busybox
[root@Docker100 ~]# docker pull nginx:1.26-alpine
#查看本地镜像
[root@Docker100 ~]# docker images

导出镜像
#保存镜像
[root@Docker-node1 ~]# docker image save nginx:latest -o nginx-latest.tar.gz
[root@Docker-node1 ~]# docker image save nginx:latest nginx:1.26-alpine -onginx.tag.gz
#保存所有镜像
[root@Docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz
删除镜像
[root@Docker-node1 ~]# docker rmi nginx:latest
[root@Docker-node1 ~]# docker rmi `docker images | awk 'NR>1{print $1":"$2}'`
启动容器
[root@Docker-node1 ~]# docker run -d --name mario -p 80:8080 timinglee/mario

B、docker镜像拉取


C、docker的基本命令使用

-d #后台运行
-i #交互式运行
-t #打开一个终端
--name #指定容器名称
-p #端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm #容器停止自动删除容器
--network #指定容器使用的网络

复制代码
 查看容器运行信息
[root@Docker-node1 ~]# docker ps #查看当前运行容器
[root@Docker-node1 ~]# docker ps -a #查看所有容器
[root@Docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息

复制代码
#在容器中执行命令
[root@docker ~]# docker exec -it test ifconfig
停止和运行容器
[root@Docker-node1 ~]# docker stop busybox #停止容器
[root@Docker-node1 ~]# docker kill busybox #杀死容器,可以使用信号
[root@Docker-node1 ~]# docker start busybox #开启停止的容器
删除容器
[root@Docker-node1 ~]# docker rm centos7 #删除停止的容器
[root@Docker-node1 ~]# docker rm -f busybox #删除运行的容器
[root@Docker-node1 ~]# docker container prune -f #删除所有停止的容器

容器内容提交

系统中的文件和容器中的文件传输

查询容器内部日志

复制代码
 系统中的文件和容器中的文件传输
[root@Docker-node1 ~]# docker cp test2:/leefile /mnt #把容器中的文件复制到本机
Successfully copied 1.54kB to /mnt
[root@Docker-node1 ~]# docker cp /etc/fstab test2:/fstab #把本机文件复制到容器中

4、docker镜像构建

(1)、基本原理


Copy-on-Write 可写容器层
容器层以下所有镜像层都是只读的
docker 从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
一个镜像最多 127 层

(2)、构建参数

FROM 指定 base 镜像 eg : FROM busybox:version
COPY 复制文件 eg : COPY file /file 或者 COPY ["file","/"]
MAINTAINER 指定作者信息,比如邮箱 eg : MAINTAINER [email protected] 在最新版的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 功能和用法类似,但动作不可被覆盖

D、镜像构建

E、docker构建示例


复制代码
[root@server1 ~]# mdkir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# cp ~/nginx-1.23.3.tar.gz .
[root@server1 docker]# vim Dockerfile
FROM centos:7
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@server1 docker]# docker build -t webserver:v1 .
[root@server1 docker]# docker images webserver
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v1 bfd6774cc216 8 seconds ago 494MB
[root@server1 docker]# docker history webserver:v1
[root@server1 docker]# docker run -d --name checkimage webserver
[root@server1 docker]# docker inspect web1

4、docker仓库管理

(1)docker 仓库


Docker 仓库可以分为公共仓库和私有仓库:
公共仓库,如 Docker Hub ,任何人都可以访问和使用其中的镜像。许多常用的软件和应用都有在
Docker Hub 上提供的镜像,方便用户直接获取和使用。 例如,您想要部署一个 Nginx 服务器,就可以从 Docker Hub 上拉取 Nginx 的镜像。
私有仓库则是由组织或个人自己搭建和管理的,用于存储内部使用的、不希望公开的镜像。 比如,一家企业为其特定的业务应用创建了定制化的镜像,并将其存储在自己的私有仓库中,以保证安全性和控制访问权限。
通过 Docker 仓库,开发者能够方便地共享和复用镜像,加速应用的开发和部署过程。

(2)docker hub


Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。
它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。
以下是 Docker Hub 的一些关键特点和优势:

  1. 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、 Web 服务器等众多应用的镜像。 例如,您可以轻松找到 Ubuntu 、 CentOS 等操作系统的镜像,以及 MySQL 、 Redis 等数据库的镜像。
  2. 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
  3. 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
  4. 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
  5. 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。

F、docker hub

复制代码
#登陆官方仓库
[root@docker ~]# docker login
[root@docker ~]# docker push ll/nginx.v3

(3)、docker仓库的工作原理

a、pull原理
镜像拉取分为以下几步:
1.docker 客户端向 index 发送镜像拉去请求并完成与 index 的认证
2.index 发送认证 token 和镜像位置给 dockerclient
3.dockerclient 携带 token 和根据 index 指引的镜像位置取连接 registry
4.Registry 会根据 client 持有的 token 跟 index 核实身份合法性
5.index 确认此 token 合法性
6.Registry 会根据 client 的请求传递镜像到客户端
b、push原理
镜像上传的步骤:
1.client 向 index 发送上传请求并完成用户认证
2.index 会发方 token 给 client 来证明 client 的合法性
3.client 携带 index 提供的 token 连接 Registry
4.Registry 向 index 合适 token 的合法性
5.index 证实 token 的合法性
6.Registry 开始接收客户端上传过来的镜像

(4)、搭建docker的私有仓库

G、docker仓库数据传输加密

复制代码
[root@docker100 ~]# docker push zz.ll.org/busybox:latest


H、docker仓库用户认证

复制代码
[root@docker100 ~]# yum install httpd-tools -y
[root@docker100 ~]# mkdir auth





复制代码
[root@docker100 ~]# docker login zz.ll.org
[root@docker100 ~]# docker push zz.ll.org/registry:latest

(5)、构建企业级私有仓库

Harbor 是由 vmware 公司开源的企业级 Docker Registry 项目。
它提供了以下主要功能和特点:

  1. 基于角色的访问控制( RBAC ):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性。
  2. 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
  3. 图形化用户界面( UI ):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
  4. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
  5. 垃圾回收:可以清理不再使用的镜像,节省存储空间。

I、harbor仓库的建立

复制代码
[root@docker100 harbor]# vim harbor.yml

5、docker 网络

(1)、docker原生bridge****网络

bridge 模式下容器没有一个公有 ip ,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的 NAT 规则后可以访问外网

(2)、docker原生网络host

host 网络模式需要在容器创建时指定 --network=host
host 模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性

(3)、docker原生网络none

none 模式是指禁用网络功能,只有 lo 接口,在容器创建时使用
--network=none 指定。

root@docker \~\] # docker run -it --name test --rm --network none busybox / # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) #### J、docker原生网站及自定义桥接 ![](https://i-blog.csdnimg.cn/direct/8fb55c6ff8464045aebad3711fc25df5.png) ![](https://i-blog.csdnimg.cn/direct/8f718ec4d3274f63b9032f385dca5023.png) ![](https://i-blog.csdnimg.cn/direct/5d017ec60bf94dc7b5b07b3d9b5a0926.png) ![](https://i-blog.csdnimg.cn/direct/675c702bfd29493c8c3c6f54234f2b8e.png) ![](https://i-blog.csdnimg.cn/direct/9ee96c2e903b456e8be39da8a6d85b67.png) ![](https://i-blog.csdnimg.cn/direct/8d3c978fc5484415aaeb47344a40775e.png) ![](https://i-blog.csdnimg.cn/direct/87b36e1332bc49cd947918ee3165d759.png) 自定义网络 ![](https://i-blog.csdnimg.cn/direct/6505c71cb9e443df8562d4e3731207d2.png) ![](https://i-blog.csdnimg.cn/direct/8458d1b0d85244ec95939c20f9f0ebec.png) ![](https://i-blog.csdnimg.cn/direct/d03aa23f19674848abcaf2659707ff49.png) ![](https://i-blog.csdnimg.cn/direct/1847745c5cdc48c9903cdc9b6d2f97af.png) [root@docker100 ~]# docker run -it --name test1 --network mynet1 busybox ### (4)、docker容器间的网络通信 ![](https://i-blog.csdnimg.cn/direct/67e7730a53d547479963cdf28d9d07bc.png) [root@docker ~]# docker run -d --name web1 --network my_net1 nginx [root@docker ~]# docker run -it --name test --network my_net2 busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:00:01 inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:36 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5244 (5.1 KiB) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping 172.18.0.2 PING 172.18.0.2 (172.18.0.2): 56 data bytes [root@docker ~]# docker network connect my_net1 test #在上面test容器中加入网络eth1 / # ifconfig ### (5)、joined容器 Joined 容器一种较为特别的网络模式, • 在容器创建时使用 --network=container:vm1 指定。( vm1 指定 的是运行的容器名) 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信。 ![](https://i-blog.csdnimg.cn/direct/a7d42672c7984e1f9d8c624fb48997a7.png) #### K、docker容器间的网络通信 ![](https://i-blog.csdnimg.cn/direct/29fd0781030f49bfb23c385540898b32.png) [root@docker100 ~]# docker network connect mynet1 test1 ![](https://i-blog.csdnimg.cn/direct/8e9edd2bfc1a4c199fb04a43e7e96bb9.png) ![](https://i-blog.csdnimg.cn/direct/5e558445663544b2b85e54291621b576.png) ![](https://i-blog.csdnimg.cn/direct/2429db51c01b4e7fb7b6b0a6b3241a0a.png) ![](https://i-blog.csdnimg.cn/direct/257cf15801d84350b068d10b953da2db.png) ![](https://i-blog.csdnimg.cn/direct/13a29be377fb4db791c6e2a0a53894c3.png) ![](https://i-blog.csdnimg.cn/direct/6ec0a56d9d004caabd68142c5af84f5c.png) ![](https://i-blog.csdnimg.cn/direct/30d476b4541d4ded9ea9f653435984db.png) ![](https://i-blog.csdnimg.cn/direct/9e810334387947019fe05f3ec0202711.png) ![](https://i-blog.csdnimg.cn/direct/41203323a96d49568c6de6a5860e7aa2.png) ![](https://i-blog.csdnimg.cn/direct/c2f3e1e4c8ea49eaa60b6c520bf8fd12.png) ![](https://i-blog.csdnimg.cn/direct/54fc25973751469aa07535b45b159e22.png) ![](https://i-blog.csdnimg.cn/direct/4c78126a2b764dd3a0d18bc12d3a46dd.png) ![](https://i-blog.csdnimg.cn/direct/d0122de99ded4b389684b2d21e7fdd65.png) ### (6)、容器内外网的访问 ![](https://i-blog.csdnimg.cn/direct/b91469cfb9b54578affaf67a5cc4b7b4.png) #### L、docker容器内外网的访问 内网 ![](https://i-blog.csdnimg.cn/direct/9074071198e549c28434de1182800c52.png)![](https://i-blog.csdnimg.cn/direct/b3a3e54229e24eee8af2098eedf1a9d2.png)![](https://i-blog.csdnimg.cn/direct/d37842ccec6245c1b95ece37be1be8d8.png)![](https://i-blog.csdnimg.cn/direct/1c51c9efebda47d7afb5f51480992e87.png) 外网 ![](https://i-blog.csdnimg.cn/direct/2a5e750d70b241c294384a2d8e41e275.png) ![](https://i-blog.csdnimg.cn/direct/2a758acaa3e34fbfba5efa7bdfedf808.png) ![](https://i-blog.csdnimg.cn/direct/fc12d436cc2847deaabef1f2037257ea.png) ![](https://i-blog.csdnimg.cn/direct/177335f1ee6d43d787cabcabdf020dc8.png) ### (7)、**docker****跨主机网络** CNM ![](https://i-blog.csdnimg.cn/direct/f87bcd31f961410db8c1a8f750123c7c.png) **CNM分三类组件** Sandbox :容器网络栈,包含容器接口、 dns 、路由表。( namespace ) Endpoint :作用是将 sandbox 接入 network ( veth pair ) Network :包含一组 endpoint ,同一 network 的 endpoint 可以通信 **macvlan** **网络方式实现跨主机通信** **macvlan** **网络方式** Linux kernel 提供的一种网卡虚拟化技术。 无需 Linux bridge ,直接使用物理接口,性能极好 容器的接口直接与主机网卡连接,无需 NAT 或端口映射 macvlan 会独占主机网卡,但可以使用 vlan 子接口实现多 macvlan 网络 vlan 可以将物理二层网络划分为 4094 个逻辑网络,彼此隔离, vlan id 取值为 1\~4094 **macvlan** **网络间的隔离和连通** macvlan 网络在二层上是隔离的,所以不同 macvlan 网络的容器是不能通信的 可以在三层上通过网关将 macvlan 网络连通起来 docker 本身不做任何限制,像传统 vlan 网络那样管理即可 #### M、docker跨主机网络 ![](https://i-blog.csdnimg.cn/direct/51976f2f7181416b8c7235b308248c15.png)![](https://i-blog.csdnimg.cn/direct/bb4bb535ad3d4f72bd26ac0f5f316f58.png)![](https://i-blog.csdnimg.cn/direct/77987495adeb4e708de4a2e1d352ac79.png)![](https://i-blog.csdnimg.cn/direct/7fd24ed0d2184ca592e4deccfe1a7634.png)![](https://i-blog.csdnimg.cn/direct/f0432d08a5bc4051a75797442b115df5.png)![](https://i-blog.csdnimg.cn/direct/88bc8ebe79c745688dbbb4d31ce07a97.png)![](https://i-blog.csdnimg.cn/direct/cfae2b26d3d8471a9a8c67dfc8138013.png)![](https://i-blog.csdnimg.cn/direct/f9b0c409d7c24c1c8b7fcd4a8522f32e.png)![](https://i-blog.csdnimg.cn/direct/a1ea32dc7e09445ab49d38a102fbd05b.png)![](https://i-blog.csdnimg.cn/direct/5fd7ec9b3b464e99b1cba69f05b58451.png)![](https://i-blog.csdnimg.cn/direct/07acefb6579a4dcc8940bbcc8423bae5.png)![](https://i-blog.csdnimg.cn/direct/7cab58ebf5b64ae3ac84d9e517b93839.png) ## 6、**Docker****数据卷管理及优化** ### ![](https://i-blog.csdnimg.cn/direct/84ff9049d4cd48fba4bb2a462bb762f9.png)(1)、bind mount数据卷 是将主机上的目录或文件 mount 到容器里。使用直观高效,易于理解。 使用 -v 选项指定路径,格式 :-v 选项指定的路径,如果不存在,挂载时会自动创建 #### N、docker数据卷 bind mount数据卷 ![](https://i-blog.csdnimg.cn/direct/a23a6e8ecae144ee82af7b22dbea6efb.png)![](https://i-blog.csdnimg.cn/direct/bc7f9fec935f44f4b832978526c1963a.png)![](https://i-blog.csdnimg.cn/direct/d83786f6259d4c1c9698ce1e52bcf033.png) ### (2)、**docker managed****数据卷** bind mount 必须指定 host 文件系统路径,限制了移植性 docker managed volume 不需要指定 mount 源, docker 自动为容器创建数据卷目录 默认创建的数据卷目录都在 /var/lib/docker/volumes 中 如果挂载时指向容器内已有的目录,原有数据会被复制到 volume 中 #### O、docker数据卷------docker managed 数据卷 ![](https://i-blog.csdnimg.cn/direct/2eb89d9a5a074c6f97c76131c7fb57e6.png) ![](https://i-blog.csdnimg.cn/direct/a7a02ac46aa041379b25ef80d180a74f.png) ![](https://i-blog.csdnimg.cn/direct/6878d4de3083436da76e94dd3530ae47.png) [root@docker100 volumes]# docker volume create mysqldate ![](https://i-blog.csdnimg.cn/direct/380c5d74e7f849e4899434b4cd1bd2df.png)![](https://i-blog.csdnimg.cn/direct/76dbd4bccef44334b59ab8ac13c491a9.png) 备份数据卷 [root@docker100 ~]# docker run --volumes-from datavol \ >-v `pwd`:/backup busybox \ >tar zcf /backup/data1.tar.gz /data1 数据恢复 docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh - c "tar zxf /backup/data1.tar.gz;/bin/sh" / # ls backup data1 etc lib proc sys usr bin dev home lib64 root tmp var / # cd data1/ #查看数据迁移情况 /data1 # ls index.html llfile1 ### (3)、**数据卷容器(****Data Volume Container****)** 数据卷容器( Data Volume Container )是 Docker 中一种特殊的容器,主要用于方便地在多个容器之间共享数据卷 \[root@docker \~\]# docker run -d --name datavol \\ -v /tmp/data1:/data1:rw \\ -v /tmp/data2:/data2:ro \\ -v /etc/resolv.conf:/etc/hosts busybox ### (4)、**bind mount****数据卷和****docker managed****数据卷的对****比** ![](https://i-blog.csdnimg.cn/direct/00a9dfa7f4f1487c8807af8c236da526.png) ## 7、docker的安全优化 ### (1)、命名空间隔离的安全 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了 最基础也最直接的隔离。与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作 系统内核。在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:磁盘等等 控制组资源控制的安全当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。 Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等 资源。 确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少 内核能力机制 能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。 大部分情况下,容器并不需要"真正的"root权限,容器只需要少数的能力即可。 默认情况下,Docker采用"白名单"机制,禁用"必需功能"之外的其他权限。 Docker服务端防护 使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全 问题。允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。 #### P、docker的安全优化 ![](https://i-blog.csdnimg.cn/direct/204de5b5c1bc49b681ef696928d2d0b0.png)![](https://i-blog.csdnimg.cn/direct/4965b45051fa41dca2dcc391da620d75.png)控制组资源控制的安全![](https://i-blog.csdnimg.cn/direct/fbd5bcd662e54319b0622b5c86da54dd.png)Docker服务端防护![](https://i-blog.csdnimg.cn/direct/581a6a897e844211be6f5349d5ee01ae.png) ### (2)、资源限制、限制CPU的使用 Linux Cgroups 的全称是 Linux Control Group 。 是限制一个进程组能够使用的资源上限,包括 CPU 、内存、磁盘、网络带宽等等。 对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。 Linux Cgroups 给用户暴露出来的操作接口是文件系统 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。 执行此命令查看: mount -t cgroup 在 /sys/fs/cgroup 下面有很多诸如 cpuset 、 cpu 、 memory 这样的子目录,也叫子系统。 在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。 控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定。 #### Q、docker中对容器资源限制的原理及对cpu资源限制的方法 ![](https://i-blog.csdnimg.cn/direct/c3c4691d653c4b40bd549ef5c977d215.png) ![](https://i-blog.csdnimg.cn/direct/9058b03504794dde938073299675b1e5.png) ![](https://i-blog.csdnimg.cn/direct/2a8fd9621864470faf1a36ea1a3b3099.png) ![](https://i-blog.csdnimg.cn/direct/4bda850f6c524e00a82353fbd3e81864.png) 限制cpu的优先级 #关闭cpu的核心,当cpu都不空闲下才会出现争抢的情况,为了实验效果我们可以关闭一个cpu核心 [root@docker100 ~]# echo 0 > /sys/devices/system/cpu/cpu1/online [root@docker100 ~]# cat /proc/cpuinfo 开启容器并限制资源 ![](https://i-blog.csdnimg.cn/direct/b0708812f4274064bfd78ffeb9283607.png)![](https://i-blog.csdnimg.cn/direct/9f45059a93ee4f8ebb4417675b234f00.png) #### R、限制内存使用 ![](https://i-blog.csdnimg.cn/direct/df95ff7867ba4fd2bc8ee1f2bc73d661.png) #查看容器内存使用限制 [root@docker ~]# cd /sys/fs/cgroup/memory/docker/d09100472de41824bf0 id96b977369dad843740a1e8e599f430/ [root@docker d091004723d4de41824f6b38a7be9b77369dad843740a1e8e599f430]# cat memory.limit_in_bytes 209715200 [root@docker d091004723d4de41824f6b38a7be9977369dad843740a1e8e599f430]# cat memory.memsw.limit_in_bytes 209715200 #### **S、限制****docker****的磁盘****io** [root@docker100 ~]# docker run -it --rm \ --device-write-bps \ #指定容器使用磁盘io的速率 /dev/nvme0n1:30M \ #/dev/nvme0n1是指定系统的磁盘,30M即每秒30M数据 ubuntu ![](https://i-blog.csdnimg.cn/direct/6c343bbe18974743bc5dcd0eb3b3fdf8.png) [root@docker100 ~]# docker run -it --rm --device-write-bps /dev/sda:30M ubuntu ![](https://i-blog.csdnimg.cn/direct/316fd5579eb44422aaf9430b2037717f.png)![](https://i-blog.csdnimg.cn/direct/984809b4e33b464c87c43d6dd3dd8d39.png) ### (3)、docker的安全加固 在系统中运行容器,我们会发现资源并没有完全隔离开 [root@docker ~]# free -m #系统内存使用情况 total used free shared buff/cache available Mem: 3627 1128 1714 207 1238 2498 Swap: 2062 0 2062 [root@docker ~]# docker run --rm --memory 200M -it ubuntu root@e06bdc13b764:/# free -m #容器中内存使用情况 total used free shared buff/cache available Mem: 3627 1211 1630 207 1239 2415 Swap: 2062 #虽然我们限制了容器的内容使用情况,但是查看到的信息依然是系统中内存的使用信息,并没有隔离开 解决docker的默认隔离性: 安装lxcfs、运行 lxcfs 并解决容器隔离性 #### T、Docker默认隔离性 ![](https://i-blog.csdnimg.cn/direct/188a8b20341642dcb303bee536b64450.png) ![](https://i-blog.csdnimg.cn/direct/ed38f9fe01d046ac9f4128aab8f1c38c.png) ![](https://i-blog.csdnimg.cn/direct/ef3dd966dd924bdda5957f72d424dbeb.png) ![](https://i-blog.csdnimg.cn/direct/ece77079af274d44af68c1a318dd6481.png) ![](https://i-blog.csdnimg.cn/direct/c9a95d7c08ce4e61ac12983853504b50.png) ### (4)、容器特权以及容器特权的白名单 在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定,比如网络 \[root@docker \~\] # docker run --rm -it busybox / # whoami root / # ip a 1 : lo: \ mtu 65536 qdisc noqueue qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 27 : eth0@if28: \ mtu 1500 qdisc noqueue link/ether 02 :42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172 .17.0.2/16 brd 172 .17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # ip a a 192.168.0.100/24 dev eth0 ip: RTNETLINK answers: Operation not permitted 这是因为容器使用的很多资源都是和系统真实主机公用的,如果允许容器修改这些重要资源,系统的稳定性会变的非常差, 但是由于某些需要求,容器需要控制一些默认控制不了的资源,如何解决此问题,这时我们就要设置容 器特权 #### U、docker的容器特权 ![](https://i-blog.csdnimg.cn/direct/26501c623ccd45719d29c2e22763cff6.png) ![](https://i-blog.csdnimg.cn/direct/eb0623bcd73e44bd84943cbf84d5a73a.png) ![](https://i-blog.csdnimg.cn/direct/d79514c080344551a99330b313bf6d96.png) ![](https://i-blog.csdnimg.cn/direct/e611874bbe33414eb560ec502654446d.png) #### V、容器特权的白名单 ![](https://i-blog.csdnimg.cn/direct/b5156c7ef02d48f8b24623fdb53cc7e0.png) ![](https://i-blog.csdnimg.cn/direct/3a13e66520384fab9463470e9c8c4729.png) ## 8、**容器编排工具****Docker Compose** ### (1)、概述 **主要功能** 定义服务: 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。一键启动和停止 **:** 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器应用的部署和管理过程。 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 dockercompose down 命令可以停止并删除这些服务。 服务编排: 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库服务必须在 Web 服务之前启动。 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的容器连接到这个网络上。 环境变量管理: 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、测试和生产环境)中使用不同的配置变得更加容易。 **工作原理** 读取配置文件 : Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。 创建容器 : 根据配置文件中的定义, Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。 管理容器生命周期 : Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。 它还可以处理容器的故障恢复,例如自动重启失败的容器。 **Docker Compose** **中的管理层** 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义 容器( container )容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义 的镜像创建的运行实例 ### (2)、常用命令参数 **服务管理** docker-compose up : 启动配置文件中定义的所有服务。 可以使用 -d 参数在后台启动服务。 可以使用 -f 来指定 yml 文件 docker-compose down : 停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。 docker-compose start : 启动已经存在的服务,但不会创建新的服务 docker-compose stop : 停止正在运行的服务 docker-compose restart : 重启服务。 **服务状态查看** docker-compose ps : 列出正在运行的服务以及它们的状态,包括容器 ID 、名称、端口映射等信息。 docker-compose logs : 查看服务的日志输出。可以指定服务名称来查看特定服务的日志。 **构建的重新构建服务** docker-compose build : 构建配置文件中定义的服务的镜像。可以指定服务名称来只构建特定的服务。 docker-compose up --build : 启动服务并在启动前重新构建镜像。 docker-compose exec : 在正在运行的服务容器中执行命令。 docker-compose pull : 拉取配置文件中定义的服务所使用的镜像。 docker-compose config : 验证并查看解析后的 Compose 文件内容 #### W、docker compose常用命令参数 ![](https://i-blog.csdnimg.cn/direct/5a71b823dfe2440e8f7443beb133e2bc.png) ![](https://i-blog.csdnimg.cn/direct/a434dccf616a4e20a9495a9cc9223ca4.png) [root@docker1 test]# docker compose ps 查看服务的日志输出。可以指定服务名称来查看特定服务的日志。 [root@docker1 test]# docker compose logs db [root@docker test]# docker compose -f test.yml build #构建 services中的所有 [root@docker test]# docker compose -f test.yml build test1 #构建 services中的test1 [root@docker test]# docker compose -f test.yml up -d #会去仓库拉去镜 像 [+] Running 1/1 ! test1 Warning pull access denied for test1, repository does not exist or may require 'docker login': denied: requested acces... [root@docker test]# docker compose -f test.yml up --build #会先构建镜像后 启动容器 ### (3)、docker compose的yml文件 服务名称(service1_name/service2_name 等): 每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。 services: web: # 服务1的配置 mysql: # 服务2的配置 镜像(image): 指定服务所使用的 Docker 镜像名称和标签。例如, image: nginx:latest 表示使用 nginx镜像的最新版本 services: web: images:nginx mysql: images:mysql:5.7 端口映射(ports): 将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。-"8080:80" 表示将主机的 8080 端口映射到容器内部的 80 端口。 services: web: image: timinglee/mario container_name: game #指定容器名称 restart: always #docekr容器自动启动 expose: - 1234 #指定容器暴露那些端口,些端口仅对链接的服务可见,不会映射到主机的端口 ports: - "80:8080" 环境变量(environment): 为容器设置环境变量,可以在容器内部的应用程序中使用。例如, VAR1: value1 设置环境变量 VAR1 的值为 value1 services: web: images:mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ll 环境变量(environment): 为容器设置环境变量,可以在容器内部的应用程序中使用。例如, VAR1: value1 设置环境变量 VAR1 的值为 value1 services: web: images:mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ll 存储卷(volumes): 将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如, - /host/data:/container/data 将主机上的 /host/data 目录挂载到容器内的 /container/data 路径。 services: test: image: busybox command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 volumes: - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置 网络(networks): 将服务连接到特定的网络,以便不同服务的容器可以相互通信 services: web: image: nginx container_name: webserver network_mode: bridge #使用本机自带bridge网络 services: test: image: busybox container_name: webserver command: ["/bin/sh","-c","sleep10000000"] #network_mode: mynet2 networks: - mynet1 - mynet2 networks: mynet1: driver: bridge mynet2: driver: bridge 命令(command): 覆盖容器启动时默认执行的命令。例如, command: python app.py 指定容器启动时运行 python app.py 命令 [root@docker test]# vim busybox.yml services: web: image: busybox container_name: busybox #network_mode: mynet2 command: ["/bin/sh","-c","sleep10000000"]

相关推荐
刘若水15 分钟前
Linux: 进程信号初识
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )33 分钟前
玛卡巴卡的k8s知识点问答题(六)
云原生·容器·kubernetes
rider18936 分钟前
【1】搭建k8s集群系列(二进制部署)之系统初始化
云原生·容器·kubernetes
阳小江1 小时前
Docker知识点
运维·docker·容器
极客柒2 小时前
RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
服务器·docker·开源
只是橘色仍温柔2 小时前
xshell可以ssh连接,但vscode不行
运维·vscode·ssh
IT里的交易员2 小时前
【系统】换硬盘不换系统,使用WIN PE Ghost镜像给电脑无损扩容换硬盘
运维·电脑
共享家95272 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )2 小时前
玛卡巴卡的k8s知识点问答题(七)
云原生·容器·kubernetes
大刘讲IT3 小时前
制造业数字化转型:流程改造先行还是系统固化数据?基于以MTO和MTS的投资回报分析
运维·经验分享·生活·产品经理·数据可视化