分类 默认分类 下的文章

云与虚拟化_实验9 Docker数据卷和数据卷容器应用

实验要求

掌握Docker数据卷和数据卷容器使用方法。

前置准备

要求实验主机能够连接外网,已经正确安装Docker,并关闭防火墙和selinux。

实验步骤

步骤1:创建数据卷

  1. 创建容器,为容器添加一个数据卷,容器名为mycentos,数据卷在容器里的目录是/opt/data。
[root@master ~]# docker pull centos:7     // 拉取所需镜像
[root@master ~]# docker run -it --name mycentos -v /opt/data centos:7 /bin/bash
[root@7908b98ed9e6 /]# cd /opt/data
[root@7908b98ed9e6 data]# echo "centos1">centos1
[root@7908b98ed9e6 data]# echo "centos2">centos2
[root@7908b98ed9e6 data]# ls
centos1  centos2

  1. 新建一个终端,连接到主机,在主机上查看容器对应数据卷的目录路径。
[root@master ~]# docker inspect mycentos|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/ceb3146a0edcbe16a525bff78f06ae9169b471459678695db8155a14e629cbb0/_data",
[root@master ~]# ls /var/lib/docker/volumes/ceb3146a0edcbe16a525bff78f06ae9169b471459678695db8155a14e629cbb0/_data
centos1  centos2
[root@master ~]# echo "123" >> /var/lib/docker/volumes/ceb3146a0edcbe16a525bff78f06ae9169b471459678695db8155a14e629cbb0/_data/123
root@dayi-cloud-k8s-master:/home/dayi# docker inspect mycentos|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/bd8e9cc17f888e8ecda307c6040aae00a8b17b7de051ec4064e83477fe26d923/_data",
root@dayi-cloud-k8s-master:/home/dayi# 

  1. 在mycentos容器中再次查看目录信息。
[root@6d7542b2ab36 data]# ls
123  centos1  centos2
[root@6d7542b2ab36 data]# cat 123 
123
[root@6d7542b2ab36 data]# 

步骤2:挂载宿主机文件或目录到容器数据卷

  1. 建立容器,将容器里挂载的共享数据设置为只读,以使数据修改只能在宿主机上操作。
[root@master ~]# docker run -it --name mynginx -v /root/index.html:/myweb/index.html:ro nginx /bin/bash
root@3feb79f12fb3:/# cd /myweb/
root@3feb79f12fb3:/myweb# echo "123">index.html  //写入数据
bash: index.html: Read-only file system   //只读,无法写入

噗,成目录了。

这样就可以啦:

echo "<h1>ovo</h1>" >>/opt/index.html && docker run -it --name mynginx2 -v /opt/index.html:/myweb/index.html:ro nginx /bin/bash

root@registry:/home/dayi# echo "<h1>ovo</h1>" >>/opt/index.html && docker run -it --name mynginx2 -v /opt/index.html:/myweb/index.html:ro nginx /bin/bash
root@2dc277e6ec93:/# cd m
media/ mnt/   myweb/ 
root@2dc277e6ec93:/# cd myweb/
root@2dc277e6ec93:/myweb# ls
index.html
root@2dc277e6ec93:/myweb# cat index.html 
<h1>ovo</h1>
<h1>ovo</h1>
root@2dc277e6ec93:/myweb# echo ovo>>index.html 
bash: index.html: Read-only file system
root@2dc277e6ec93:/myweb# 

在宿主机上修改共享数据。

[root@master ~]# echo "456">>index.html

在容器中再次查看文件信息。

root@3feb79f12fb3:~# cat /myweb/index.html 
welcome user nginx
456

  1. 挂载宿主机目录到容器。
[root@master ~]# mkdir /opt/data
[root@master ~]# echo "data1">/opt/data/data1
[root@master ~]# echo "data2">/opt/data/data2
[root@master ~]# docker run -it --name mycentos3 -v /opt/data:/opt/mydata centos:7 /bin/bash
[root@47ba22a96edd /]# cd /opt/mydata/
[root@47ba22a96edd mydata]# ls
data1  data2
[root@47ba22a96edd mydata]# echo "data3">data3
[root@47ba22a96edd mydata]# ls
data1  data2  data3

在宿主机上查看目录信息。

[root@master ~]# ls /opt/data
data1  data2  data3

OVO

root@registry:/home/dayi# mkdir /opt/data
root@registry:/home/dayi# echo "data1">/opt/data/data1
root@registry:/home/dayi# echo "data2">/opt/data/data2
root@registry:/home/dayi# docker run -it --name mycentos3 -v /opt/data:/opt/mydata centos:7 /bin/bash
[root@57ad12222cf8 /]#  cd /opt/mydata/
[root@57ad12222cf8 mydata]# ls
data1  data2
[root@57ad12222cf8 mydata]# echo "data3">data3
[root@57ad12222cf8 mydata]# ls
data1  data2  data3
[root@57ad12222cf8 mydata]# exit
exit
root@registry:/home/dayi# ls /opt/data/
data1  data2  data3
root@registry:/home/dayi# 

步骤3:创建数据卷容器

  1. 启动名为myontainer的容器,要求此容器包含两个数据卷/opt/volume1和/opt/volume2。
[root@master ~]# docker run -it -v /opt/volume1 -v /opt/volume2 --name my_container centos:7 /bin/bash
[root@0cc99e4c61da /]# ls /opt/
volume1  volume2    //  容器内数据卷目录vloume1和volume2已经创建

  1. 在宿主机上查看与数据卷对应的目录路径。
[root@master ~]# docker inspect my_container|grep /var/lib/docker/volumes
   "Source": "/var/lib/docker/volumes/3f6cc0585bef55d1be35566aa79dbd21d17a4625b587bc883ab8c4fc159d562d/_data",
   "Source": "/var/lib/docker/volumes/4e606dc4e1dbe1a907970d59668681169debf4ece91fdf6c7a5f782d2955d05e/_data",
// 从显示结果可以看到与数据卷对应的目录路径

  1. 创建my_centos容器,挂载my_container容器中的数据卷。
[root@master ~]# docker run -it --rm --volumes-from my_container --name my_centos centos:7 /bin/bash
[root@50fe2adcdfa6 /]# ls /opt   
volume1  volume2
//  从显示结果上可以看到volume1和volume2数据卷都存在

root@debian-crop:/home/dayi/docker# docker run -it -v /opt/volume1 -v /opt/volume2 --name my_container centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
[root@003437a20dcd /]# ls /opt
volume1  volume2
[root@003437a20dcd /]# 
root@debian-crop:/home/dayi# docker inspect my_container|grep /var/lib/docker/volumes
                "Source": "/var/lib/docker/volumes/c806dd7516316241a7ec23312ca49fdfe18026734bb4e2e4dd40ffcaf3112683/_data",
                "Source": "/var/lib/docker/volumes/4d26d6db345290ac0c6532631dcc2fe069ffc2d761732a30b44c015492d2577c/_data",
root@debian-crop:/home/dayi# docker run -it --rm --volumes-from my_container --name my_centos centos:7 /bin/bash
[root@4420a54f7387 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@4420a54f7387 /]# cd /opt
[root@4420a54f7387 opt]# ls
volume1  volume2
[root@4420a54f7387 opt]# 

云与虚拟化_实验8 利用Docker实现容器互连

主机名IP地址/子网掩码容器名容器IP地址
node-a192.168.59.128/24node1_busybox172.100.0.10
node-b192.168.59.130/24node2_busybox172.100.1.10

1. 需要两个虚拟机

克隆一个OVO

具体的机子:

  • node-a
  • node-b
#修改克隆机子的主机名
vim /etc/hostname
reboot

查看IP地址

ip addr

我这里两个机子的IP:

  • 192.168.59.128 node-a
  • 192.168.59.130 node-b

步骤1-4

node-a上创建网桥和容器

# 创建自定义网桥,并分配网段172.100.0.0/24
docker network create --subnet=172.100.0.0/24 node1-br0
# 查看网桥信息
docker network inspect node1-br0
# 启动一个容器,并设置IP地址为172.100.0.10/24
docker run -itd --net=node1-br0 --ip=172.100.0.10 --name node1_busybox busybox

# 查看容器的IP
docker exec -it node1_busybox ip addr
# 测试容器和网桥是否能通
docker exec -it node1_busybox ping -c 4 172.100.0.1

node-b 上创建网桥和容器

# 创建自定义网桥,并分配网段172.100.1.0/24
docker network create --subnet=172.100.1.0/24 node2-br0
# 查看网桥信息
docker network inspect node2-br0
# 启动一个容器,并设置IP地址为172.100.1.10/24
docker run -itd --net=node2-br0 --ip=172.100.1.10 --name node2_busybox busybox

# 查看容器的IP
docker exec -it node2_busybox ip addr
# 测试容器和网桥是否能通
docker exec -it node2_busybox ping -c 4 172.100.1.1

测试两个容器之间是否可以相通

结果应该是不通!

node-a

docker exec -it node1_busybox ping -c 4 172.100.1.10

node-b

docker exec -it node2_busybox ping -c 4 172.100.0.10

蚌埠,通了,真蚌埠住了(因为这个公网IP,主机开了tun的网卡,然后就通了)

关掉tun网卡:
这样是正常的:

然后这个通了(但通的是一个美国的机子,这次实验的ip是公网IP,172的IP只有部分(0-31)是公网):

步骤5

在node-a节点和node-b节点上配置路由表和iptable规则。

把iptables全部清除了之后加了个路由表。

node-a

#添加路由表
ip route add 172.100.1.0/24 via 192.168.59.130 dev ens33
# 清除iptables规则,并设置默认策略为接受
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n

node-b

ip route add 172.100.1.0/24 via 192.168.59.128 dev ens33
# 清除iptables规则,并设置默认策略为接受
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n

步骤6 再次测试node1节点上的node1-busybox容器与node2节点上的node2-busybox容器与是否可以连通。在node1节点上进行测试。

ping -c 4 172.100.1.10
PING 172.100.1.10 (172.100.1.10): 56 data bytes
64 bytes from 172.100.1.10: seq=0 ttl=62 time=12.601 ms

通啦

云与虚拟化_虚拟化和容器——6 Docker资源控制

基于cgroups

https://tech.meituan.com/2015/03/31/cgroups.html

1. 对CPU的控制

步骤1:限制CPU命令速率。

(1)利用centos:7镜像分别生成容器名为centos1和centos2的容器,其中centos1容器不限制cpu的使用率,centos2容器将cpu的使用率限制为20%。

docker pull centos:7
docker run -dit --name centos1 centos:7 /bin/bash
# 限制CPU百分之20000
docker run -dit --name centos2 --cpu-quota 20000 centos:7 /bin/bash

100000微秒
020000只能使用百分之20

--cpu-quota 20000: --cpu-quota定义了容器每--cpu-period(默认为100000微秒,即100ms)可以获得的最大CPU时间,单位为微秒。--cpu-quota 20000意味着在默认的100ms周期中,容器最多只能使用20ms的CPU时间。

(2)通过查看对应的cgroup配置文件 /sys/fs/cgroup/cpu/docker/容器编号/cpu.cfs_quota_us来查看各容器cpu的使用率。

#这里是你的容器名
cat /sys/fs/cgroup/cpu/docker/86ff33795a71f86236011598c9cbaea55c4a319bd142e6ffb845e055d4db4fd9/cpu.cfs_quota_us

没限制的(-1

(3)如需修改对应容器的cpu使用率,可以直接修改cgroup配置文件 /sys/fs/cgroup/cpu/docker/容器编号/cpu.cfs_quota_us的值来实现。

修改占用为百分之40

echo 40000 >> /sys/fs/cgroup/cpu/docker/9b19d5677dd03ad0f0f4bd3eee7659b7845fb34e78e42e819f21b6338fdc6342/cpu.cfs_quota_us

cat /sys/fs/cgroup/cpu/docker/9b19d5677dd03ad0f0f4bd3eee7659b7845fb34e78e42e819f21b6338fdc6342/cpu.cfs_quota_us

这里虽然是追加写,但是并不会追加,linux都是文件,估计是直接内核交互了。?

删掉这俩实验容器

docker rm -f centos1 centos2

步骤2:多任务按比例分享CPU

(1)利用centos:7镜像创建centos3和centos4容器。设置容器权重,使用centos3和centos4的cpu占比为33.3%和66.7% 。

docker run -dit --name=centos3 --cpu-shares 512 centos:7 /bin/bash
docker run -dit --name=centos4 --cpu-shares 1024 centos:7 /bin/bash

docker ps -a

(2)打开另一个终端,使用docker stats命令查看状态。

docker stats

(3)分别打开两个终端,利用两个终端分别进行centos1和centos2容器,安装压力测试包stress。(4)分别在两个容器内启用4个线程。

容器3

#进入容器
docker exec -it centos3 /bin/bash
yum -y install epel-release
yum -y install stress
stress -c 4

容器4

docker exec -it centos4 /bin/bash
yum -y install epel-release
yum -y install stress
stress -c 4

(5)再次利用docker stats命令查看。

还是挺准的
132/(66+132)=0.666666666667

步骤3: 查看cpu内核使用

通过查看Cgroup配置文件为/sys/fs/cgroup/cpuset/docker/容器编号/cpuset.cpus。

1.CPU限制

这个没有文件诶。

应该是默认没有启用

docker run -dit --cpuset-cpus="0,1" --name my_container nginx

这样就有啦

[root@node-a cpuset]# cd docker/8aae2d1e6621d076570cb4e9fc10d099a46475f25add3440848ec1bd243a1f16/
[root@node-a 8aae2d1e6621d076570cb4e9fc10d099a46475f25add3440848ec1bd243a1f16]# cat cpuset.cpus
0-1

删除容器

docker rm -f my_container

2. 对内存使用的限制

docker run -dit --name=centos5 -m 512m centos:7 /bin/bash
docker run -dit --name=centos6 centos:7 /bin/bash

步骤2:打开一个终端,使用docker stats命令查看状态

docker stats

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O     PIDS
8df1885fca97   centos6   0.00%     400KiB / 1.777GiB   0.02%     656B / 0B   0B / 0B       1
501410e22049   centos5   0.00%     1.965MiB / 512MiB   0.38%     656B / 0B   9.61MB / 0B   1

步骤3:查看容器对应的Cgroup配置文件可查看容器内存限制。

cat /sys/fs/cgroup/memory/docker/501410e22049929b244235423c19239b50cc61a082834dba85cb18c59e2f7470/memory.limit_in_bytes

536870912 // 536870912=512×1024×1024

虚拟化和容器——实验5 常用命令的使用

创建一个容器 ,名字为CentosTest

docker pull centos:7
docker create -it --name CentosTest centos:7

启动容器:

docker start CentosTest

在容器里执行命令(bin/bash):

docker exec -it CentosTest /bin/bash
ls
exit

退出后查看容器状态:

docker ps -a

仍然在运行

创建一个nginx容器NginxTest,nginx:latest,并且映射到80端口

docker run -dit -p 80:80 --name NginxTest nginx:latest

替换容器内的index.html

#在容器外:
echo "欢迎使用Docker容器" >> index.html
docker cp index.html NginxTest:/usr/share/nginx/html

尝试看看

curl 127.0.0.1

导出容器

docker export -o nginxtest.tar NginxTest
ls

导入容器

docker import nginxtest.tar nginx:v1.0
docker images

输出容器和宿主机的端口映射关系:

docker inspect -f {{.NetworkSettings.Ports}} NginxTest
docker port NginxTest

删除容器NginxTest CentosTest

docker rm -f NginxTest CentosTest

云与虚拟化——实验4 构建镜像

实验4-1 利用Docker commit构建带sshd服务自定义镜像

1.1 拉取镜像,并安装ssh,生成秘钥生成镜像

# 拉取镜像
docker pull centos:7
# 启动一个容器
docker run -itd --name centos_sshd centos:7 bash
# 在容器里启动bash,并且显示出来
docker exec -it centos_sshd bash

image-20231019142535047

进入容器:

#切换镜像源到cernet
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.cernet.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo
#安装sshd,以下在容器里进行
yum -y install openssh-server net-tools
mkdir -pv /var/run/sshd
#启动脚本
echo "/usr/sbin/sshd -D" > /auto_sshd.sh
#查看文件
cat /auto_sshd.sh
#给执行权限
chmod +x /auto_sshd.sh
#修改密码:
echo "root:123456" | chpasswd
#生成秘钥:一路回车哦
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

image-20231019142808785

image-20231019142844134

再生成俩秘钥

ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
#退出容器
exit

image-20231019143109874

构建镜像:

docker commit centos_sshd centos7_sshd:1.0
   当前的containerd  目标镜像:TAG信息
docker images

image-20231019143810378

1.2测试容器是否可用

docker run -itd --name centos_7.0-1 centos7_sshd:1.0
docker ps

成功

image-20231019143858385

测试SSH是否可用

#               containerID  执行的软体
docker exec -it c43a bash
# 查看IP
ifconfig
# CTRL + P +Q 挂起退出或者直接ctrl+X

#上面两行也可以直接执行:
docker exec -it centos_7.0-1 ifconfig

#启动SSH服务
docker exec -itd centos_7.0-1 八省/auto_sshd.sh

image-20231019144028627

image-20231019150408738

1.3连接SSH

#这里填你的IP
ssh root@172.17.0.6
#密码:123456

image-20231019144712817

image-20231019150738368

1.4查看镜像/Container信息

docker inspect centos7_sshd:1.0

image-20231019145506707

2 帮助

# 删除全部容器
docker rm -f $(docker ps -aq)
#         force  -a全部 -q只显示id

# SSH无法连接删除这个文件:
rm -rf ./.ssh/known_hosts

实验4-2 利用Dockerfile构建带sshd服务的自定义镜像

3.1Dockerfile 构建centos7_sshd:1.0

新建个目录:

mkdir -pv /opt/centos_sshd
cd /opt/centos_sshd
vi Dockerfile

把这个文件塞进去

# 使用CERNET镜像源的CentOS 7作为基础镜像
FROM centos:7
MAINTAINER dayi 
# 切换镜像源到CERNET
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
        -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.cernet.edu.cn/centos|g' \
        -i.bak \
        /etc/yum.repos.d/CentOS-*.repo
# 安装必要的软件包
RUN yum -y install openssh-server net-tools && \
    mkdir -pv /var/run/sshd && \
    echo "/usr/sbin/sshd -D && nohup" > /auto_sshd.sh && \
    chmod +x /auto_sshd.sh && \
    echo "root:123456" | chpasswd && \
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && \
    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && \
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''
# 暴露SSH端口
EXPOSE 22
# 启动SSH服务
CMD ["bash","/auto_sshd.sh"]

image-20231019151206964

3.2构建镜像

构建!

cd /opt/centos_sshd
#构建
docker build -t centos7_sshd:2.0 .
#查看镜像
docker images

image-20231019151719703

3.3 启动

docker run -itd --name centos7_ssh_2 centos7_sshd:2.0
docker exec -it centos7_ssh_2 ifconfig

image-20231019153533889

连接试试:

ssh root@172.17.0.2
123456

image-20231019153635632

3.4 启动失败

# 删除全部容器
docker rm -f $(docker ps -aq)
#         force  -a全部 -q只显示id

# SSH无法连接删除这个文件:
rm -rf ./.ssh/known_hosts