2023年11月

虚拟化和容器——实验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

云与虚拟化:实验3 搭建Docker私有仓库

实验要求

了解仓库,掌握搭建私有仓库的方法。

前置准备

要求实验主机能够连接外网,已经正确安装Docker(版本号19.03.12),并关闭防火墙和selinux。本实验各主机配置信息如表3-1所示。

表 3-1 各宿主机信息表

主机名IP地址节点角色
registry10.1.1.170/24私有仓库
node110.1.1.71/24客户端1
node210.1.1.59/24客户端2

先建立一个快照:

实验步骤

步骤1

registry主机上利用docker pull命令从Docker Hub拉取registry镜像,并通过docker images命令查看下载的registry镜像。

[root@localhost ~]# hostnamectl set-hostname registry
[root@registry ~]# docker pull registry
[root@registry ~]# docker images

步骤2

通过docker run命令启动一个registry容器,并挂载目录,利用容器提供私有仓库的服务,并通过docker ps命令查看registry容器是否运行。

[root@registry ~]# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry
[c93669d06c5545b1f90fcb721bdb4da43b7add9fff7ede08b9e58822d1c235d1]
[root@registry ~]# docker ps -a
root@registry:/home/dayi# docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry registry
3469b41b2f69ec32f06eb5d004ba84141e3d7f499b6b343756c31b4a4879ca8d
root@registry:/home/dayi#

步骤3

执行命令

curl -X GET http://127.0.0.1:5000/v2/_catalog

命令,如果显示如下信息,表示目前仓库里还没有镜像,此时私有仓库已经创建和启动完毕了。

{"repositories":[]}
root@registry:/home/dayi# curl -X GET http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
root@registry:/home/dayi# 

步骤4

拉取busybox镜像,修改tag名称后,上传到本地仓库中。

[root@registry ~]# docker pull busybox
[root@registry ~]# docker images
[root@registry ~]# docker tag busybox:latest 192.168.5.100:5000/busybox:latest
[root@registry ~]# docker images

步骤5

将镜像192.168.5.100:5000/busybox上传到本地仓库中。

[root@registry ~]# docker push 192.168.5.100:5000/busybox

步骤6

如果出现上述提示,表示本地仓库默认使用的是https协议进行上传。而当前采用是非https协议上传,可采用步骤6进行处理。修改/usr/lib/systemd/system/docker.service文件,在ExecStart参数后面添加--insecure-registry 192.168.5.100:5000。

[root@registry ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@registry ~]# systemctl daemon-reload
[root@registry ~]# systemctl restart docker

重启registry容器。

[root@registry ~]# docker restart c93669d06c55
root@registry:/home/dayi# docker run -d -p 5000:5000 -v /opt/myregistry:/var/lib/registry registry
4d5dacc0842c47f7308100362bba7e0ed67dca3503092ee07b09d7f6a7275144
root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
Get "https://10.1.1.170:5000/v2/": http: server gave HTTP response to HTTPS client
root@registry:/home/dayi# 

步骤7

再次上传镜像192.168.5.100:5000/busybox到本地仓库。

[root@registry ~]# docker push 192.168.5.100:5000/busybox

root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
Get "https://10.1.1.170:5000/v2/": http: server gave HTTP response to HTTPS client
root@registry:/home/dayi# vim /usr/lib/systemd/system/docker.service
root@registry:/home/dayi# vim /usr/lib/systemd/system/docker.service
root@registry:/home/dayi#  systemctl daemon-reload
root@registry:/home/dayi# systemctl restart docker
root@registry:/home/dayi# docker push 10.1.1.170:5000/busybox
Using default tag: latest
The push refers to repository [10.1.1.170:5000/busybox]
3d24ee258efc: Retrying in 1 second 

步骤8

在客户端1和客户端2上修改/usr/lib/systemd/system/目录下的docker.service文件,在ExecStart=/usr/bin/dockerd后面添加--insecure-registry 192.168.5.100:5000,保存后并重启docker服务。

--insecure-registry 10.1.1.170:5000

客户端1:

[root@localhost ~]# hostnamectl set-hostname node1
[root@node1 ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker

客户端2:

[root@localhost ~]# hostnamectl set-hostname node2
[root@node2 ~]# vi /usr/lib/systemd/system/docker.service
// 修改ExecStart参数,修改完后,内容如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.5.100:5000

保存退出,重启docker服务。

[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker

步骤9

在客户端node1和node2上拉取私有仓库中的busybox镜像。

[root@node1 ~]# docker pull 192.168.5.100:5000/busybox
[root@node1 ~]# docker images

[root@node2 ~]# docker pull 192.168.5.100:5000/busybox
[root@node2 ~]# docker images

node1

node2

云与虚拟化 1-2实验

步骤1

在可联网的主机上制作docker本地安装包。
yum -y install ntpdate yum-utils
ntpdate ntp.aliyun.com

步骤2

创建离线安装包
mkdir -p /opt/docker
chmod -R 777 /opt/docker

先启动一个centos容器

docker run -it --privileged -v /opt/docker:/opt/docker centos:7 bash

在容器里进入目录

cd /opt/docker

添加镜像源:

yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

步骤 3

下载离线包到/opt/docker
# 下载依赖
yum install --downloadonly --downloaddir=/opt/docker yum-utils device-mapper-persistent-data lvm2 createrep

ls

# 安装仓库制作器?
yum install -y device-mapper-persistent-data lvm2 createrepo
yum makecache fast
yum install --downloadonly --downloaddir=/opt/docker/ docker-ce-18.03.0.ce

#下载KEY
cd /opt/docker/
yum install -y wget
wget https://download.docker.com/linux/centos/gpg

# 加入仓库数据
createrepo -pdo /opt/docker /opt/docker
createrepo --update /opt/docker

cd /opt/docker/
ll
tar -zcvf docker-local.tar.gz *

退出当前容器

CTRL+P+Q

删除容器,这里要一一对应。

docker ps -a 
docker stop 

docker stop 7ea
docker rm 7ea

步骤4 在离线的主机上安装docker

离线主机

1. 解压一个docker_c7

然后恢复到init的时候

2. 想法子把刚刚生成的/opt/docker/docker-local.tar.gz 复制出来,然后放到新的虚拟机上

我这里用了termius直接SFTP拖出来了
然后制作一个iso,linux的话直接用这个命令,windows用软碟通也可以。

yum install genisoimage
mkisofs -o centos_7_docker.iso /opt/docker/docker-local.tar.gz

3. 启动虚拟机安装

移除网络适配器,挂载iso

4. 开机安装

#版本号
uname -r        //查看Linux内核版本号
#步骤2:关闭防火墙,并查询防火墙是否关闭。
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

#步骤3:修改/etc/selinux目录下的config配置文件,设置SELINUX为disabled后,保存并退出。
setenforce 0
vi /etc/selinux/config
SELINUX=disabled                // 将SELINUX设置为disabled

步骤4:将centos的ISO镜像文件和docker-local.tar.gz文件上传到离线的主机,本任务将文件复制到/opt目录,并将centos的ISO镜像文件挂到/opt/centos目录,将docker-local.tar.gz文件解压到/opt/docker目录。

#因为文件在iso里,先挂载
mkdir -p /mnt/cd
#挂载磁碟
mount /dev/cdrom /mnt/cd
cd /mnt/cd
ls -al

#复制文件
mkdir -p /opt/docker /opt/centos

#k拷贝文件
cp docker_1.tgz /opt/docker

#解压文件
cd /opt/docker

tar -zxvf docker_1.tgz

image-20231019124636051

步骤5:配置docker-ce的yum源。

rm -ivf /etc/yum.repos.d/*.repo  // 删除原有的repo文件
vi /etc/yum.repos.d/docker-ce.repo
// 添加如下内容
[docker]
name=docker ce
baseurl=file:///opt/docker
gpgcheck=0
enabled=1
gpgkey=file:///opt/docker/gpg

[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
保存退出(:wq)

挂载centosDVD

下载镜像文件:

自动选地址:http://mirrors.cernet.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

USTC:https://mirrors.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

感觉齐工大的不是很快。

换碟

image-20231019125819247

umount /dev/cdrom
mount /dev/cdrom /opt/centos
ls /opt/centos

image-20231019130259356

继续:

yum clean all
步骤6:安装createrepo。
yum -y install deltarpm libxml2-python python-deltarpm createrepo
createrepo -d /opt/docker/repodata
yum clean all
yum makecache fast
步骤7:安装docker-ce,并检查docker-ce是否安装成功。
yum -y install docker-ce
systemctl start docker
systemctl enable docker 
docker version

image-20231019124743689

image-20231019124945753

image-20231019130432045

到此完成。

下面是失败的尝试过程

特权容器安装(失败)

忽略bia

这里直接启动centos:7 容器来安装,假装他是一个虚拟机,开的时候给特权容器。

启动一个特权容器

并且把主机的目录映射到容器里

docker run -it --privileged -v /opt/docker:/opt/docker centos:7 bash

执行命令

# 查看内核版本号
uname -r

# 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

因为容器没有内核,这些命令可能会失败。

解压安装

看好在容器里再执行!(就是hostanme是一些字母)

这里原计划书解压目录有点问题

tar -zxvf /opt/docker/docker-local.tar.gz -C  /opt/docker
rm -ivf /etc/yum.repos.d/*.repo
vi /etc/yum.repos.d/docker-ce.repo

写入:
i 插入 wq保存

[docker]
name=docker ce
baseurl=file:///opt/docker
gpgcheck=0
enabled=1
gpgkey=file:///opt/docker/gpg

[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1

安装

yum clean all


yum -y install deltarpm libxml2-python python-deltarpm createrepo
createrepo -d /opt/docker/repodata
yum clean all
yum makecache fast

这里失败了,估计是没内核的事情,但按理说应该可以成功。

云与虚拟化_实验1

实验1

下载使用虚拟机

然后快照回溯到init

网络:

推荐改为NAT模式:

开机就好啦

实验1 安装和使用Docker

登录名:

root
openstack

步骤1、2 关闭防火墙和SELinux

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

# 关闭SELinux
setenforce 0
# i 进入输入模式,ESC+:wq 退出编辑模式
vi /etc/selinux/config

把SELINUX 改为:
SELINUX=disabled

步骤3 修改网卡配置信息

可能更简单方法

nmtui

改信息:

改成自动然后删掉IP

【俩ESC】
reboot

登录后输入

ip addr

这个就是IP地址啦

修改DNS

vi /etc/sysconfig/network-scripts/ifcfg-ens33

加入DNS1=114.114.114.114

重启下网络

测试与外网的连通性。

[root@node-a ~]# ping -c 4 www.sina.com.cn
PING ww1.sinaimg.cn.w.alikunlun.com (27.221.120.196) 56(84) bytes of data.
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=1 ttl=128 time=1.07 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=2 ttl=128 time=0.348 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=3 ttl=128 time=0.553 ms
64 bytes from 27.221.120.196 (27.221.120.196): icmp_seq=4 ttl=128 time=0.449 ms

--- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4015ms
rtt min/avg/max/mdev = 0.348/0.606/1.074/0.279 ms
[root@node-a ~]#

SSH连接

在cmd里

ssh root@192.168.59.128 (这里是你的ip)

输入yes

4.更新yum仓库信息

yum -y update

5. 配置时间同步

yum –y install ntpdate
ntpdate ntp.aliyun.com

6 7 8. 安装docker

yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2

# 中科大镜像源
yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

选择并且安装

yum list docker-ce --showduplicates | sort -r

安装

yum install –y docker-ce.x86_64 3:24.0.6-1.el7

11.开机自启、开机启动


systemctl start docker
systemctl enable docker

12. 查看docker进程

ps -ef | grep docker
docker version

[root@node-a ~]# ps -ef | grep docker
root       2024      1  0 15:29 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       2171   1452  0 15:30 pts/0    00:00:00 grep --color=auto docker
[root@node-a ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:35:25 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:34:28 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
  GitCommit:        v1.1.9-0-gccaecfc
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@node-a ~]#

12.镜像加速器


vi /etc/docker/daemon.json

i 输入
ESC -> :wq 保存


{
  "registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"]
}

13. 重启docker


[root@node-a ~]# systemctl daemon-reload
[root@node-a ~]#
[root@node-a ~]# systemctl restart docker
[root@node-a ~]#

14. 下载镜像以便于测试

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

打开网页测试:

实验1-2

1. 步骤1:在可联网的主机上制作docker本地安装包。

附录

删除全部容器

docker rm -f $(docker ps -aq)

-q 是ID