架构第一周作业-20230702
一、总结namespace的类型及功能
Namespace 是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机的一样的隔离环境。容器技术是在一个进程内实现运行指定服务的运行环境,并且保护宿主机内核不受其它进程的干扰和影响,如文件系统空间、网络空间、进程空间等,主要通过以下技术实现容器运行空间的相互隔离:
1、MNT Namespace:提供磁盘挂载点和文件系统的隔离能力
每个容器都要有独立的根文件系统和独立的用户空间,从而实现在容器里面启动服务并使用容器的运行环境。例如宿主机是Ubuntu的操作系统,然后在里面运行一个centos环境的容器,之后在此环境中启动一个nginx服务,该nginx运行所使用的环境就是centos系统目录的运行环境,它是无法直接访问宿主机的文件系统。
宿主机使用chroot技术把容器锁定到一个指定的运行目录里面并作为容器的根运行环境。
2、IPC Namespace:同进程间通信的隔离能力
IPC Namespace 隔离进程间的通信资源。同一个 IPC Namespace 的进程可实现内存、CPU等资源共享,但是不同的 IPC Namespace 则严格隔离。
3、UTS Namespace:提供主机名隔离能力
UTS Namespace(UNIX Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识,包含了 hostname 和 domainname,它使得一个容器拥有属于自己的 hostname 标识,这个标识独立于宿主机系统和其它容器。
4、PID Namespace:提供进程隔离能力
在 Linux 操作系统中有一个 PID 为1的进程,它是其它所有进程的父进程。在每一个容器内部也有一个父进程来管理其下的所有子进程,各个容器间的进程通过 PID Namespace 隔离(如 PID 编号的重复、容器内进程的生成与回收)
5、Net Namespace:提供网络隔离能力
每个容器都有类似于虚拟机一样,它有自己的网卡、监听端口、TCP/IP 协议栈等,docker 使用 network Namespace 启动一个 vethX 接口,容器将会拥有它自己的桥接IP地址,通常为docker0,而docker0实质就是Linux的虚拟网桥。
6、User Namespace:提供用户隔离能力
User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的UID和GID,只是会将用户的作用范围限制在每个容器内。
7、Control group(cgroup)Namespace:提供进程所属的控制组的身份隔离
在容器中,如果不对其做任何资源限制,则宿主机会允许其占用无限大的空间,可能会因为代码的bug导致程序一直申请内存,直到把宿主机的内存占完,为了避免此类问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等。Linux Cgroup 最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。
# 内核较新,支持的功能更多
root@ubuntu20-server1-111:~# grep -i cgroup /boot/config-5.4.0-153-generic | grep -v "^#" | wc -l
18
[root@centos7-mini2 ~]# grep -i cgroup /boot/config-3.10.0-1160.el7.x86_64 | grep -v "^#" | wc -l
12
root@ubuntu20-server1-111:~# grep -i mem /boot/config-5.4.0-153-generic | grep CG | grep -v "^#"
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_KMEM=y
CONFIG_SLUB_MEMCG_SYSFS_ON=y
8、Time Namespace:提供时间隔离能力
Time Namespace是Docker中的一种命名空间,用于管理容器中的时间。它可以将容器中的时间与外部系统中的时间隔离,以保证容器中的时间不会受到外部系统时间的影响。
9、Syslog Namespace:提供 syslog 隔离能力
syslog namespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2月实现了一个名为“journal namespace”的类似功能
二、熟练使用各种方式安装docker
1、apt/yum 在线安装
在centos7操作系统上安装docker
[root@centos7-mini2 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
# 如果之前有安装过docker,需卸载所有相关环境
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖,下载 repo 文件,并把软件仓库地址替换为国内镜像站
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 开始安装
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 默认安装的是最新的版本
[root@centos7-mini2 ~]# systemctl enable --now docker.service
[root@centos7-mini2 ~]# docker info
Client: Docker Engine - Community
Version: 24.0.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.10.5
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.18.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
···
···
# 也可安装指定的版本
## 查看有哪些docker-ce版本
[root@centos7-mini2 ~]# yum list docker-ce --showduplicates | sort -r
## 安装指定的版本
[root@centos7-mini2 ~]# yum -y install docker-ce-20.10.8 docker-ce-cli-20.10.8
## 启动服务查看版本
[root@centos7-mini2 ~]# systemctl enable --now docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@centos7-mini2 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.8
API version: 1.41
Go version: go1.16.6
Git commit: 3967b7d
Built: Fri Jul 30 19:55:49 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
···
···
在Ubuntu20.04上安装docker
# 安装必要的一些系统工具
root@ubuntu20-server1-111:~# apt-get update
root@ubuntu20-server1-111:~# apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 写入软件源信息
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新
apt-get update
# 安装指定版本的Docker-CE:
## 查找Docker-CE的版本:
apt-cache madison docker-ce
## 安装指定版本的Docker-CE
root@ubuntu20-server1-111:~# apt -y install docker-ce=5:20.10.24~3-0~ubuntu-focal docker-ce-cli=5:20.10.24~3-0~ubuntu-focal
root@ubuntu20-server1-111:~# docker version
Client: Docker Engine - Community
Version: 20.10.24
API version: 1.41
Go version: go1.19.7
Git commit: 297e128
Built: Tue Apr 4 18:20:53 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
···
···
2、rpm 包离线安装
官网下载地址:https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里云国内下载地址:https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
# 准备好所有需要的软件包
[root@centos7-mini3 repo]# ls
audit-libs-python-2.8.5-4.el7.x86_64.rpm fuse-overlayfs-0.7.2-6.el7_8.x86_64.rpm
checkpolicy-2.5-8.el7.x86_64.rpm libcgroup-0.41-21.el7.x86_64.rpm
containerd.io-1.6.21-3.1.el7.x86_64.rpm libseccomp-2.3.1-4.el7.x86_64.rpm
container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm libsemanage-python-2.5-14.el7.x86_64.rpm
docker-ce-20.10.24-3.el7.x86_64.rpm policycoreutils-python-2.5-34.el7.x86_64.rpm
docker-ce-cli-20.10.24-3.el7.x86_64.rpm python-IPy-0.75-6.el7.noarch.rpm
docker-ce-rootless-extras-24.0.2-1.el7.x86_64.rpm setools-libs-3.3.8-4.el7.x86_64.rpm
docker-scan-plugin-0.23.0-3.el7.x86_64.rpm slirp4netns-0.4.3-4.el7_8.x86_64.rpm
fuse3-libs-3.6.1-4.el7.x86_64.rpm
[root@centos7-mini3 repo]# rpm -ivh *.rpm
[root@centos7-mini3 repo]# systemctl enable --now docker
[root@centos7-mini3 repo]# docker version
Client: Docker Engine - Community
Version: 20.10.24
API version: 1.41
Go version: go1.19.7
Git commit: 297e128
Built: Tue Apr 4 18:22:57 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
···
···
3、二进制安装
二进制包下载地址:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/
# 准备好二进制包和相关文件
[root@centos7-mini3 ~]# ll
total 81228
-rw-r--r-- 1 root root 1264 Jul 6 19:24 containerd.service
-rw-r--r-- 1 root root 66990280 Jul 4 14:28 docker-20.10.24.tgz
-rwxr-xr-x 1 root root 16168192 Jul 6 19:28 docker-compose-Linux-x86_64_1.24.1
-rw-r--r-- 1 root root 1695 Jul 6 19:24 docker.service
-rw-r--r-- 1 root root 175 Jul 6 19:24 docker.socket
# 解压缩二进制包
mkdir /data
[root@centos7-mini3 ~]# tar docker-20.10.24.tgz -C /data
# 拷贝文件到指定目录
[root@centos7-mini3 ~]# cp /data/docker/* /usr/bin/
[root@centos7-mini3 ~]# cp docker.service containerd.service docker.socket /lib/systemd/system/
[root@centos7-mini3 ~]# cp docker-compose-Linux-x86_64_1.24.1 /usr/bin/docker-compose
[root@centos7-mini3 ~]# groupadd docker
[root@centos7-mini3 ~]# systemctl start containerd.service
[root@centos7-mini3 ~]# systemctl start docker.service
[root@centos7-mini3 ~]# systemctl start docker.socket
[root@centos7-mini3 ~]# docker --version
Docker version 20.10.24, build 297e128
三、总结docker的命令使用(镜像管理、容器管理)
镜像管理类命令
# 搜索镜像
# 官网镜像查看
[root@centos7-mini2 ~]# docker search nginx
# 查看本地镜像
[root@centos7-mini2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 为镜像添加一个新的tag
docker tag nginx:101 nginx:102
[root@centos7-mini2 ~]# docker images nginx:102
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 102 605c77e624dd 18 months ago 141MB
# 拉取镜像
[root@centos7-mini2 ~]# docker pull nginx
[root@centos7-mini2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 18 months ago 141MB
# 导出镜像,下面两条命令等价
docker save nginx:latest > /data/images/nginx:latest.tar
docker save nginx:latest -o /data/images/nginx:latest.tar
# 导入镜像,下面两条命令等价
[root@centos7-mini2 ~]# docker load < /data/images/nginx\:latest2.tar
docker load -i /data/images/nginx\:latest2.tar
# 删除镜像
[root@centos7-mini2 ~]# docker image rm 605c77e624dd
# 删除本地未使用的镜像
docker prune
# 对镜像打一个新的标签
docker tag
# 镜像仓库的登录和登出
docker login/logout
# 镜像上传,镜像上传前需要登录到指定的仓库
[root@centos7-mini2 ~]# docker login --username=wuhaolam registry.cn-hangzhou.aliyuncs.com
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/#credentials-store
Login Succeeded
[root@centos7-mini2 ~]# docker tag nginx:latest registry.cn-hangzhou.aliyuncs.com/wuhaolam/docker_repo:nginx_latest
[root@centos7-mini2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 18 months ago 141MB
registry.cn-hangzhou.aliyuncs.com/wuhaolam/docker_repo nginx_latest 605c77e624dd 18 months ago 141MB
[root@centos7-mini2 ~]# docker push registry.cn-hangzhou.aliyuncs.com/wuhaolam/docker_repo:nginx_latest
# 查看镜像的构建历史
[root@centos7-mini2 ~]# docker history registry.cn-hangzhou.aliyuncs.com/wuhaolam/docker_repo:nginx_latest
IMAGE CREATED CREATED BY SIZE COMMENT
605c77e624dd 18 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 18 months ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 18 months ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 18 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 18 months ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 18 months ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 18 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 18 months ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.1 0B
<missing> 18 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.5 0B
<missing> 18 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 18 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 18 months ago /bin/sh -c #(nop) ADD file:09675d11695f65c55… 80.4MB
容器管理类命令
# 创建容器
docker run -it -d nginx
# 从容器和宿主机相互拷贝数据
[root@centos7-mini2 ~]# docker cp f03bd435783e:/docker-entrypoint.sh /mnt
[root@centos7-mini2 ~]# ls /mnt
docker-entrypoint.sh
[root@centos7-mini2 ~]# docker cp /etc/redhat-release f03bd435783e:/tmp
root@f03bd435783e:/# ls /tmp
redhat-release
# 进入到容器中执行相关操作
docker exec -it f03bd435783e bash/sh
# 显示docker对象(镜像、容器、网络等)的详细信息
docker inspect
# 查看容器的状态
docker ps // 查看所有运行中的容器
docker ps -a // 查看所有的容器,包括不在运行中的容器
-q // 此选项可只显示容器的ID,不显示其它相关信息
# 强制关闭所有运行中的容器
docker kill `docker ps -q`
# 持续查看容器标准输出和错误输出的日志
docker logs -f f03bd435783e
# 列出容器的端口映射关系
docker port f03bd435783e
# 重命名容器
docker rename OLD_NAME NEW_NAME
# 重启容器
docker restart
# 暂停一个或多个容器
docker pause
# 取消一个或多个容器的暂停
docker unpause
# 强制删除运行中的容器
docker rm -f
# 批量删除已经退出的容器
docker rm -f `docker ps -aq -f status=exited`
# 创建并进入容器,ctrl+p+q 退出容器不注销
docker run -it nginx bash
# 自定义容器的名称
docker run -it -d --name nginx-test2 nginx:latest
[root@centos7-mini2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9395dac52c76 nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 80/tcp nginx-test2
# 单次运行容器
docker run -it --rm --name nginx-delete-test nginx bash
# 创建容器的时候传递命令和参数
docker run -it -d centos /usr/bin/tail -f '/etc/hosts'
# 启动/停止一个或多个容器
docker start/stop
# 显示容器资源的实时统计信息
docker stats
# 等待容器退出并显示容器的退出状态码,0为正常退出
[root@centos7-mini2 ~]# docker wait 26ca8033d8e5
0
四、总结docker的存储引擎
- overlay:unionFS 文件系统,Linux内核1.18后支持
- overlay2:推荐使用的存储类型
- devicemapper:Centos 和 RHEL 早期使用的存储驱动程序
- ZFS/btrfs:没有广泛使用
- vfs:用于测试环境,适用于无法使用copy-on-write文件系统的情况。性能差,不建议用于生产
- AUFS:早期UnionFS文件系统的实现,是docker 18.06及更早版本使用的存储引擎
五、总结docker的-v和-p的使用
# 创建容器并进行端口转发,默认进行tcp映射
[root@centos7-mini2 ~]# docker run -itd -p 80:80 nginx
011f92a27be54da55cc639e002b920a2b7d8897a3f25e364d23b500264bf9bd1
[root@centos7-mini2 ~]# docker port 011f92a27be5
80/tcp -> 0.0.0.0:80
80/tcp -> :::80
# 创建容器并进行多端口转发,使用udp的映射
docker run -itd -p 81:80 -p 886:80/udp nginx
# 创建容器时指定地址进行转发
docker run -itd -p 192.168.119.147:778:80 nginx
# 将数据卷和容器中的目录做映射,数据卷nginx-data需要提前创建
## 创建数据卷
docker volume create nginx-data
## 查看数据卷
docker volume ls
## 运行容器并做数据卷的映射
docker run -it -d -p 889:80 -v nginx-data:/data/nginx nginx
# 将宿主机的数据映射到容器内部
## ro 表示只有只读权限,不加默认是读写
docker run -it -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 788:80 nginx
docker run -it -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 789:80 nginx
六、使用docker创建MySQL容器并把数据保存到宿主机的/data/mysql
# 创建宿主机数据目录
[root@centos7-mini2 ~]# mkdir /data/mysql
# 运行容器
[root@centos7-mini2 ~]# docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
ab2b6fce2621393080cf852adba70f4c187aaab748a610842ee868ff6912786d
# 测试
root@ubuntu20-server1-111:~# mysql -uroot -p123456 -h192.168.119.147
mysql> create database testslq;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testslq |
+--------------------+
5 rows in set (0.00 sec)
# 在宿主机查看数据
[root@centos7-mini2 ~]# ls -l -d /data/mysql/testslq/
drwxr-x--- 2 polkitd input 6 Jul 6 14:57 /data/mysql/testslq/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」