架构第一周作业-20230702

一、总结namespace的类型及功能

Namespace 是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机的一样的隔离环境。容器技术是在一个进程内实现运行指定服务的运行环境,并且保护宿主机内核不受其它进程的干扰和影响,如文件系统空间、网络空间、进程空间等,主要通过以下技术实现容器运行空间的相互隔离:

1、MNT Namespace:提供磁盘挂载点和文件系统的隔离能力

image

每个容器都要有独立的根文件系统和独立的用户空间,从而实现在容器里面启动服务并使用容器的运行环境。例如宿主机是Ubuntu的操作系统,然后在里面运行一个centos环境的容器,之后在此环境中启动一个nginx服务,该nginx运行所使用的环境就是centos系统目录的运行环境,它是无法直接访问宿主机的文件系统。

宿主机使用chroot技术把容器锁定到一个指定的运行目录里面并作为容器的根运行环境。

2、IPC Namespace:同进程间通信的隔离能力

image
IPC Namespace 隔离进程间的通信资源。同一个 IPC Namespace 的进程可实现内存、CPU等资源共享,但是不同的 IPC Namespace 则严格隔离。

3、UTS Namespace:提供主机名隔离能力

image

UTS Namespace(UNIX Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识,包含了 hostname 和 domainname,它使得一个容器拥有属于自己的 hostname 标识,这个标识独立于宿主机系统和其它容器。

4、PID Namespace:提供进程隔离能力

image

在 Linux 操作系统中有一个 PID 为1的进程,它是其它所有进程的父进程。在每一个容器内部也有一个父进程来管理其下的所有子进程,各个容器间的进程通过 PID Namespace 隔离(如 PID 编号的重复、容器内进程的生成与回收)

5、Net Namespace:提供网络隔离能力

image
每个容器都有类似于虚拟机一样,它有自己的网卡、监听端口、TCP/IP 协议栈等,docker 使用 network Namespace 启动一个 vethX 接口,容器将会拥有它自己的桥接IP地址,通常为docker0,而docker0实质就是Linux的虚拟网桥。

6、User Namespace:提供用户隔离能力

image
User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的UID和GID,只是会将用户的作用范围限制在每个容器内。

7、Control group(cgroup)Namespace:提供进程所属的控制组的身份隔离

image
在容器中,如果不对其做任何资源限制,则宿主机会允许其占用无限大的空间,可能会因为代码的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/
posted @ 2023-07-06 20:01  wuhaolam  阅读(50)  评论(0编辑  收藏  举报