一篇文章教你玩转Docker!
目录一、基础操作
二、构建镜像
1、参数示例及利用方法
2、Docker构建实例
3、镜像优化示例
三、docker镜像堆栈管理
1、docker hub
2、搭建私有堆栈
(1)、搭建简单无加密私有堆栈
(2)、搭建加密的私有堆栈
(3)、搭建用户认证的私有堆栈
3、构建企业级私有堆栈-harbor
四、docker的网络
1、dacker的原生网络
(1)、bridge
(2)、host
(3)、none
2、docker的自界说网络
3、不同的自界说网络之间的通信
(1)、容器用不同的网络栈
(2)、容器用雷同的网络战栈-joined网络
4、容器内外网的访问
(1)、容器访问外网
(2)、外网访问容器
5、容器的跨主机网络通信
五、docker的数据卷管理
1、bind mount数据卷
2、docker managed数据卷
编辑
3、数据卷容器
六、docker的安全优化
1、docker的资源限定
(1)、限定cpu的利用量
(2)、限定cpu的优先级
(3)、限定内存利用
(4)、限定docker的磁盘io
七、docker的安全加固
1、docker默认隔离性
2、解决默认隔离性问题
4、容器特权
5、容器白名单
八、容器编排工具Docker Compose
1、基础操作
2、构建和重新构建服务
3、其他操作
4、Docker Compose 的yml文件
(1)、服务
(2)、网络
(3)、存储卷
九、利用docker编排完成haproxy和nginx负载均衡架构
1、只下载haproxy,找出haproxy的设置文件,编辑设置文件
2、编辑docker compose容器编排文件
3、启动容器
4、检察是否启动
5、写入网页内容
6、测试
准备工作:
搭建当地网络源:
cd /etc/yum.repos.d/
vim docker-ce.repo
https://i-blog.csdnimg.cn/direct/e943fc5fc09644a0ae17843237ffff84.png
一、基础操作
#拉取镜像
# docker pull nginx:1.26-alpine
#查看本地镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ef79149e0ec 12 days ago 188MB
busybox latest 65ad0d468eb1 15 months ago 4.26MB
timinglee/game2048 latest 19299002fdbe 7 years ago 55.5MB
timinglee/mario latest 9a35a9e43e8c 8 years ago 198MB
#查看镜像(nginx)
# docker image inspect nginx
#保存镜像
# docker image save nginx:latest -o nginx-latest.tar.gz
# docker ps #查看当前运行容器
# docker ps -a #查看所有容器
# docker inspect busybox #查看容器运行的详细信息
# docker stop busybox #停止容器
# docker kill busybox #杀死容器,可以使用信号
# docker start busybox #开启停止的容器 # docker load -i game2048.tar.gz
# docker load -i mario.tar.gz
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
timinglee/game2048 latest 19299002fdbe 7 years ago 55.5MB
timinglee/mario latest 9a35a9e43e8c 8 years ago 198MB
# docker run -d --rm --name game1 -p 80:8080 timinglee/mario
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
475d1ada9324 timinglee/mario "python3 -m http.ser…" 2 minutes ago Up 2 minutes 0.0.0.0:80->8080/tcp, :::80->8080/tcp game1
# docker rm -f game1
game1
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
https://i-blog.csdnimg.cn/direct/3147e9c23ab44254ba8b0edb215c7542.png
二、构建镜像
1、参数示例及利用方法
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 功能和用法雷同,但动作不可被覆盖 # cd docker/
# touch dockerfile
# vim dockerfile
volume:
docker inspect test #查看挂载点、宿主机的目录 https://i-blog.csdnimg.cn/direct/a58e1a19a7c845d88e5c11c1bb8aa607.png
https://i-blog.csdnimg.cn/direct/e1eff82be137451fbbb399a703dbdd71.png
2、Docker构建实例
删除没有挂在成功的镜像:
# docker rmi `docker images | awk '/none/{print $2}'`
# docker rmi 04f578596280 931faa592f44
加载centos7镜像:
# docker load -i centos-7.tar.gz 编写构建文件:
https://i-blog.csdnimg.cn/direct/4fc339d8f0d24b25a557c15154cb4f39.png
开始构建:
root@decker-node1 docker]# docker build -t nginx:v1 .
构建时出现报错:yum时间出现问题->原因是centos镜像的问题
dnf install httpd -y
#配置文件的端口改为8888
systemctl restart httpd 新加cdroom:
https://i-blog.csdnimg.cn/direct/2546a988af9546bc8c0a4005f84fb589.png
挂载当地软件堆栈sr1:
https://i-blog.csdnimg.cn/direct/f8bc351d38b641a6b4c0ca87665ba902.png
开启centos7容器:
# docker run -it --name centos centos:7
设置该容器的当地软件堆栈:
https://i-blog.csdnimg.cn/direct/6ea11d41983c45bf843173a407c22e97.png
将设置好的容器提交镜像(centos的repo版本)
# docker commit -m "add repo" centos centos:repo
https://i-blog.csdnimg.cn/direct/a38270917d7743e5a18749f8701a6d2e.png 修改构建文件:
https://i-blog.csdnimg.cn/direct/953032afccb24a38a3eece232e59de75.png
继承构建nginx镜像:
# docker build -t busybox:v1 .
https://i-blog.csdnimg.cn/direct/99ed85c077e4483f9abaefdfe08cee29.png
可以看到nginx:vi版本有356MB,可以进行优化淘汰巨细。
3、镜像优化示例
缩减镜像层:
# vim dockerfile https://i-blog.csdnimg.cn/direct/e28bf495dca44d138ffaf20b5449008d.png
可以看出nginx:v1版本变小了(292MB):
https://i-blog.csdnimg.cn/direct/3e0ff5d6b0bd4289b07663312aa410ed.png
多阶段构建:
https://i-blog.csdnimg.cn/direct/56a92301eb3f4f1c9beb7728e09880ca.png
可以看出nginx:v2版本变小(210MB):
https://i-blog.csdnimg.cn/direct/1952a074cbde403ba1a565eed5026e94.png
利用最精简镜像
加载nginx1.23镜像和最小精简镜像:
# docker load -i nginx-1.23.tar.gz
# docker load -i debian11.tar.gz 编辑构建文件:
https://i-blog.csdnimg.cn/direct/263a1c0332d4464e954e3d8a21a47f10.png
可以看到nginx:v3版本只有34.5MB:
https://i-blog.csdnimg.cn/direct/90ec75fdc4ba41289e54e84f0ffe8658.png
三、docker镜像堆栈管理
1、docker hub
2、搭建私有堆栈
(1)、搭建简单无加密私有堆栈
下载镜像:
# docker load -i registry.tag.gz
开启容器:
# docker run -d -p 5000:5000 --restart=always registry
给要上传的镜像添加标签:
# docker tag nginx:v2 172.25.254.100:5000/nginx:v2
设置非加密端口:
daemon.json是 Docker 的设置文件,通常位于/etc/docker/目录下(不同系统可能有所不同)。
以下是一个示例的daemon.json文件内容及表明:
json
复制
{
"registry-mirrors": ["https://your-custom-mirror.com"],
"insecure-registries": ["your-insecure-registry:port"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
表明:
"registry-mirrors": 指定 Docker 镜像加速地址,可以进步拉取镜像的速度。
"insecure-registries": 指定不安全的私有镜像堆栈地址,如果你的私有堆栈没有利用 HTTPS,必要将其添加到这个列表中。
"max-concurrent-downloads": 设置同时下载的最大层数,可根据系统资源和网络情况调整。
"log-driver": 设置日志驱动,这里设置为json-file表示以 JSON 格式的文件记录日志。
"log-opts": 日志相关的选项,这里设置了单个日志文件最大为10m,最多保存3个日志文件。
你可以根据本身的需求对daemon.json进行设置。修改后,通常必要重启 Docker 服务使设置生效。
# vim /etc/docker/daemon.json
# systemctl restart docker https://i-blog.csdnimg.cn/direct/17a9864cebcb41668864b6d38c2a52d1.png
上传:
# docker push 172.25.254.100:5000/nginx:v2
https://i-blog.csdnimg.cn/direct/e7ac00569e714bb6b039c98a0bbaa6a3.png
检察镜像上传:
# curl 172.25.254.100:5000/v2/_catalog
https://i-blog.csdnimg.cn/direct/b670bdfb768940c59af8ebfabca9ad63.png
https://i-blog.csdnimg.cn/direct/35b89e3cc6b44b72b8e2b847522282ee.png
(2)、搭建加密的私有堆栈
天生认证证书和key
#删除配置文件的非加密配置
# vim /etc/docker/daemon.json
# systemctl restart docker
mk# mkdir certs
#添加解析
# vim /etc/hosts
172.25.254.100decker-node1 reg.gaoyingjie.org
#生成key和证书
# openssl req -newkey rsa:4096 \
> -nodes -sha256 -keyout certs/gaoyingjie.org.key \
> -addext "subjectAltName = DNS:reg.gaoyingjie.org" \
> -x509 -days 365 -out certs/gaoyingjie.org.crt https://i-blog.csdnimg.cn/direct/3422a6cb9f9a49268f27d380f78812e4.png
让docker读取证书:
# mkdir /etc/docker/certs.d/reg.gaoyingjie.org/ -p
# cp /root/certs/gaoyingjie.org.crt /etc/docker/certs.d/reg.gaoyingjie.org/ca.crt
# systemctl restart docker 开启registry容器:
# docker run -d -p 443:443 --restart=always --name registry \
> --name registry -v /opt/registry:/var/lib/registry \
> -v /root/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/gaoyingjie.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/gaoyingjie.org.key registry:latest
#-v: 挂载目录,容器下有该目录
添加tag标签:
# docker tag busybox:latest reg.gaoyingjie.org/busybox:latest https://i-blog.csdnimg.cn/direct/6153a169c275401e8619ef61fa7771e0.png
上传:
# docker push reg.gaoyingjie.org/busybox:latest
检察上传的镜像:
# curl -k https://reg.gaoyingjie.org/v2/_catalog
https://i-blog.csdnimg.cn/direct/d7a5a4633bd248768ed0a3094dd1d348.png
(3)、搭建用户认证的私有堆栈
表明:必要用户输入密码才气的上传到搭建的私有堆栈。
创建认证文件(利用md5加密):
# mkdir auth
# htpasswd -Bc auth/htpasswd gaoyingjie #-B:最强加密方式
New password:
Re-type new password:
Adding password for user gaoyingjie
开启容器,添加认证到registry容器中:# docker run -d -p 443:443 --restart=always --name registry --name registry -v /opt/registry:/var/lib/registry -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/gaoyingjie.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/gaoyingjie.org.key -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd"-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry 登录私有堆栈:
# docker login reg.gaoyingjie.org
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
上传镜像:
# docker push reg.gaoyingjie.org/busybox:latest
检察上传的镜像:
curl -k https://172.25.254.100/v2/ catalog -ugaoyingjie:gaoyingjie 若未登录私有堆栈:则表现上传失败。
3、构建企业级私有堆栈-harbor
在第2步的基础上摆设harbor
# tar zxf harbor-offline-installer-v2.5.4.tgz
# ls
anaconda-ks.cfg certs harbor-offline-installer-v2.5.4.tgz
auth harbor
# cd harbor/
# cp harbor.yml.tmpl harbor.yml
# vim harbor.yml https://i-blog.csdnimg.cn/direct/96e650731632412e8da2f89fa7118b38.png
天生证书和key:
# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/gaoyingjie.org.key -addext "subjectAltName = DNS:reg.gaoyingjie.org" -x509 -days 365 -out certs/gaoyingjie.org.crt
将证书和key放入设置文件里指定目录:
# mkdir /data
# cp -r /root/certs/ /data/
# ls /data/
certs
#让docker读取证书
# cp /root/certs/gaoyingjie.org.crt /etc/docker/certs.d/reg.gaoyingjie.org/ca.crt 安装harbor:
# ./install.sh--with-chartmuseum https://i-blog.csdnimg.cn/direct/ebeee6c7fa854b53bc735220a652de71.png
启动harbor:
# docker compose stop
# docker compose up -d
当地解析:
https://i-blog.csdnimg.cn/direct/6d8fc03c816546d3876d2eda6161cbfc.png
登录harbor:浏览器输入reg.gaoyingjie.org(堆栈名,也就是hostname)
https://i-blog.csdnimg.cn/direct/ca2ebf2292594c8a8c0c82f496fc99b4.png
https://i-blog.csdnimg.cn/direct/a6b83a56c04b4f3b9d59f9c6f604566c.png
新建项目:
https://i-blog.csdnimg.cn/direct/87fb92cd527e4544bdb3718d0524f446.png
上传镜像到堆栈新建项目newtest:
#登录harbor私有仓库
#先将之前的退出,如果没登陆过则不用
# docker logout reg.gaoyingjie.org
Removing login credentials for reg.gaoyingjie.org
#登录
# docker login reg.gaoyingjie.org
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
添加标签:
# docker tag nginx:v3 reg.gaoyingjie.org/newtest/nginx:v3
上传镜像:
# docker push reg.gaoyingjie.org/newtest/nginx:v3 可以看到已上传nginx
https://i-blog.csdnimg.cn/direct/57b978f743784786961b178af44faa22.png
小tip:
#一键加载镜像
#所有的镜像文件在/root/images下
# for i in `ls /root/images`; do docker load -i $i; done
#一键清除所有容器(慎重)
# docker container prune -f
#一键添加标签
# docker images | awk 'NR>1{system("docker tag "$1":"$2" reg.gaoyingjie.org/library/"$1":"$2)}'
#一键push
# docker images | awk '/reg.gaoyingjie.org/{system("docker push "$1":"$2)}'
#一键删除某些镜像
# docker images | awk '/reg.timinglee.org/{system("docker rmi "$1":"$2)}'四、docker的网络
修改防火墙策略
# grubby --update-kernel ALL --args iptables=true
# reboot
https://i-blog.csdnimg.cn/direct/048fa3012f5d41c8bb41ecf7631f4a3a.png
1、dacker的原生网络
(1)、bridge
https://i-blog.csdnimg.cn/direct/4e2697f2e4514f66a6d3385ffec7cda8.png
(2)、host
https://i-blog.csdnimg.cn/direct/bb66951f526044c38476f93fb37a7f3d.png
(3)、none
https://i-blog.csdnimg.cn/direct/ebedc32de28a4a4f9d15b8509cb6e142.png
2、docker的自界说网络
自界说桥接:原生的桥接模式是没有dns模块,所以要用自界说桥接,可以用容器名称通信。
容器的开启序次不同会导致ip不同,会导致容器之间通讯出现问题。
# docker network create mynet1 -d bridge
7e2fe742ddd7221d316d60276be1078e28f09ae1b2b6ca1ec79f8df5ca31ceda
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ad53e07c3e80 bridge bridge local
12e886188af6 host host local
7e2fe742ddd7 mynet1 bridge local
cf8dda13f1cb none null local
# docker run -it--name test1 --network mynet1 busybox
# docker run -it--name test2 --network mynet1 busybox
#删除网络
# docker network rm mynet1
mynet1
# docker network ls
NETWORK ID NAME DRIVER SCOPE
ad53e07c3e80 bridge bridge local
12e886188af6 host host local
cf8dda13f1cb none null local
https://i-blog.csdnimg.cn/direct/76acdb04cff84b2096a6800b4c217487.png
可以看出,两个容器test1和test2处于同一网络,之间可以用ip通信,也可以用容器名通信。而传统的桥接模式是不能用容器名称通信的。
3、不同的自界说网络之间的通信
有两种情况:用雷同网络栈和不同网络栈
(1)、容器用不同的网络栈
#创建两个自定义桥接网络
# docker network create mynet1 -d bridge
2a79172a5fe1a4b433c3daf4bdefaabf89b0a656aa5e7a07c007ae6a05a7b078
# docker network create mynet2 -d bridge
a79928a1c7ec8d4037863138b02a5fb967254ee3a560388572b0b16fd6ae0745
https://i-blog.csdnimg.cn/direct/219430011a0f4d118a9746c4d47f97da.png
https://i-blog.csdnimg.cn/direct/222787d1ce2c464992c2368bfb454f58.png
可以看到不同自界说网络是是不能通信的。
将一个容器参加网卡接入另一个网络中:
#将test2接入mynet1网络中
#所以test2容器有172.28.0.2(mynet1)和172.19.0.2(mynet2)两个ip
# docker network connect mynet1 test2
https://i-blog.csdnimg.cn/direct/bd2a9da03dbf431ba3a3c1b4a0ed64d8.png
(2)、容器用雷同的网络战栈-joined网络
示例1:
# docker run -d --name test1 --network mynet1 nginx
8d1ad6dd316d38816f509a8db9ab1c057d766e8c92b437b98b4c72578eb4700c
#用mynet2的网络栈
# docker run -d --name test2 --network container:test1 centos:7
7ae5ac441717042123b0ddf964a1918725dfc2070709200772d46a900c79b343 镜像centos是没有web服务的,但是test1和test2用了同个网络栈,所以test2有wab服务:
https://i-blog.csdnimg.cn/direct/9199e3b0d4fe4ebe80b48685afe7a5a3.png
示例2:
phpmyadmin和mysql两个容器共用一个网络栈,phpmyadmin通过回环接口就能管理mysql,更安全。
# docker load -i mysql-5.7.tar.gz
# docker load -i phpmyadmin-latest.tar.gz
#docker network create mynet1 -d bridge
#开启phpmyadmin容器
# docker run -d --name mysqladmin --network mynet1 \
> -e PMA_ARBITRARY=1 \
> -p 80:80 phpmyadmin:latest
#开启mysql容器
# docker run -d --name mysql \
> -e MYSQL_ROOT_PASSWORD='gyj' \
> --network container:mysqladmin \
> mysql:5.7
登录:浏览器输入172.25.254.100
https://i-blog.csdnimg.cn/direct/0e96c0df9aa44370b7c2bcf2e4e0a6c3.png
https://i-blog.csdnimg.cn/direct/9f9762dcb4ce4578b3df997c7869f080.png
在mysql容器内实行命令:
# docker exec -it mysql bash
bash-4.2# https://i-blog.csdnimg.cn/direct/3128964d12ff4cae9d28d9bbd61de095.png
也可以用phpmyadmin管理数据库。
4、容器内外网的访问
(1)、容器访问外网
https://i-blog.csdnimg.cn/direct/2d6b3abffd284f37802f7c7eea3f6112.png
(2)、外网访问容器
https://i-blog.csdnimg.cn/direct/962886a9864e400ea6e289a7a48b1d27.png
5、容器的跨主机网络通信
macvlan
在两台docker主机上各添加一块网卡,打开网卡混杂模式: # ip link set eth1 promisc on
# ip link set up eth1https://i-blog.csdnimg.cn/direct/62885707ade54a7abe43ff7ec2fd8ef8.png
两主机添加macvlan网络:
# docker network create -d macvlan --subnet 1.1.1.0/24 --gateway 1.1.1.1 -o parent=eth1 macvlan1 开启容器:
# docker run -it --name test1 --network macvlan1 --ip 1.1.1.100 --rm busybox
# docker run -it --name test2 --network macvlan1 --ip 1.1.1.200 --rm busybox
测试:开处于不同主机的两个容器是否可以通信
https://i-blog.csdnimg.cn/direct/233bf8aae1b643f4a8eff91f7a92bec7.png
五、docker的数据卷管理
1、bind mount数据卷
[*]是将主机上的目录或文件mount到容器里。
[*]利用直观高效,易于明白。
[*]利用 -v 选项指定路径。
# docker run -it --rm -v /test1:/data1:rw -v /etc/passwd:/data2/passwd:ro busybox
[*]https://i-blog.csdnimg.cn/direct/4dafe4a7296f4c478ab7ef54ec1d3aca.png
2、docker managed数据卷
[*]bind mount必须指定host文件系统路径,限定了移植性
[*]docker managed volume 不必要指定mount源,docker自动为容器创建数据卷目录
[*]默认创建的数据卷目录都在 /var/lib/docker/volumes 中
[*]如果挂载时指向容器内已有的目录,原有数据会被复制到volume中
# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD='gyj' mysql:5.7#cd /var/lib/docker/volumes/09c6f145e4449d1cbdfd5118fdd869adb32573a4195c18dc22a6ac93f3c7596b/_data/# touch newfile#进入容器检察是否有newfile# docker exec -it mysql bash
bash-4.2# cd /var/lib/mysqlbash-4.2# ls https://i-blog.csdnimg.cn/direct/ad478dba40c94854b5ee30ab57183162.png
可以看到没有指定数据卷目录,默认在挂载到host的/var/lib/docker/volume/容器id/_data中,在此目录下新建文件,可以在容器内部的/var/lib/容器名/中看到新文件。
3、数据卷容器
数据卷容器( Data Volume Container )是 Docker 中一种特殊的容器,重要用于方便地在多个容器之间 共享数据卷。 #建立数据卷容器
# docker run -d --name datavol \
-v /tmp/data1:/data1:rw \
-v /tmp/data2:/data2:ro \
-v /etc/resolv.conf:/etc/hosts busybox
#使用数据卷容器
# docker run -it --name test --rm --volumes-from datavol busybox 六、docker的安全优化
# docker run -d --name web nginx
516df6628241e9b4f3e802cbef696163ce681070d739b8ae716efe74708466c7
# docker inspect web | grep Pid
"Pid": 1898,
"PidMode": "",
"PidsLimit": null,
# cd /proc/
# cd 1898
# cd ns
# ls
cgroupipcmntnetpidpid_for_childrentimetime_for_childrenuseruts
# cd /sys/fs/cgroup/
# ls
blkio cpu,cpuacctfreezermisc net_prio rdma
cpu cpuset hugetlbnet_cls perf_eventsystemd
cpuacctdevices memory net_cls,net_priopids
# cd memory/
# cd docker/
# ls
516df6628241e9b4f3e802cbef696163ce681070d739b8ae716efe74708466c7
cgroup.clone_children
cgroup.event_control
***
# cd 516df6628241e9b4f3e802cbef696163ce681070d739b8ae716efe74708466c7/
# ls
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.numa_stat
memory.kmem.limit_in_bytes memory.oom_control
memory.kmem.max_usage_in_bytes memory.pressure_level
memory.kmem.slabinfo memory.soft_limit_in_bytes
memory.kmem.tcp.failcnt memory.stat
memory.kmem.tcp.limit_in_bytes memory.swappiness
memory.kmem.tcp.max_usage_in_bytesmemory.usage_in_bytes
memory.kmem.tcp.usage_in_bytes memory.use_hierarchy
memory.kmem.usage_in_bytes notify_on_release
memory.limit_in_bytes tasks
memory.max_usage_in_bytes
1、docker的资源限定
(1)、限定cpu的利用量
# docker run -it --rm --name test1 --cpu-period 100000 --cpu-quota 20000 ubuntu
root@3c63c90f85ef:/# dd if=/dev/zero of=/dev/null &
9
root@3c63c90f85ef:/# top
# docker run -it --rm --name test2 --cpu-period 100000 --cpu-quota 30000 ubuntu
root@9ba159f17589:/# dd if=/dev/zero of=/dev/null &
9
root@9ba159f17589:/# top
https://i-blog.csdnimg.cn/direct/de63a1ade68945d481b9de35b2620f10.png
(2)、限定cpu的优先级
# docker run -it --rm --name test1 --cpu-shares 100ubuntu
root@0d33e9d6b5a3:/# dd if=/dev/zero of=/dev/null &
8
root@0d33e9d6b5a3:/# top
# docker run -it --rm --name test2ubuntu
dd if=/dev/zero of=/dev/null &root@c30ea1c45318:/# dd if=/dev/zero of=/dev/null &
9
root@c30ea1c45318:/# top
https://i-blog.csdnimg.cn/direct/2e13b55753f34d178c18d38b49de999d.png
(3)、限定内存利用
上传工具:
libcgroup-0.41-19.el8.x86_64.rpm
libcgroup-tools-0.41-19.el8.x86_64.rpm
# dnf install *.rpm -y 开启容器并限定内存:
# docker run -d --rm --name test1 --memory 200M --memory-swap 200M nginx
9dec367f92ee6874fb5a6e543d369b1f0aa81f2ae8dff875ae30e1f710a04616
# cd /sys/fs/cgroup/
# cgexec -g memory:docker/9dec367f92ee6874fb5a6e543d369b1f0aa81f2ae8dff875ae30e1f710a04616 dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=150
https://i-blog.csdnimg.cn/direct/2517ea0e82944a749a70f159ac586637.png
检察该容器id下的内存资源限定文件,可以看到200m的字节为 209715200,也可通过echo写入文件将内存限定从200mb改为300mb:
#cd /sys/fs/cgroup/memory/docker/9dec367f92ee6874fb5a6e543d369b1f0aa81f2ae8dff875ae30e1f710a04616/
#
cat memory.memsw.limit_in_bytes
209715200
# echo 314572800 > memory.memsw.limit_in_bytes
# cgexec -g memory:docker/9dec367f92ee6874fb5a6e543d369b1f0aa81f2ae8dff875ae30e1f710a04616 dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=300 https://i-blog.csdnimg.cn/direct/67ecf184d6f7471bb59ed880064e8dff.png
(4)、限定docker的磁盘io
# docker run -it --rm --device-write-bps /dev/nvme0n1:30M ubuntu
root@452768b7f1e0:/# dd if=/dev/zero of=bigfile
root@452768b7f1e0:/#dd if=/dev/zero of=bigfile bs=1M count=100
root@452768b7f1e0:/# dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct https://i-blog.csdnimg.cn/direct/badfae272ee841cea2465b8b007f4593.png
七、docker的安全加固
1、docker默认隔离性
https://i-blog.csdnimg.cn/direct/204aee0d0f5a49c08f9a7e24ca01b42c.png
可以看到虽然限定了容器200m的内存,但是内存资源并没有完全隔离。
2、解决默认隔离性问题
LXCFS 是一个为 LXC ( Linux Containers )容器提供加强文件系统功能的工具。 LXCFS 可以使容器内的进程看到正确的 CPU 、内存和磁盘 I/O 等资源利用信息。在没有 LXCFS 时,容器内看到的资源信息可能不正确,这会影响到在容器内运行的应用步伐对资源的评估和管理。 安装lxcfs
# cd /mnt/
# ls
hgfs lxc-libs-4.0.12-1.el9.x86_64.rpm
lxcfs-5.0.4-1.el9.x86_64.rpmlxc-templates-4.0.12-1.el9.x86_64.rpm
# dnf install *.rpm
运行lxcfs解决隔离性问题:
# lxcfs /var/lib/lxcfs &
开启容器并指定内存:
docker run-it --name test -m 256m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw -v /var/lib/lxcfs/proc/stat:/proc/stat:rw -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw ubuntu https://i-blog.csdnimg.cn/direct/b0af2c1e9c5b4ba8bf802258d3d3d323.png
可以看到指定的内存为256m,容器表现的内存就为256m。
4、容器特权
https://i-blog.csdnimg.cn/direct/5b5333c073bc4f8cabce2abbcf92107e.png
5、容器白名单
https://i-blog.csdnimg.cn/direct/ad0d67f126da4cfca5b03148a0f8b84b.png
八、容器编排工具Docker Compose
编辑vim设置文件:
vim ~/.vimrchttps://i-blog.csdnimg.cn/direct/8adb7dd3dba849f486c19432bcdd1b7d.png
1、基础操作
# mkdir test
# cd test/
#编辑yml文件
# vim docker-compose.yml
#启动服务
# docker compose up -d
[+] Running 3/3
✔ Network test_default Created 0.2s
✔ Container test-web-1 Started 1.6s
✔ Container test-test-1Started 1.5s
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b571c4c09aa nginx:latest "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 80/tcp test-web-1
https://i-blog.csdnimg.cn/direct/fbfcd581ac1743b18745e504887371c1.png
# cp docker-compose.yml new-compose.yml
# rm -rf docker-compose.yml
# vim new-compose.yml
#可以使用-f 来指定yml文件
# docker compose -f new-compose.yml up -d
[+] Running 2/2
✔ Container test-test-1Started 1.1s
✔ Container test-web-1 Started
#停止正在运行的服务
# docker compose stop
[+] Stopping 2/2
✔ Container test-web-1 Stopped 0.1s
✔ Container test-test-1Stopped 0.0s
#重启服务
# docker compose restart
#停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
# docker compose down
#查看状态
# docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
test-web-1 nginx:latest "/docker-entrypoint.…" web About a minute ago Up 11 seconds 80/tcp
2、构建和重新构建服务
编辑构建docker的文件:
# vim Dockerfile
# vim new.Dockerfile
https://i-blog.csdnimg.cn/direct/66127b3471c8417aa74766192e866913.png
https://i-blog.csdnimg.cn/direct/ad08baae8cb24c039056a09bdfdabb43.png
写重新构建的文件:在之前test1、test2的基础上重新构建
# vim docker-compose.yml https://i-blog.csdnimg.cn/direct/626551ae233440ddaabe091f9cc47fd8.png
构建生效:
#build
# docker compose -f docker-compose.ymlbuild#构建
services中所有
# docker compose -f test.yml build test1 #构建
services中的test1 可以看到构建的新镜像:test1、test2
https://i-blog.csdnimg.cn/direct/065556d0c2ac4068982fd710eb973d38.png
开启容器:可以看到旧的test1、test2构建时创建的文件
https://i-blog.csdnimg.cn/direct/156db360f5064cc9ac3c166b3b07e984.png
以上是构建好镜像后手动开启容器。
自动开启容器:
# --build
# docker compose -f docker-compose.yml up -d #会去仓库拉去镜
像
# docker compose -f docker-compose.yml up --build #会先构建镜像后
启动容器 可以看到自动开启容器:
https://i-blog.csdnimg.cn/direct/e49b736d7fe845df920c9ce1f4e4ce90.png
3、其他操作
[*]docker-compose exec :
# vim docker-compose.yml
# vim docker-compose.yml
# docker compose -f docker-compose.yml up -d
#在正在运行的服务容器中执行命令
# docker compose -f docker-compose.ymlexec test1 sh
/ # touch newfile
/ # ls
bin etc lib newfileroot tmp var
dev home lib64 proc sys usr
/ # https://i-blog.csdnimg.cn/direct/7f3d08e0d11c4320bccfdbc3a8d9a091.png
[*] docker-compose pull :
拉取设置文件中界说的服务所利用的镜像。# docker compose -f docker-compose.yml pull
[+] Pulling 2/2
✔ test Pulled
✔ ec562eabd705 Pull complete
[*]docker-compose config :
验证并检察解析后的 Compose 文件内容 # docker compose config
name: test
services:
test1:
command:
- /bin/sh
- -c
- sleep 3000
container_name: busybox1
image: busybox:latest
networks:
default: null
restart: always
networks:
default:
name: test_default
4、Docker Compose 的yml文件
(1)、服务
#服务名称(service1_name/service2_name 等):每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。
services:
web:
# 服务1的配置
mysql:
# 服务2的配置 #镜像(image):
#指定服务所使用的 Docker 镜像名称和标签。例如, image: nginx:latest 表示使用 nginx镜像的最新版本
services:
web:
images:nginx
mysql:
images:mysql:5.7 #将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如, -"8080:80" 表示将主机的 8080 端口映射到容器内部的 80 端口。
services:
web:
image: nginx:latest
container_name: nginx1 #指定容器名称
restart: always #docekr容器自动启动
expose:
- 1234 #指定容器暴露那些端口,些端口仅对链接的服务可见,不会映射到主机的端口
ports:
- "80:8080" #环境变量(environment):为容器设置环境变量,可以在容器内部的应用程序中使用。例如, VAR1: value1 设置环境变量 VAR1 的值为 value1
services:
web:
image: mysql:5.7
container_name: mysql1
restart: always
environment:
MYSQL_ROOT_PASSWORD: gyj
#存储卷(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","sleep 10000"]
#network_mode: mynet2
networks:
- mynet1
- mynet2
networks:
mynet1:
driver: bridge
mynet2:
driver: bridge #命令(command):覆盖容器启动时默认执行的命令。例如, command: python app.py 指定容器启动时运行
python app.py 命令
# vim busybox.yml
services:
web:
image: busybox
container_name: busybox
#network_mode: mynet2
command: ["/bin/sh","-c","sleep10000000"] (2)、网络
[*]界说 Docker Compose 应用步伐中利用的网络。可以自界说网络名称和驱动步伐等属性。
[*]默认情况下docker compose 在实行时会自动创建网路
services:
test:
image: busybox1
command: ["/bin/sh","-c","sleep 3000"]
restart: always
network_mode: default
container_name: busybox
test1:
image: busybox2
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:
- mynet1
test3:
image: busybox3
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
networks:
- mynet1
networks:
mynet1:
driver: bridge #使用桥接驱动,也可以使用macvlan用于跨主机连接
default:
external: true #不建立新的网络而使用外部资源
name: bridge #指定外部资源网络名字
mynet2:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.254 (3)、存储卷
services:
test:
image: busybox
command: ["/bin/sh","-c","sleep 3000"]
restart: always
container_name: busybox1
volumes:
- data:/test #挂在data卷
- /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置
volumes:
data:
name: timinglee #指定建立卷的名字 九、利用docker编排完成haproxy和nginx负载均衡架构
1、只下载haproxy,找出haproxy的设置文件,编辑设置文件
#只下载不安装haproxy
# dnf install haproxy -y --downloadonly --downloaddir=/mnt
#解压文件并输出为目录,-id:i是输出,d是目录
# rpm2cpio haproxy-2.4.22-1.el9.x86_64.rpm | cpio -id
https://i-blog.csdnimg.cn/direct/63690ba0e36f45448f79051f373fccf6.png
https://i-blog.csdnimg.cn/direct/1ca50d0c8f2c466f8909512bfac5c843.png
2、编辑docker compose容器编排文件
# vim haproxy.yml https://i-blog.csdnimg.cn/direct/12dc453436314063ab6a48ecebb5dda0.png
https://i-blog.csdnimg.cn/direct/f169394ee134457b9c38d37c9294ce15.png
3、启动容器
# docker compose -f /root/haproxy.yml up -d https://i-blog.csdnimg.cn/direct/f1b470ef84de45fcadf494d4efd8b51b.png
4、检察是否启动
https://i-blog.csdnimg.cn/direct/40fa49da9e004e27bada28f1cb9a7adf.png
5、写入网页内容
从设置文件可以看到,在主机的/var/lib/docker/volumes/data_web目录下,有data_web1和data_web2,这两个文件挂载的是nginx容器的网站首发内容页,所以在data_web1、data_web2这两个目录下写入网站首页内容。
https://i-blog.csdnimg.cn/direct/bc4fd9e35bd04359a9e148fb9ceb6afe.png
6、测试
haproxy用的是轮询调治算法
https://i-blog.csdnimg.cn/direct/5dd8df38eb8f4747870dbe05bbcfc507.png
删除镜像、加速器、volume
ldd /usr/local/nginx/sbin/nginx nginx运行时必须调用的模块
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]