1、简介
(1)、特点及其优势
(2)、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的基本命令使用
-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)、基本原理
(2)、构建参数
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 仓库
(2)docker hub
F、docker hub
#登陆官方仓库
[root@docker ~]# docker login
[root@docker ~]# docker push ll/nginx.v3
(3)、docker仓库的工作原理
(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)、构建企业级私有仓库
I、harbor仓库的建立
[root@docker100 harbor]# vim harbor.yml
5、docker 网络
(1)、docker原生bridge网络
(2)、docker原生网络host
(3)、docker原生网络none
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容器
K、docker容器间的网络通信
[root@docker100 ~]# docker network connect mynet1 test1
(6)、容器内外网的访问
L、docker容器内外网的访问
内网
(7)、docker跨主机网络
CNM
M、docker跨主机网络
6、Docker 数据卷管理及优化
(1)、bind mount数据卷
N、docker数据卷
bind mount数据卷
(2)、docker managed 数据卷
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)
(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的使用
Q、docker中对容器资源限制的原理及对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
#虽然我们限制了容器的内容使用情况,但是查看到的信息依然是系统中内存的使用信息,并没有隔离开
T、Docker默认隔离性
(4)、容器特权以及容器特权的白名单
U、docker的容器特权
V、容器特权的白名单
8、容器编排工具Docker Compose
(1)、概述
主要功能
(2)、常用命令参数
服务管理
W、docker compose常用命令参数
[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"]