实验部分
1、docker的部署过程
配置软件仓库
[root@docker-node1 etc]# cd /etc/yum.repos.d/
[root@docker-node1 yum.repos.d]# ls redhat.repo rhel9.repo
[root@docker-node1 yum.repos.d]# vim docker.repo
[root@docker-node1 yum.repos.d]# cd
[root@docker-node1 ~]# yum install docker-ce -y
安装docker-ce并启动服务
[root@docker-node1 ~]# vim /usr/lib/systemd/system/docker.service
[root@docker-node1 ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker-node1 ~]# docker info
启动容器
[root@docker-node1 ~]# docker run -d --name test --rm -p 80:8080 timinglee/mari o:latest 1b4e3a695d37c76a4e1bdcb9a341971f0c893350e2b46b4861605f02b55a72f5
2、Docker的基本操作
查看镜像
[root@docker-node1 ~]# docker image inspect nginx:1.23
导出镜像
#保存镜像
[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 -o nginx.tag.gz
#保存所有镜像
[root@Docker-node1 ~]# docker save docker images | awk 'NR>1{print $1":"$2}'
- o images.tar.gz
[root@Docker-node1 ~]# docker ps #查看当前运行容器
[root@Docker-node1 ~]# docker ps -a #查看所有容器
[root@Docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息
[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 dbbfile exam:/dbbfile
Successfully copied 1.54kB to exam:/dbbfile
查看日志
3、构建参数使用
[root@docker-node1 ~]# mkdir docker/
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# touch leefile
[root@docker-node1 docker]# vim Dockerfile
[root@docker-node1 docker]# touch leefile{1..3}
[root@docker-node1 docker]# tar zcf leefile.gz leefile
[root@docker-node1 docker]# vim Dockerfile
4、docker镜像构建
配置centos7环境
[root@docker-node1 docker]# dnf install httpd -y
[root@docker-node1 docker]# vim /etc/httpd/conf/httpd.conf
[root@docker-node1 docker]# systemctl start httpd
[root@docker-node1 docker]# mkdir /var/www/html/rhel7.9
[root@docker-node1 docker]# mount /dev/sr1 /var/www/html/rhel7.9/
mount: /var/www/html/rhel7.9: WARNING: source write-protected, mounted read-only.
[root@docker-node1 ~]# docker inspect centos
[root@docker-node1 ~]# docker commit -m "add repo" centos centos:repo sha256:d3405633300686ecee84f9ff8e373f30655fde27fd7d18e2fb7b9fcb979302c1
[root@1a93258b3d66 ~]# exit
exit
[root@docker-node1 docker]# docker rm centos centos
建立构建目录,编写构建文件
[root@docker-node1 docker]# vim Dockerfile
通过dockerfile生成镜像
测试镜像可用性
[root@docker-node1 docker]# docker run -d --name checkimage nginx 808059cabaf8fe85190327e6d47aaab1154a8e1167a90106d196a1857940ec26
5、镜像优化
方法1.缩减镜像层
[root@docker-node1 docker]# vim Dockerfile
方法2.多阶段构建
[root@docker-node1 docker]# vim Dockerfile
方法3.使用最精简镜像
[root@docker-node1 docker]# vim Dockerfile
6、docker简单私有仓库的搭建
[root@docker-node1 ~]# docker run -d -p 5000:5000 --restart=always registry 402feafcb10ecef67534fc3bc6c35a1825031ad1fa3c4fe18a186869107b6878
[root@docker-node1 ~]# docker tag nginx:v4 172.25.254.10:5000/nginx:v4
[root@docker-node1 ~]# vim /etc/docker/daemon.json
[root@docker-node1 ~]# systemctl start docker
[root@docker-node1 ~]# docker inspect ecstatic_lamport
7、docker仓库数据传输加密
#生成认证key和证书
[root@docker-node1 ~]# vim /etc/docker/daemon.json 删除
[root@docker-node1 ~]# systemctl restart docker
[root@docker-node1 ~]# mkdir certs
[root@docker-node1 ~]# vim /etc/hosts
[root@docker-node1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/timinglee.org.key -addext "subjectAltName = DNS:reg.timinglee.org" -x509 -days 365 -out certs/timinglee.org.crt
启动registry仓库
[root@docker-node1 ~]# mkdir -p /etc/docker/certs.d/reg.timinglee.org -p
[root@docker-node1 certs]# cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker-node1 ~]# ls /etc/docker/certs.d/reg.timinglee.org/ca.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker-node1 ~]# curl -k https://reg.timinglee.org/v2/_catalog {"repositories":["nginx"]}
8、docker仓库用户认证
[root@docker-node1 ~]# yum install httpd-tools -y
[root@docker-node1 ~]# mkdir auth
[root@docker-node1 ~]# htpasswd -Bc auth/.htpasswd lee
New password:
Re-type new password:
Adding password for user lee
[root@docker-node1 ~]# cat auth/.htpasswd lee:$2y$05$hKXaGAu6XKmGmnJg080JM.6MBSTd4N8dWsRb6BYzvHmYBdI1rxR2G [root@docker-node1 ~]# htpasswd -B auth/.htpasswd hyl
New password:
Re-type new password:
Adding password for user hyl
[root@docker-node1 ~]# cat auth/.htpasswd lee:$2y$05$hKXaGAu6XKmGmnJg080JM.6MBSTd4N8dWsRb6BYzvHmYBdI1rxR2G hyl:$2y$05$JZ33JbqB.AubdM26dpNjIuBd/7TXjuvFHCwuKbiB4WADDuUWS.
[root@docker-node1 ~]# docker run -d -p 443:443 --restart=always -v /root/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/timinglee.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/timinglee.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 02085041efd1de26bd3916f012662275b20ce8191c8326b65fa25ac2cc20ba71
[root@docker-node1 ~]# curl -k https://reg.timinglee.org/v2/_catalog -u hyl:hyl {"repositories":["nginx"]}
9、docker-harbor仓库的搭建
[root@docker harbor]# vim harbor.yml
[root@docker-node1 harbor]# ll /data/
总用量 0 drwxr-xr-x 3 root root 18 9月 22 17:56 secret
[root@docker-node1 harbor]# cp /root/certs/ /data/ -r
[root@docker-node1 harbor]# ls /data/
certs secret
[root@docker-node1 harbor]# ls
common config
[root@docker-node1 harbor]# ls /data/certs/
timinglee.org.crt timinglee.org.key
[root@docker-node1 harbor]# ./install.sh --with-chartmuseum
#管理harbor的容器
本地解析
C:\Windows\System32\drivers\etc\hosts
测试
#未登录上传失败
登录
[root@docker-node1 harbor]# docker logout reg.timinglee.org
Removing login credentials for reg.timinglee.org
[root@docker-node1 harbor]# docker login reg.timinglee.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
#私有仓库作为默认下载仓库
[root@docker-node1 reg.timinglee.org]# cp /data/certs/timinglee.org.crt ^C
[root@docker-node1 reg.timinglee.org]# cd ..
[root@docker-node1 certs.d]# ls reg.timinglee.org
[root@docker-node1 certs.d]# cd ..
[root@docker-node1 docker]# ls certs.d daemon.json
[root@docker-node1 docker]# vim daemon.json
[root@docker-node1 docker]# systemctl restart docker
[root@docker-node1 docker]# docker info
[root@docker-node1 harbor]# docker pull timinglee/nginx:v4
v4: Pulling from timinglee/nginx Digest:
sha256:e7b51e47f6e4e415ef6f1ea2435aaa6302173858e4e46dc663e4b929608bdeb8
Status: Downloaded newer image for timinglee/nginx:v4
docker.io/timinglee/nginx:v4
#若出现问题
[root@docker-node1 docker]# docker pull timinglee/nginx:v4
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded ( Client.Timeout exceeded while awaiting headers)
10、docker的webUI工具
#访问
[root@docker-node1 1panel-v1.10.13-lts-linux-amd64]# 1pctl user-info
面板地址: http://$LOCAL_IP:4444/c2c56e339d
面板用户: 23e19dd318 面板密码: !@#$%*_,
提示:修改密码可执行命令:1pctl update password
11.docker原生网络及自定义桥接网络
docker原生bridge网路
[root@docker-node1 ~]# grubby --update-kernel ALL --args iptables=true
[root@docker-node1 ~]# reboot
[root@docker-node1 ~]# cd 1panel-v1.10.13-lts-linux-amd64/
[root@docker-node1 1panel-v1.10.13-lts-linux-amd64]# ls 1panel 1panel.service
1pctl docker install.log install.sh LICENSE README.md
#恢复默认网络
不使用iptables
[root@docker-node1 harbor]# nft list ruleset
docker原生网络host---直连网络
[root@docker-node1 harbor]# docker rm webserver webserver
docker原生网络none
docker的自定义网络
自定义桥接网络---net
原生的桥接网络当中没有dns插件
##webserve、test1都退出
[root@docker-node1 ~]# docker network create mynet1 -d bridge cb9b2d5c2690cc8214a6ee32c813d7593614f0c79c5ba3758ed79523b45f95de
[root@docker-node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fe4b1832ecca bridge bridge local
81e88a23fb22 host host local
cb9b2d5c2690 mynet1 bridge local
0ca32642ad25 none null local
12、docker容器间的网络通信
[root@docker-node1 ~]# docker network create mynet2 -d bridge fba196630d53dc8efd1f8b4bebadaafcbc4ae2bffad2028a206a3cf3629e6285
[root@docker-node1 ~]# iptables -nL
[root@docker-node1 ~]# docker rm test1
test1
[root@docker-node1 ~]# docker rm webserver
webserver
/ # ping webserver ping: bad address 'webserver'
##两个容器用不同的站
[root@docker-node1 ~]# docker network connect mynet1 webserver
###两个容器用同一个站
[root@docker-node1 ~]# docker rm test1
test1
[root@docker-node1 ~]# docker rm webserver
webserver
###走回环接口
[root@docker-node1 ~]# docker rm test1
test1
[root@docker-node1 ~]# docker rm webserver
webserver
[root@docker-node1 ~]# docker run -it --name webserver --network container:test1 centos:7
####mysql、php
[root@docker-node1 ~]# docker load -i mysql-5.7.tar.gz
[root@docker-node1 ~]# docker load -i phpmyadmin-latest.tar.gz
##暴露端口
13、docker中容器内外网访问原理
内网访问外网
[root@docker-node1 ~]# docker rm -f mysq
l mysql
[root@docker-node1 ~]# docker rm -f mysqladmin
mysqladmin
[root@docker-node1 ~]# docker run -d --name test --rm nginx -p80:80 58183c0e503d65cf585a405df66412d67d9ea5825957f9d3101d7aff7992c295
[root@docker-node1 ~]# ps ax | grep docker-proxy 12095 pts/1 R+ 0:00 grep --color=auto docker-proxy
rhel9----默认nft
外网访问内网----haproxy、火墙策略双保险
[root@docker-node1 ~]# docker inspect test
[root@docker-node1 ~]# ps ax
14、docker中容器的跨主机通
####实验环境 双主机双网卡
##docker-node2配置docker环境
##安装docker包
[root@docker-node2 ~]# ls
docker.tar.gz
[root@docker-node2 ~]# tar zxf docker.tar.gz
[root@docker-node2 ~]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
docker.tar.gz
[root@docker-node2 ~]# dnf install *.rpm -y
##启动docker
[root@docker-node2 ~]# systemctl start docker
[root@docker-node2 ~]# docker info
###打开网卡混杂模式
eth1这款网卡在vmware中要设定为仅主机模式
[root@docker-node1 ~]# ip link set eth1 promisc on
[root@docker-node1 ~]# ip link set up eth1
[root@docker-node1 ~]# nmcli networking
enabled

15、docker数据卷简介及bindmount模式
默认数据卷
[root@docker-node1 ~]# cd /var/lib/docker/
[root@docker-node1 docker]# ls
buildkit engine-id network plugins swarm volumes
containers image overlay2 runtimes tmp
[root@docker-node1 docker]# cd volumes/
bind mount 数据卷------限制移植性
16、docker数据卷的managed模式
[root@docker-node1 ~]# docker run -d --rm --name mysql -e MYSQL_ROOT_PASSWORD=lee mysql:5.7
ed10fa495167c7bc8730a357cdcefc5d35925006f4d7c144f18e865f4b2854af
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed10fa495167 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 3306/tcp, 33060/tcp mysql
[root@docker-node1 ~]# docker inspect mysql
清理未使用的 Docker 数据卷
[root@docker-node1 volumes]# docker volume create mysqldate
mysqldate
[root@docker-node1 volumes]# ll /var/lib/docker/volumes/
总用量 32
drwx-----x 3 root root 19 9月 22 17:19 95bb492c95b5461dcffc96022974557c932cea36f721d7505fa 3b19a4e37726a
brw------- 1 root root 253, 0 9月 22 19:09 backingFsBlockDev
drwx-----x 3 root root 19 9月 23 17:24 d6cc0eddc22aaf80c5198e791b005cbee008e23abdc758374d9 d2d579c935cb1
-rw------- 1 root root 65536 9月 23 17:38 metadata.db
drwx-----x 3 root root 19 9月 23 17:38 mysqldate
[root@docker-node1 volumes]# docker rm -f mysql
mysql
[root@docker-node1 volumes]# docker run -d --rm --name mysql -e MYSQL_ROOT_PASSWORD=lee -v mysqldate:/var/lib/mysql mysql:5.7
e73e7fe026a57c57153e8db946685cef27d993e1eeb7132620d3e7cd5354e8ac
[root@docker-node1 volumes]# docker inspect mysql
###保持持久化
mysql停止后数据还在
###删除数据卷
bind mount 数据卷和 docker managed 数据卷的对 比





17、docker数据的备份及迁移
备份数据卷
数据恢复
18、docker中容器的安全加固思路
Docker 的安全优化 docker---安全隔离 虚拟化---完全隔离
[root@docker-node2 ~]# mount -t cgroup
[root@docker-node2 ~]# mount -t cgroup2
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recur siveprot)
隔离机制
查看id
[root@docker-node1 ~]# docker inspect test | grep Pid
"Pid": 2337,
"PidMode": "",
"PidsLimit": null,
[root@docker-node1 31a23dcba6e722abfa35b88dcc4ead9bc5de6e7ee506c23c4900a01d1dc1a8ca]# cat tasks
2337
2382
2383
2384
2385
19、docker中对容器资源限制的原理及对cpu资源限制的方法
限制cpu的使用量
[root@docker-node1 ~]# docker run -it --rm --name test \
> --cpu-period 100000 \
> --cpu-quota 20000 ubuntu
root@fec0c26dc0fa:/# dd if=/dev/zero of=/dev/null &
[1] 9
root@fec0c26dc0fa:/# top
限制cpu的优先级
[root@docker-node1 cpu]# echo 0 > /sys/devices/system/cpu/cpu1/online
[root@docker-node1 cpu]# echo 0 > /sys/devices/system/cpu/cpu2/online
[root@docker-node1 cpu]# echo 0 > /sys/devices/system/cpu/cpu3/online
开启容器与其争抢
20、docker中对于内存使用的限制
#####红帽9软件仓库解决办法
安装libcgroup

[root@docker-node1 ~]# dd if=/dev/zero of=/dev/shm/bigfile bs=1M count=200
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB,200 MiB)已复制,0.582844 s,360 MB/s
建立x1控制器
[root@docker-node1 x1]# echo 209715200 > memory.memsw.limit_in_bytes
[root@docker-node1 x1]# docker run -d --name test --memory 200M --memory-swap 200M nginx
af96d658fd6e1685cf9d8935022c7f3f9eef199bfc5712e0031ff4d4b72d928e
[root@docker-node1 x1]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af96d658fd6e nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp test
21、docker中对于磁盘io速录限制
###写数据位置
####运行速率
####限速
22.docker容器的信息隔离
内存没有隔离开
###安装lxcfs
####运行lxcfs并解决容器隔离性
[root@docker-node1 mnt]# lxcfs /var/lib/lxcfs &
23.docker容器特权
使用容器时一些资源不能被修改
#####添加容器特权
容器特权的白名单
24.docker-compose命令详解
[root@docker-node1 ~]# vim ~/.vimrc
[root@docker-node1 ~]# mkdir test
[root@docker-node1 ~]# cd test/
[root@docker-node1 test]# ls
[root@docker-node1 test]# vim docker-compose.yml
启动配置文件中定义的所有服务
查看日志

构建和重新构建服务
25、docker容器编排中servers用法
[root@docker-node1 test]# vim docker-compose.yml

端口映射(ports):
[root@docker-node1 test]# vim docker-compose.yml
[root@docker-node1 test]# docker compose down
[+] Running 2/2
✔ Container webserver Removed 0.2s
✔ Network test_default Removed 0.3s
环境变量(environment):
[root@docker-node1 test]# vim docker-compose.yml
[root@docker-node1 test]# docker compose up -d
[+] Running 2/2
✔ Network test_default Created 0.3s
✔ Container test-test1-1 Started 0.3s
[root@docker-node1 test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES
a277a1238c73 mysql:5.7 "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 3306/tcp, 33060/tcp test-test1-1
[root@docker-node1 test]# docker inspect test-test1-1
[root@docker-node1 test]# docker compose down
[+] Running 2/2
✔ Container test-test1-1 Removed 1.1s
✔ Network test_default Removed 0.2s
存储卷(volumes):
[root@docker-node1 test]# vim docker-compose.yml
[root@docker-node1 test]# docker inspect test-test1-1
[root@docker-node1 test]# docker compose down
[+] Running 2/2
✔ Container test-test1-1 Removed 1.6s
✔ Network test_default Removed 0.2s
网络(networks):
默认建立
[root@docker-node1 test]# vim docker-compose.yml

#使用本机自带bridge网络
[root@docker-node1 test]# vim docker-compose.yml
none
[root@docker-node1 test]# vim docker-compose.yml
自定义
[root@docker-node1 test]# vim docker-compose.yml
26、docker-compose 中网络设定
[root@docker-node1 test]# vim docker-compose.yml
external: true # 不建立新的网络而使用外部资源
name: bridge # 指定外部资源网络名字
自建网络
[root@docker-node1 test]# vim docker-compose.yml
指定ip
[root@docker-node1 test]# vim docker-compose.yml
27、docker-compose中数据卷设定------持久化
[root@docker-node1 test]# vim docker-compose.yml
28、dockercompose企业示例
[root@docker-node1 ~]# mkdir /var/lib/docker/volumes/conf
[root@docker-node1 ~]# dnf install haproxy -y --downloadonly --downloaddir=/mnt[root@docker-node1 mnt]# cd etc/
[root@docker-node1 etc]# ls
haproxy logrotate.d sysconfig
[root@docker-node1 etc]# cd haproxy/
[root@docker-node1 haproxy]# ls
conf.d haproxy.cfg
[root@docker-node1 haproxy]# cp haproxy.cfg /var/lib/docker/volumes/conf/
[root@docker-node1 haproxy]# cd /var/lib/docker/volumes/conf/
[root@docker-node1 conf]# ls
haproxy.cfg
[root@docker-node1 conf]# vim haproxy.cfg[root@docker-node1 ~]# docker images | grep haproxy
haproxy 2.3 7ecd3fda00f4 2 years ago 99.4MB
[root@docker-node1 test]# vim docker-compose.yml
[root@docker-node1 test]# echo webserver1 > /var/lib/docker/volumes/data_web1/_data/index.html
[root@docker-node1 test]# echo webserver2 > /var/lib/docker/volumes/data_web2/_data/index.html