容器架构深度剖析:从部署到微服务的实战指南

目录

1.Iaas Paas Saas (了解)

2.什么是dcoker

3.Docker 的网络模式有那些

4.Docker极速上手指南

1)配置docker源(用于安装docker)

2)docker下载镜像加速的配置

3)自动补全

4)载入镜像大礼包

5.Docker的镜像管理⭐

1)下载nginx:alpine镜像并查看

2)sl大法

3)删除镜像

4)镜像清理用的命令

prune 清除无效的镜像

5)给镜像设置标签

6)查看镜像详情信息

7)push上传镜像

8)build用于构建镜像

9)inspect用于检查信息

10)ls查看镜像

6.docker的容器管理⭐

1)run运行容器与查看容器信息

docker run背后的指令

​编辑

2)删除容器(极其危险⚠)

3)进入到已经运行的容器中

4)exec与attch的区别

5)容器自启动

6)宿主机文件传输到容器中

7)保留对容器的修改(配置,代码)

8)其他容器指令

docker stats 查看所有容器的cpu,内存,磁盘,网络,进程信息.

6.端口映射

1)映射多个端口

2)把容器的端口随机映射到宿主机

3)ip绑定端口 ⭐

7.数据卷挂载

2)创建容器,如果关闭就自动删除.

3)挂载到数据卷空间

8.容器架构自动化部分

1) Dockerfil

2)Dockerfile中的指令


1.Iaas Paas Saas (了解)

lass:基础设施及服务

Pass:平台及服务

Saas:软件及服务

Caas:容器及服务

2.什么是dcoker

  • docker 是一个开源容器,将应用程序及其依赖项打包成容器。

    优点:轻量化、可移植性、环境一致性、快速部署和扩展、隔离性、资源利用率、持续集成与交付。docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、服务器等。

    用途:应用程序的开发与测试、应用程序部署与交付、微服务架构、自动化测试与持续集成、资源隔离与安全性、云计算与扩展性

3.Docker 的网络模式有那些

桥接模式:默认模式,容器使用桥接网络与主机通信,通过 NAT 访问外部网络。

主机模式:容器与主机共享网络。

容器模式:多个容器共用一个网络栈。

无网络模式:没有网络接口。

自定义网络接口:通过用户自定义网络连接容器。

--network 指定网络模式

4.Docker极速上手指南

1)配置docker源(用于安装docker)

通用的安装脚本
curl -fsSL https://get.docker.com/ -o install-docker.sh
#1.安装相关依赖.
sudo yum install -y yum-utils
#2.下载官方的docker yum源文件
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i
's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/
docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum install docker-ce docker-ce-cli containerd.io docker-buildxplugin docker-compose-plugin
#5.启动
systemctl enable --now docker
#6.检查
docker version 检查

容器架构深度剖析:从部署到微服务的实战指南_第1张图片

2)docker下载镜像加速的配置

以阿里云为例:

容器架构深度剖析:从部署到微服务的实战指南_第2张图片

容器架构深度剖析:从部署到微服务的实战指南_第3张图片

sudo mkdir -p /etc/docker
#/etc/docker/daemon.json docker服务端的配置文件.
#配置docker下载镜像的加速地址.
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3)自动补全

用于安装 Bash 自动补全以及额外的自动补全插件。它可以让您在使用 docker命令时更快地输入并减少输入错误的可能性。

yum install -y bash-completion bash-completion-extras

安装完成后,您需要重新启动 Bash 终端才能生效。然后,您可以开始在 Shell 命令中使用 Tab 键进行自动完成。

4)载入镜像大礼包

我为伙伴们准备了一些基础服务及系统镜像,以便于练习和使用,由于空间限制,无法上传,如有需要可私聊。

解压大礼包的useful_docker_images.tar.gz
cd oldboyedu_useful_docker_images/
for n in `ls` ;
do
  docker load -i $n
done

容器架构深度剖析:从部署到微服务的实战指南_第4张图片

4.docker C/S架构

容器架构深度剖析:从部署到微服务的实战指南_第5张图片

启动容器
docker run -d -p 80:80 nginx:1.24-alpine

docker run:启动一个新的容器。
-d:以后台(守护进程)模式运行容器。
-p 80:80:将主机的端口80映射到容器的端口80,允许通过主机的IP和端口访问NGINX服务。
nginx:1.24-alpine:使用NGINX的1.24-alpine版本镜像创建容器。
docker客户端找dockerd服务端,问是否有nginx镜像
如果有,则启动这个镜像,后台运行,访问容器端口是80端口.
如果没有,则从远程仓库下载镜像,启动这个镜像,后台运行,访问容器端口是80端口.



1. 提示你本地没有nginx镜像 nginx:latest最新版
Unable to find image 'nginx:latest' locally
2. 找远程仓库下载
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
3. 运行镜像,成为docker容器.
Digest:
sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c
9b31
Status: Downloaded newer image for nginx:latest
9020c66ace48effa904063f84c664535b8cc3aa2b95535df438c9f2f4952cc35
4.查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 4 months ago 141MB
5.查看容器
docker ps
6. 访问10.0.0.81:80--->容器的80端口

注意事项:此处使用了docker -p端口映射公共,需要使用IPtables的nat功能,(iptables -t nat -nl)需要开启系统的内核转发功能

# tail -1 /etc/sysctl.conf

net.ipv4.ip_forward = 1

# sysctl -p

net.ipv4.ip_forward = 1

5.Docker的镜像管理

容器架构深度剖析:从部署到微服务的实战指南_第6张图片

1)下载nginx:alpine镜像并查看

#1. ※※※※※
docker pull 下载镜像
docker pull nginx:1.22-alpine
#2. ※※※※※
docker image ls 简写为docker images查看镜像
docker images -a 查看所有镜像包含隐藏镜像.
查找镜像:
docker search
访问hub.docker.com
  • 镜像命名
#指定版本
只写服务名字一般下载服务的最新版本.
nginx 下载ngx最新版本 nginx:latest
下载ngx最新稳定的版本 nginx:stable
下载指定的版本 nginx:1.20.2
#指定系统
nginx镜像默认的系统是Debian系统
docker pull nginx:1.20.2-alpine 使用alpine系统更加节约空间
docker镜像使用的系统
Ubuntu
Debian bullseye,bluster,bookwom
Centos
alpone 镜像非常小(命令,依赖精简)Linux内核+busybox

2)sl大法

  • 保存docker镜像(save),其他节点导入(load)。

  • 集群规模大可以搭建本地私有镜像仓库

docker image save #docker save
docker image load #docker load
#1.1g个节点保存docker 镜像 -o输出到指定的文件.
docker save nginx:alpine -o nginx_alpine.tar   
#2. 导入load
docker load -i nginx_alpine.tar
  • 批量导出镜像
#通过awk取行,取列拼接处docker save xxx -o xxxx的命令
docker images |awk 'NR>1{print "docker save",$1":"$2,"- o",$1"_"$2".tar"}'
最后通过|bash运行
docker images:列出本地所有的Docker镜像。
awk命令:使用awk命令从表格中提取信息,NR>1表示从第二行开始,print表示输出结果。$1和$2表示第一列和第二列,用冒号连接起来,构成镜像名称和版本号。$1"_"$2".tar"则表示将镜像名称和版本号用下划线连接起来,并加上.tar扩展名,形成导出文件的名称。
|bash:通过管道将输出传递给bash解释器运行,实现批量导出Docker镜像的目的。
可以书写批量导出docker镜像脚本.
要批量导入Docker镜像,可以使用以下脚本:

#!/bin/bash

# 指定导入的目录
image_dir="/path/to/image/directory"

# 遍历目录中的所有tar文件
for file in $image_dir/*.tar; do
    # 获取文件名(不含扩展名)
    filename=$(basename "$file" .tar)
    
    # 导入镜像
    docker load -i "$file"
    
    # 标签镜像
    docker tag "$filename" myregistry.com/"$filename"
done
请根据实际情况修改image_dir变量的值,将其指定为包含要导入的镜像tar文件的目录。脚本将遍历该目录下的所有tar文件,并依次导入镜像并为其打上新的标签。

脚本中的myregistry.com是示例中的镜像仓库地址,你可以根据实际情况修改为你自己的镜像仓库地址。
要查找Docker镜像使用的镜像仓库地址,可以使用以下命令:


docker image inspect 替换为你想要查找的镜像的名称或ID。执行以上命令后,会返回包含各种详细信息的JSON格式输出。在输出中,你可以找到"RepoTags"字段,其中包含了镜像的仓库地址和标签信息。

保存脚本为一个文件(例如import_images.sh),然后在终端中使用bash import_images.sh或./import_images.sh命令来运行脚本。脚本会逐个导入镜像并为其打上标签。

请注意,在运行脚本之前,确保目标镜像仓库已经存在,并且你具有上传镜像到该仓库的权限。


3)删除镜像

docker image rm === docker rmi
删除镜像
选项-f强制删除镜像.

4)镜像清理用的命令

docker image prune #命令用于清理本地系统中不再使用的Docker镜像。这些镜像可能是由于构建过程中产生的临时镜像、无标签的镜像或者已被停止的容器留下的悬空镜像。
docker images -a #可以查看系统中所有镜像,包含隐藏镜像.
  • prune 清除无效的镜像

该命令将会删除无用的镜像、停止的容器、未使用的网络和数据卷等。同样,如果您想在删除时跳过确认提示,可以使用 -f 标志。

docker image prune

5)给镜像设置标签

docker tag nginx:1.22-alpine nginx:1.22-alpine-oldboy

6)查看镜像详情信息

docker 家目录/var/lib/docker/
下面是/var/lib/docker/目录中的一些重要子目录和文件:

containers/:该目录包含所有容器相关的文件,每个容器对应一个子目录。其中包括容器的元数据、日志、文件系统等。

image/:该目录包含所有镜像相关的文件,每个镜像对应一个子目录。其中包括镜像的元数据、层文件、配置等。

volumes/:该目录包含所有Docker卷(volumes)相关的文件,每个卷对应一个子目录。其中包括卷的数据和元数据。

networks/:该目录包含所有Docker网络相关的文件,每个网络对应一个子目录。其中包括网络的配置和状态信息。

swarm/:该目录包含Docker Swarm集群相关的文件,包括集群的状态、节点信息、服务定义等。
 
trust/:该目录包含与图像信任相关的文件,包括签名和信任数据库。

tmp/:该目录用于存储临时文件,例如构建镜像时产生的临时文件。

此外,/var/lib/docker/目录还包含一些其他重要的文件,如Docker引擎的配置文件、日志文件等。
#查看 nginx:alpine镜像的信息,输出的是json格式.
docker image inspect nginx:alpine
#jq专门过滤,json形式数据
docker inspect mysql:8.0-debian |jq .[].Id

7)push上传镜像

docker login <仓库地址>
docker tag <本地镜像> <仓库地址>/<镜像名称>:<标签>
docker push <仓库地址>/<镜像名称>:<标签>

8)build用于构建镜像

docker build -t <镜像名称> 

执行该命令后,Docker 将会根据 Dockerfile 中的指令来构建镜像,并将其命名为指定的名称。

9)inspect用于检查信息

容器架构深度剖析:从部署到微服务的实战指南_第7张图片

inspect结果是json形式
进行过滤可以用三剑客过滤
可以用jq过滤,jq是json格式数据处理工具

10)ls查看镜像

docker images
docker images -a显示所有镜像(包含隐藏的中间过程镜像,构建镜像的时候会有)

6.docker的容器管理⭐

容器架构深度剖析:从部署到微服务的实战指南_第8张图片

容器架构深度剖析:从部署到微服务的实战指南_第9张图片

1)run运行容器与查看容器信息

容器架构深度剖析:从部署到微服务的实战指南_第10张图片

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run -d -p 80:80 nginx
  • 查看容器运行状态
docker ps -a #显示所有状态容器.
docker ps #只显示运行中的容器.不会显示其他状态容器.
  • docker run背后的指令

docker run -d -p 81:80 --name ngx_1.24_alpine_v2 --restart=always nginx:1.24-alpine-new
#1. 拉取镜像
docker pull nginx:1.24-alpine-new
#2. 创建容器
docker create -p 81:80 --name ngx_1.24_alpine_v2 --
restart=always nginx:1.24-alpine-new
#3. 启动容器
docker start ngx_1.24_alpine_v2
#4. 检查结果
docker ps

容器架构深度剖析:从部署到微服务的实战指南_第11张图片

2)删除容器(极其危险)

docker container rm == docker rm
docker rm 容器名字或id
docker rm -f 容器名字或id
  • 删除所有容器
#显示所有容器(-a)并只显示容器id (-q)
docker ps -a -q
#删除容器
docker rm -f `docker ps -a -q`

3)进入到已经运行的容器中

#连接到运行中的容器中
docker exec -it ngx_1.24_alpine /bin/sh #对于其他系统可以用/bin/bash

4)exec与attch的区别

容器架构深度剖析:从部署到微服务的实战指南_第12张图片

5)容器自启动

docker run的时候设置容器重启策略
docker run -d -p 80:80 --name ngx_1.24_alpine --restart=always nginx:1.24-alpine-new

6)宿主机文件传输到容器中

docker cp index.html ngx_1.24_alpine:/usr/share/nginx/html/

7)保留对容器的修改(配置,代码)

保留修改,生成镜像.
docker commit ngx_1.24_alpine nginx:1.24_v2_conf_index
docker run -d -p 88:80 --name ngx_1.24_v2_conf_index --restart always nginx:1.24_v2_conf_index

8)其他容器指令

docker kill 用于结束指定的容器. stop无法关闭,可以使用kill.

docker top 查看容器中进程信息.

docker stats 查看所有容器的cpu,内存,磁盘,网络,进程信息.

资源限制通过docker run的时候加上资源限制的选项.

限制最大使用的内存50MB,最多使用1个cpu核心.
docker run -d -p 89:80 --name "ngx_1.24_limit" -m 50MB --cpus
1 nginx:1.24-alpine-new
docker stats查看.

6.端口映射

1)映射多个端口

  • 当容器内运行多个服务时,每个服务都需要映射一个端口;
  • 当需要使用负载均衡、反向代理等技术时,需要将容器内的多个端口映射到不同的主机端口上,以便进行流量管理和分发。
一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 86:80
nginx:1.20.2-alpine
docker port hopeful_northcutt(容器名字或id)

2)把容器的端口随机映射到宿主机

docker run -d -P --name ngx_ports_v3 nginx:1.24-alpine-new
随机映射本质:根据镜像中的配置 EXPOSE配置映射端口.
docker inspect nginx:1.24-alpine-new |grep -i -A1 expose

3)ip绑定端口

docker run -d -p 172.16.1.81:8080:80 --name secure_nginx nginx:1.24-alpine-new
ss -lntup |grep 8080

7.数据卷挂载

1)如何解决数据持久化问题? 数据卷(挂载),让数据永久保存在宿主机中.

docker run -v 
指定要挂载的目录/文件
-v 宿主机的路径:容器内部路径
docker run -d -p 8848:80 --name nginx_volumn --restart always \
-v `pwd`/index.html:/usr/share/nginx/html/index.html \
nginx:1.24-alpine

2)创建容器,如果关闭就自动删除.

--restart=always与--rm冲突.
docker run -d -p 12306:80 --name nginx_game --rm \
-v `pwd`:/usr/share/nginx/html/ \
nginx:1.24-alpine-new

3)挂载到数据卷空间

docker volume create data


docker run -d -P --name nginx_data -v data:/var/log/
nginx:1.24-alpine-new


docker inspect data
[
    {
       "CreatedAt": "2023-07-11T16:01:00+08:00",
       "Driver": "local",
       "Labels": null,
       "Mountpoint":                                        "/var/lib/docker/volumes/data/_data",
       "Name": "data",
       "Options": null,
       "Scope": "local"
     }
]

8.容器架构自动化部分

1) Dockerfil

1. 准备目录及Dockerfile
[[email protected] /server/dockfile/01-centos-nginx]# cat
Dockerfile
FROM centos:7
LABEL author="mf996"
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'mf linux' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
2. 根据Dockerfile构建镜像
docker build . -t 'nginx:1.20.2-centos7'
注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名.
3. 运行
docker run -d --name 'nginx-1.20.1-centos7-01' -p 81:80
nginx:1.20.2-centos7
4. 调试

2)Dockerfile中的指令

Dockerfile指令 含义 应用 建议
Dockerfile开头部分
FROM 指定基本镜像类似于docker pull下载镜像 FROM ubuntu:20.04 尽量少些Ubuntu或Ubuntu:latest,尽量指定具体的版本
LABEL 用于指定容器的属性信息,(个人信息) LABEL maintaline="mengfei996" 推荐使用LABEL,不推荐使用下面的MAINTAINER
MAINTAINER 不再使用
ENV 用于创建Dockerfile中使用的变量 ENV Tengline_Version 2.3.3 软件版本可以创建使用变量。
Dokerfile中间处理部分
RUN 制作镜像过程中需要执行的命令,通常系统配置,服务配置,部署。但不能出现阻塞当前终端的命令。 RUN系统命令即可 不建议使用连续多个RUN,合并连续多个RUN.ADD
ADD 可以把指定文件或目录拷贝到容器中,会解压压缩包。相对于当前目录 ADD restart.tar.gz /app/code/restart/ 拷贝压缩包使用
COPY 可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压,相当于当前目录。 COPY nginx.conf /etc/nginx/nginx.conf 拷贝文件或目录
WORKDIR 指定容器的默认工作目录 WORKDIR /app/code/restart/ ADD restart.tar.gz . 一般用于配合ADD,COPY需要书写容器中路径指令。Dockerfile中使用相对路径操作容器。
VOLUME 挂载数据卷 VOLUME /usr/share/nginx/html 创建随机数据卷挂载容器的目录。 未来推荐dockers run的时候指定 -v即可
Dockerfile结尾部书写的内容
EXPOSE 指定镜像要对外暴露的端口 EXPOSE 80 用于指定一或多个容器的端口. 未来这个端口可以-p识别.xxxx:80
CMD 用于指定容器的入口命令。入口命令可以在docker run的时候替换,运行镜像启动容器的时候,容器默认运行的命令。 CMD ["命令","参数01","参数02"] CMD ["nginx","-g","daemon off",] 大部分都会使用CMD.
ENTRYPOINT 用于指定容器的入口命令,无法被docker run替换,docker run指定时候仅仅作为entrypoint命令的参数而已. ENTRYPOINT ["executable","param1","param2"] 使用不多

你可能感兴趣的:(架构)