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 的一些关键特点和优势:
- 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、 Web 服务器等众多应用的镜像。 例如,您可以轻松找到 Ubuntu 、 CentOS 等操作系统的镜像,以及 MySQL 、 Redis 等数据库的镜像。
- 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。
- 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。
- 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。
- 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。
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 项目。
它提供了以下主要功能和特点:
- 基于角色的访问控制( RBAC ):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性。
- 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
- 图形化用户界面( UI ):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
- 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
- 垃圾回收:可以清理不再使用的镜像,节省存储空间。
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原生网站及自定义桥接







自定义网络




[root@docker100 ~]# docker run -it --name test1 --network mynet1 busybox
### (4)、docker容器间的网络通信

[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 高效快速通信。

#### K、docker容器间的网络通信

[root@docker100 ~]# docker network connect mynet1 test1













### (6)、容器内外网的访问

#### L、docker容器内外网的访问
内网

外网




### (7)、**docker****跨主机网络**
CNM

**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跨主机网络

## 6、**Docker****数据卷管理及优化**
### (1)、bind mount数据卷
是将主机上的目录或文件 mount 到容器里。使用直观高效,易于理解。
使用 -v 选项指定路径,格式 :-v 选项指定的路径,如果不存在,挂载时会自动创建
#### N、docker数据卷
bind mount数据卷

### (2)、**docker managed****数据卷**
bind mount 必须指定 host 文件系统路径,限制了移植性
docker managed volume 不需要指定 mount 源, docker 自动为容器创建数据卷目录
默认创建的数据卷目录都在 /var/lib/docker/volumes 中
如果挂载时指向容器内已有的目录,原有数据会被复制到 volume 中
#### O、docker数据卷------docker managed 数据卷



[root@docker100 volumes]# docker volume create mysqldate

备份数据卷
[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****数据卷的对****比**

## 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的安全优化
控制组资源控制的安全Docker服务端防护
### (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资源限制的方法




限制cpu的优先级
#关闭cpu的核心,当cpu都不空闲下才会出现争抢的情况,为了实验效果我们可以关闭一个cpu核心
[root@docker100 ~]# echo 0 > /sys/devices/system/cpu/cpu1/online
[root@docker100 ~]# cat /proc/cpuinfo
开启容器并限制资源

#### R、限制内存使用

#查看容器内存使用限制
[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

[root@docker100 ~]# docker run -it --rm --device-write-bps /dev/sda:30M ubuntu

### (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默认隔离性





### (4)、容器特权以及容器特权的白名单
在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定,比如网络
\[root@docker \~\] # docker run --rm -it busybox
/ # whoami
root
/ # ip a
1 : lo: \