学习Docker(二)
一、Docker快速入门
Docker 改变了什么?
1.简化配置
2.流水线管理
3.应用隔离
4.提高开发效率
5.快速部署
6.面向产品:产品交付
7.面向开发:简化环境配置
8.面向测试:多版本测试
9.面向运维:环境一致性
10.面向架构:自动化扩容(微服务)
1、安装、启动
1、配置yum源
http://mirrors.aliyun.com/centos/7/extras/x86_64/
http://mirrors.aliyun.com/centos/7/os/x86_64/
http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/
2、安装
yum install docker-ce -y 3、启动
systemctl start docker
2、配置远程访问和第三方仓库
1、修改配置脚本
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd
2、配置启动参数(默认daemon文件没有)
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"data-root": "/opt/docker",
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
配置daemon文件参数,不能和docker.service文件里ExecStart一致,否则会冲突。
3、重载配置并重启
systemctl daemon‐reload
systemctl docker restart docker daemon ‐‐help 这里可以查看到所有支持的参数
3、简单操作
ctrl+PQ 保存容器退出 #帮助
docker --hlep
docker deamon --help #查看镜像
docker images #查看镜像环境
docker image inspect xxx #搜索镜像
docker search centos #下载镜像
docker pull docker.io/centos #导出镜像
docker save centeos >/tmp/centos.tar.gz #导入镜像
docker load --input centos.tar
docker load centos.tar #删除镜像
docker rmi 镜像ID(IMAGE ID) #删除容器
docker rm mydocker
docker rm -f mydocker(删除正在运行的容器)
docker run --rm centos /bin/echo "hehe" 运行后删除容器 #启动容器
docker run centos /bin/echo 'Hello world'
docker start mydocker #显示镜像状态
docker ps -a #更改名称
docker run --name mydocker -t -i centos /bin/bash #后台运行容器
docker run -d -P nginx #查看容器访问日志
docker logs e6b599b46241
docker logs mydocker #查看容器映射的端口
docker port mydocker #数据卷
docker run -d --name test1 -v /data nginx
docker inspect -f {{.Mounts}} mynginx ##查找上面方法,默认挂载的位置
-v src:dst #源:目的
-v src:dst:ro #加ro 为只读 #挂载单文件
-v srcfile:dstfile #源文件:目的文件 --volumes-from
docker run -d --name test2 --volumes-from test1 cenos /bin/bash
#数据卷容器。让此数据卷在多个容器之间共享,test1为已经挂载数据卷的容器名。 #结束正在运行的所有容器
docker kill $(docker ps -a -q) #删除所有容器
docker rm $(docker ps -a -q)
4、进入容器
方法1
docker attach mydocker(不安全,不推荐)
同时进入2次容器,一个窗口执行的命令,另个窗口可以看到,不安全。
方法2(执行命令返回结果)
docker exec -it mydocker /bin/bash
docker exec mydocker whoami
方法3(复杂)yum install -y util-linux
docker inspect --help
nsenter --help
docker inspect -f "{{ .State.Pid}}" mydocker
nsenter -t 3729 -m -u -i -n -p
nsenter --target 3729 --mount --uts --ipc --net --pid
5、网络访问
随机映射
docker run -P 指定映射
-p 81:80 -p 443:443
docker run -d -p 192.168.1.253:81:80 nginx
6、容器间互联
方法1
docker --name web2 --link web1 -d -p 8080:80 mynginx nginx
docker exec -it web2 sh
cat /etc/hosts #查看
docker inspect web1 #查看容器信息
方法2
docker -d --name web2 --link web1:shop_web -p 8080:80 mynginx nginx
cat /etc/hosts #查看 有变化,shop_web为别名
7、手动构建容器
1、在centos镜像基础上安装nginx
docker run --name mynginx -it centos
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y nginx
vi /etc/nginx/nginx.conf
daemon off; 2、保存镜像
docker commit -m "My-Nginx" 148aca4d9f2e oldboy/mynginx:v1
-m 描述信息 3、启动构建好的容器
docker run --name test1 -d -p 80:80 qinzc/mynginx:v1 nginx
8、自动构建容器
1、编写dockerfile
vim /opt/dockerfile/nginx/Dockerfile #基础镜像
FROM centos #维护人的信息
MAINTAINER Zicheng.Qin 542129333@qq.com #安装执行
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum -y install nginx && yum clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf #添加文件
ADD index.html /user/share/nginx/html/index.html #开放端口
EXPOSE 80 #容器执行命令
CMD ["nginx"] 2、开始构建
echo "nginx in docker,hahaha" > index.html
docker build -t oldboy/mynginx:v2 /opt/dockerfile/nginx/ 3、启动
docker run --rm --name test -d -p 80:80 mynginx:v2
9、Docker网络
1)Docker 创建自定义网络
1、创建网络
docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 110.10.0.1 my_net
2、查看
docker network ls
3、验证测试指定IP
dokcer run -it --rm --network=my_net --ip 10.10.0.88 nginx 4、给容器添加自定义的网段
docker network connect my_net 容器ID
默认网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
a12599cda63c bridge bridge local
e24ca1f8f76d host host local
2ab615faf494 none null local 默认带有3种网络驱动
bridge: NAT模式,默认使用
host : 会走物理网卡,只能起一个对应端口容器。相当于复制物理机IP来访问。
none : 容器内只有回环地址。需要API等配置。 案例:docker run -it --rm --net=host -p 80:80 centos bash
2)跨主机通信 (指定路由方法)
1、首先保证两台主机之间能正常通信。
2、更改Docker默认的网卡IP,使之间不同网段。
环境
第一台宿主机:(IP:192.168.1.100)
第二台宿主机:(IP:192.168.1.200) 进入容器,查看各自IP,ping对方容器IP看看是否畅通(一般不通)
docker run -it --name node1 centos bash (容器1 IP:192.58.1.2)
docker run -it --name node2 centos bash (容器2 IP:192.68.1.2)
配置静态路由
宿主机1上配置一条路由到宿主机2 (演示:临时生效) route add -net 192.158.1.0/24 gw 192.168.1.200
最后进入容器测试是否能ping宿主机2,到此主机间容器互联配置完毕
3)跨主机通信 (overlay)
consul实现跨容器互通
需要用到配置管理中心consul,实现跨容器互通
准备环境
consul管理中心(IP:192.168.1.99)
docker pull progrium/consul
docker run -d -p 8500:8500 -name consul progrium/consul -server -bootstrap
第一台宿主机:(IP:192.168.1.100)
vim /etc/docker/daemon.json
增加:
{
"cluster-store":"consul:192.168.1.99:8500",
"cluster-advertise":"192.168.1.100:2375"
}
保存后:
systemctl daemon-reload #重载配置
systemctl restart docker #记得关闭防火墙,selinux之类的。
第二台宿主机:(IP:192.168.1.200)
vim /etc/docker/daemon.json
增加:
{
"cluster-store":"consul:192.168.1.99:8500",
"cluster-advertise":"192.168.1.200:2375"
}
保存后:
systemctl daemon-reload #重载配置
systemctl restart docker #记得关闭防火墙,selinux之类的。
开始配置
1.第一台宿主机:(IP:192.168.1.100) 创建网络:
docker network create -d overlay my_net1 验证是网络否创建同步:
docker network ls,到第二台宿主机执行同样命令,看看my_net1网络是否同步过去。 运行容器
docker run -it --rm --network my_net1 nginx
2.第二台宿主机:(IP:192.168.1.200) 运行容器
docker run -it --rm --network my_net1 nginx
验证
进入容器,Ping对端容器IP,一般就可以通信了。
10、docker 日志收集
环境准备
sysctl vm.max_map_count=262144
docker pull sebp/elk
运行ELK容器
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --rm --name elk sebp/elk
#容器启动后执行下面地址验证es是否启动成功
http://192.168.1.xx:9200/_search?pretty
安装fluentd软件(与elk容器安装同一台机)
docker pull fluent/fluentd #拉取软件
mkdir /fluentd_log #创建一个收集日志后保存的路径 docker run -d -p 24224:24224 -p 24224:24224/udp -v /fluentd_log:/fluentd/log fluent/fluentd
安装日志收集工具filebeat (与elk容器安装同一台机)
1、安装
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat
rpm -ivh filebeat-6.x.x-x86_l4.rpm
2、配置
vim /etc/filebeat/filebeat.yml
enabled:true #开启
paths:
- /var/log/*.log #注释掉这行日志目录
- /data/docker/containers/*/*.log #注释,此目录为容器ID
- /fluentd_log #添加这行
output.elasticsearch:
hosts:["192.168.1.xx:9200"] #改成ES地址
3、启动
/etc/init.d/filebeat start #启动 filebeat
/etc/init.d/filebeat status #查看 filebeat 状态
修改docker日志驱动,发送日志到fluentd软件
(要收集日志的 主机修改此文件)
vim /etc/docker/daemon.json
{
"log-driver":“fluent”,
"log-opts":{
"fluentd-address":"192.168.1.xx:24224",
"tag":"linux-node4.xx.com" #标识,改成自己主机名
}
} systemctl daemon-reload #重载配置
systemctl restart docker #记得关闭防火墙,selinux之类的。
容器时间同步方法
docker exec d2kldds23 mkdir /usr/share/zoneinfo -p
docker cp /usr/share/zoneinfo/Asia d2kldds23:/usr/share/zoneinfo/Asia
docker restart d2kldds23
11、Docker 单机编排入门
Docker-compose 容器编排
LNMP场景
LN: A容器
MYSQL: B容器
Redis: C容器
1、想启动A容器时,B容器必须先启动。
2、C容器要启动,B容器必须先启动。 实现方法,就是使用docker-compose单机编排工具 Docker-compose
环境准备
yum -y install python-pip
pip install docker-compose
#如果下载启动有问题可到gitbug下载二进制版本,chmod +x 给执行权限即可
https://github.com/docker/compose/releases
创建docker-compose.yml编排文件
web1:
image: nginx
volumes:
- /root/docker/index1.html:/usr/share/nginx/html/index.html
expose:
- 80 web2:
image: nginx
volumes:
- /root/docker/index2.html:/usr/share/nginx/html/index.html
expose:
- 80 haproxy:
image: haproxy
volumes:
- /root/docker/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
links:
- web1
- web2
ports:
- "7777:1080"
- "80:80"
启动编排
docker-compose up /root/docker/ocker-compose.yml
docker-compose -d up /root/docker/ocker-compose.yml #生产环境加-d参数,后台启动
haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096 defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 5000ms
timeout server 5000ms listen stats
bind 0.0.0.0:1080
mode http
stats enable
stats hide-version
stats uri /stats
stats auth admin:admin frontend balance
bind 0.0.0.0:80
default_backend web_backends backend web_backends
mode http
option forwardfor
balance roundrobin
server web1 web1:80 check
server web2 web2:80 check
12、搭建Docker私有仓库(Harbor)
1)Harbor简介
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
2)下载和配置Harbor
环境说明
系统版本: CentOS7.x
docker-ce: 18.03.1-ce
docker-compose: version 1.22.0
Harbor: v1.7.0
安装方式: 在线安装
安装位置: /volume1/harbor
####安装Harbor需要先安装docker和docker-compose###
下载安装包
从 github harbor 官网 release 页面下载指定版本的安装包,因为是谷歌的地址,国内下载不了,饭墙下载后在传到服务器上即可。 #在线安装包
$ wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.0.tgz
$ tar xvf harbor-online-installer-v1.7.0.tgz
#离线安装包
https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.0-rc2.tgz
配置Harbor
解压缩之后,找到/volume1/harbor/harbor.cfg文件,该文件就是Harbor的配置文件。 vim /usr/local/harbor/harbor.cfg # hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = 192.168.1.11 # 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http # mysql数据库root用户默认密码root123,实际使用时修改下
db_password = root123 #邮箱根据情况配置,发送重置密码邮件时使用,也可以不配置
email_server = smtp.qinzc.me
email_server_port = 25
email_username = admin@qinzc.me
email_password = 12345678
email_from = admin <admin@qinzc.me>
email_ssl = false #设置只有管理员可以创建项目
project_creation_restriction = adminonly # 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345 # 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
auth_mode = db_auth # 是否开启自注册
self_registration = on # Token有效时间,默认30分钟
token_expiration = 30 # 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
3)安装Harbor
执行安装脚本 /volume1/harbor/install.sh
修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各个服务,Harbor依赖的镜像及启动服务如下: # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/chartmuseum-photon v0.7.1-v1.7.0 666d74cc236a 2 weeks ago 111MB
goharbor/harbor-migrator v1.7.0 482699d98927 2 weeks ago 799MB
goharbor/redis-photon v1.7.0 8adff755797f 2 weeks ago 96.1MB
goharbor/clair-photon v2.0.7-v1.7.0 7e72f6ba05bd 2 weeks ago 165MB
goharbor/notary-server-photon v0.6.1-v1.7.0 b4a22960dfce 2 weeks ago 102MB
goharbor/notary-signer-photon v0.6.1-v1.7.0 bb0db7ebd1de 2 weeks ago 99.6MB
goharbor/harbor-registryctl v1.7.0 1906a8b84fa5 2 weeks ago 101MB
goharbor/registry-photon v2.6.2-v1.7.0 677f21b09362 2 weeks ago 86.4MB
goharbor/nginx-photon v1.7.0 6ed96fc73f83 2 weeks ago 35.5MB
goharbor/harbor-log v1.7.0 722fa4a77846 2 weeks ago 81MB
goharbor/harbor-jobservice v1.7.0 effd390c0cd4 2 weeks ago 83.8MB
goharbor/harbor-core v1.7.0 2ebd58ce5638 2 weeks ago 95.2MB
goharbor/harbor-portal v1.7.0 72a291f86bab 2 weeks ago 40.2MB
goharbor/harbor-adminserver v1.7.0 9f850341a571 2 weeks ago 72MB
goharbor/harbor-db v1.7.0 45d94fe5fee5 2 weeks ago 133MB
microbox/dockerui latest c3452e32cfe9 3 years ago 10.4MB # docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Restarting
harbor-core /harbor/start.sh Up (health: starting)
harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy) 80/tcp
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:433->443/tcp, 0.0.0.0:4433->443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp
registryctl /harbor/start.sh Up (healthy)
启动完成后,访问刚设置的hostname设置的即可 进行管理http://192.168.1.11 ,可以修改docker-compose.yml文件更改对应服务的端口映射。 自此私有仓库搭建完毕。
4)客户端配置
因为docker 默认不支持http方式登陆,所以客户端要以http方式登陆,需修改下配置。 方法一:
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11 #增加镜像地址
方法二:
创建/etc/docker/daemon.json文件,在文件中指定仓库地址
"insecure-registries":["192.168.1.11"] 完成后从载配置,重启docker
systemctl daemon-reload
systemctl restart docker
5)测试上传和下载镜像
1.客户端登陆
docker login 192.168.1.11
Username (admin):
Password:
Login Succeeded
2.创建Dockerfile
vim Dockerfile
FROM centos:centos7.1.1503
ENV TZ "Asia/Shanghai"
3.创建镜像
docker build -t 192.168.1.11/library/centos7.1:0.1 /opt/
4.把镜像push到Harbor
docker push 192.168.1.11/library/centos7.1:0.1
如果是从其他仓库pull下来的镜像,记得先执行 docker tag 给镜像做tag 才能push,例如:
docker pull busybox
docker tag busybox:latest 192.168.1.11/library/busybox:latest
docker push 192.168.1.11/library/busybox:latest
格式如下:
#docker tag 镜像 域名/项目名称/镜像名:版本
docker tag SOURCE_IMAGE[:TAG] 192.168.1.11/library/IMAGE[:TAG]
# docker push 更改tag后的镜像名
docker push 192.168.1.11/library/IMAGE[:TAG]
5.登录web页面查看镜像
查看上传的镜像。 6.拉取上传到Harbor的镜像
docker pull 192.168.1.11/track/busybox:latest
13、Docker数据卷
数据卷的作用
1:持久化容器运行过程中产生的数据文件
2:实现多个容器间的文件共享。
容器数据持久化
1、数据卷:将本地磁盘文件或文件夹挂载到容器里
-v /dest
-v src:dst [ro]|[rw]
docker run -it --name mynginx1 -v /data/nginx:/etc/nginx/conf.d nginx
2、数据卷容器:将外部容器分享给容器
--volumes-from
数据卷容器专门用来挂载数据卷的容器,以供其他容器引用和使用
docker run -it --volumes-from mynginx1 --name mynginx2 nginx 3、数据卷管理命令
docker volume create 创建数据卷
docker volume ls 查看数据卷
docker volume inspect 查看数据卷的属性
docker volume rm 删除数据卷
一个容器的volume可以被多个容器同时共享,当容器被删除时,volume不会被自动删除,需要手动来删除。
关于Docker清理
ocker system df: 查看Docker的磁盘使用情况
docker images 列出docker镜像
docker ps 列出docker容器
docker volume ls 列出docker数据卷
docker network ls 列出docker网络
docker info 列出容器镜像的数量以及一些docker 安装等系统信息。 docker system prune 清除未使用的数据与进程,默认没有清除数据卷的功能 docker container prune 清除停止的容器;
docker volume prune 清除未使用的数据卷;
docker image prune 清除未使用的镜像; docker container rm $(docker container ls -a -q) / docker rm $(docker ps -a -q); 清除容器
docker image rm $(docker images ls -a -q); 清除镜像
docker volume rm $(docker volume ls -q); 清除数据卷
docker network rm $(docker network ls -q); 清除网络
docker rm $(docker ps -a -q) 删除所有已经停止的容器;
docker rmi $(docker images -q -f dangling=true) 删除未打标签的镜像
学习Docker(二)的更多相关文章
- Docker学习(二): 镜像的使用与构建
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- docker学习笔记二:常用命令
docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...
- Docker学习笔记二(linux下安装Docker)
Docker学习笔记二(linux下安装Docker) 1.在线安装linux Docker 这种方式首先要保证linux 环境下可以上网,当然,小编是在自己的电脑上安装了虚拟机,在虚拟机上安装了,l ...
- 【Docker学习之二】Docker部署安装
环境 docker-ce-19.03.1-3.el7.x86_64 一.Docker的部署安装 Docker采用Linux(内核)技术,所以只能运行在Linux上,官方说Linux kernel至少3 ...
- 从零开始学习 Docker
这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...
- Alibaba Nacos 学习(二):Spring Cloud Nacos Config
Alibaba Nacos 学习(一):Nacos介绍与安装 Alibaba Nacos 学习(二):Spring Cloud Nacos Config Alibaba Nacos 学习(三):Spr ...
- 从零开始学习docker之在docker中搭建redis(集群)
docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...
- jackson学习之二:jackson-core
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
随机推荐
- 为什么用Python,高级的Python是一种高级编程语言
Python特性 如果有人问我Python最大的特点是什么,我会毫不犹豫地告诉他:它简单易学,功能强大.作为一个纯自由软件,Python有许多优点: 很简单.基于"优雅".&quo ...
- 【基础知识】cache 管线(Pipeline)的建立便可以提升cpu的性能,为什么还要去发展多核的cpu?
多管线 (Pipeline)的确可以提高主频,比如搭配 NetBurs架构的Pentium4,它拥有20级的管线技术,虽然可以轻易提高主频,但是效率会降低.而且随着频率的上升,功率也大幅上升温度问题也 ...
- win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动
问题:win7重装系统中强制重启导致硬盘无法识别,开机后无法选择使用u盘启动盘启动,电脑黑屏,将硬盘拆掉可以使用u盘启动,使用SATA转接口在win7中有反应但无法识别 无法识别原因:重装系统过程中断 ...
- VS常用的快捷键
整理代码 Ctrl+k+f 注释 Ctrl+k+c 取消注释 Ctrl+k+u 帮助文档 F1 无调试启动 ...
- laravel8 登录功能的实现
1.选择合适的框架,渲染出如上图所示的登录视图,视图有样式即可,可使用BootStrap或layUI去布局实现(10分) 2.正确显示出验证码(10分) 3.验证码要求无杂点.无干扰线,4位纯数字(1 ...
- php 23种设计模式 - 命令模式
命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...
- 全面解读 AWS Private 5G 的革新理念
目录 目录 目录 前言 近几年 AWS 在 5G ICT 领域的部署 AWS 与 Verizon 合作推出的 Private MEC 解决方案 AWS 与 Vodafone Business 合作推出 ...
- Ubuntu20.04安装RabbitMQ
本博客旨在自我学习使用,如有任何疑问请及时联系博主 安装erlang 由于RabbitMq需要erlang语言的支持,在安装RabbitMq之前需要安装erlang sudo apt-get inst ...
- 洛谷P1162—填涂颜色
这应该是是第一次记录洛谷题库里的题目吧: 题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \ ...
- 6月7日 python 复习 collections
collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>> ...