当前位置: 首页 > news >正文

容器编排学习(二)镜像制作和私有仓库介绍

一 Dockerfile

1  概述

commit的局限

  • 很容易制作简单的镜像,但碰到复杂的情况就十分不方便例如碰到下面的情况
  • 需要设置默认的启动命令
  • 需要设置环境变量
  • 需要指定镜像开放某些特定的端口

Dockerfile就是解决这些问题的方法

Dockerfile是一种更强大的镜像制作方式

编写类似脚本的 Dockerfile 文件,通过该文件制作镜像

2  使用

  • 创建编写 Dockerfile
  • 制作镜像

docker build -t 镜像名称:标签 Dockerfile所在目录

3  指令说明

指令说明
FROM指定基础镜像(唯一)
RUN在容器内执行命令,可以写多条
ADD把文件拷贝的容器内,如果文件是 tar.xx 格式,会自动解压
COPY把文件拷贝的容器内,不会自动解压
ENV设置启动容器的环境变量
WORKDIR设置启动容器的默认工作目录(唯一)
CMD容器默认的启动参数(唯一)
ENTRYPOINT容器默认的启动命令(唯一)
USER启动容器使用的用户(唯一)
EXPOSE使用镜像创建的容器默认监听使用的端口号/协议

4  制作 

什么是上帝进程?

简单的说就是系统创建之初产生的第一个进程

特点:

  • 没有父进程,PID == 1l
  • 是所有程序的根进程
  • 上帝进程死亡系统实例也就关闭了

容器有没有上帝进程?

  • 容器的启动进程就是上帝进程
  • 如果容器的启动进程关闭等同于容器关闭

容器的启动进程能否放在后台运行?

  • 后台进程的本质是向系统托管进程服务
  • 容器没有操作系统,所以无法实现进程托管
  • 如果强行把容器的启动进程放后台,将导致容器直接关闭
  • 容器的启动进程必须放在前台运行

5  语法案例

语法案例(1)

# 编写 Dockerfile
[root@docker ~]# mkdir myimg
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
CMD  ["/bin/ls", "-l"]
# 创建镜像
[root@docker ~]# docker build -t img1:latest myimg
......
Successfully tagged img1:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
img1         latest    9278f72f8cb1   5 seconds ago   249MB
mylinux      latest    e3b3d26bf0da   21 hours ago    249MB
rockylinux   8.5       210996f98b85   13 months ago   205MB
# 创建容器
[root@docker ~]# docker run -it --rm img1:latest
total 48
lrwxrwxrwx   1 root root    7 Oct 11  2021 bin -> usr/bin
drwxr-xr-x   5 root root  360 Feb  5 04:21 dev
drwxr-xr-x   1 root root 4096 Feb  5 04:21 etc
drwxr-xr-x   2 root root 4096 Oct 11  2021 home
......
# 传递参数命令,覆盖 CMD 执行
[root@docker ~]# docker run -it --rm img1:latest id
uid=0(root) gid=0(root) groups=0(root)

语法案例(2)

ENTRYPOINT一定会执行,CMD 可以通过传递参数覆盖

# ENTRYPOINT 与 CMD 执行方式为 ${ENTRYPOINT} ${CMD}
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
ENTRYPOINT ["echo"]
CMD  ["/bin/ls", "-l"]
# 创建镜像
[root@docker ~]# docker build -t img2:latest myimg
......
Successfully tagged img2:latest# CMD 做为参数传递,在容器内执行了 echo '/bin/ls -l'
[root@docker ~]# docker run -it --rm img2:latest 
/bin/ls -l# CMD 被替换,在容器内执行了 echo id
[root@docker ~]# docker run -it --rm img2:latest id
id

语法案例(3)

# 制作测试文件
[root@docker ~]# tar -cf myimg/myfile.tar -C /etc hosts issue
# 编辑Dockerfile
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
COPY myfile.tar /var/tmp/
ADD  myfile.tar /tmp/
RUN  id && touch /tmp/file1
USER nobody
RUN  id && touch /tmp/file2
ENV  mymsg="Hello World"
WORKDIR /tmp
CMD  ["/bin/bash"]# 创建镜像
[root@docker ~]# docker build -t img3:latest myimg
......
Successfully built eb8b669cbe7c
Successfully tagged img3:latest# 运行测试
[root@docker ~]# docker run -it --rm img3:latest
# 使用 COPY 进来的文件还是 tar 包
bash-4.4$ tree /var/tmp
/var/tmp
`-- myfile.tar
# 使用 ADD 添加的文件已经被解压了
bash-4.4$ tree /tmp
/tmp
|-- hosts
`-- issue# USER 指令设置使用 nobody 用户运行容器
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
# USER 指令前创建的文件是 root 权限,之后是 USER 用户权限
bash-4.4$ ls -l /tmp/file? 
-rw-r--r-- 1 root   root   0 Feb  5 05:25 /tmp/file1
-rw-r--r-- 1 nobody nobody 0 Feb  5 05:25 /tmp/file2# 环境变量可以直接调用
bash-4.4$ echo ${mymsg}  
Hello World
# WORKDIR 把工作目录设置到 /tmp
bash-4.4$ pwd
/tmp

二  镜像制作实战

1  apache镜像

创建一个可以解析 php 页面的 httpd 镜像

设置默认首页为 Welcome to The Apache

添加php 测试页面info.php

设置默认的工作目录到 /var/www/html

准备配置文件

[root@docker ~]# mkdir httpd
# 设置测试页面
[root@docker ~]# echo 'Welcome to The Apache.' >httpd/index.html
[root@docker ~]# cp -a info.php httpd/
[root@docker ~]# tar czf httpd/myweb.tar.gz -C httpd index.html info.php
# 获取配置文件
[root@docker ~]# docker run -itd --name myweb mylinux:latest
[root@docker ~]# docker exec -it myweb dnf install -y httpd
[root@docker ~]# docker cp myweb:/etc/httpd/conf.modules.d/00-mpm.conf httpd/
[root@docker ~]# docker rm -f myweb
# 修改配置文件
[root@docker ~]# sed -ri -e 's,^Load.*,#&,' -e 's,^#(.*mod_mpm_prefork.so)$,\1,' httpd/00-mpm.conf

制作镜像

# 编写 dockerfile 文件
[root@docker ~]# vim httpd/Dockerfile
FROM mylinux:latest
RUN  dnf install -y httpd php && dnf clean all
ADD  myweb.tar.gz /var/www/html/
COPY 00-mpm.conf /etc/httpd/conf.modules.d/
ENV  LANG=C
WORKDIR /var/www/html/
EXPOSE 80/tcp
CMD  ["/usr/sbin/httpd", "-DFOREGROUND"][root@docker ~]# docker build -t httpd:latest httpd
......
Successfully tagged httpd:latest

验证镜像

# 查看镜像并创建容器
[root@docker ~]# docker images httpd:latest
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
httpd        latest    c1e854cde1f4   About a minute ago   299MB
[root@docker ~]# docker run -itd --name myweb httpd:latest
cc2b82ad0367172c344c7207def94c4c438027c60859e94883e440b53a860a93# 查看容器地址并访问验证
[root@docker ~]# docker inspect myweb |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.2/info.php
<pre>
Array
([REMOTE_ADDR] => 172.17.0.1[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.61.1[REQUEST_URI] => /info.php
)
php_host:   2fbc8c132f7f
1229
[root@docker ~]# docker rm -f myweb

2  nginx镜像

在容器内编译 Nginx不方便,我们可以在真机编译 Nginx,然后把编译好的二进制打包部署在容器内

# 安装编译工具和依赖软件包
[root@docker ~]# dnf install -y openssl-devel pcre-devel gcc make 
# 编译安装
[root@docker ~]# tar zxf nginx-1.22.1.tar.gz 
[root@docker ~]# cd nginx-1.22.1/
[root@docker nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module
[root@docker nginx-1.22.1]# make && make install
# 设置默认首页
[root@docker nginx-1.22.1]# echo 'Nginx is running !' >/usr/local/nginx/html/index.html

制作镜像

注意:nginx 服务不能托管在后台运行

[root@docker ~]# mkdir nginx
# 将编译好的 nginx 打包,这里必须使用相对路径
[root@docker ~]# tar czf nginx/nginx.tar.gz -C /usr/local nginx
[root@docker ~]# vim nginx/Dockerfile 
FROM mylinux:latest
RUN  dnf install -y pcre openssl && dnf clean all
ADD  nginx.tar.gz /usr/local/
ENV  PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
EXPOSE 80/tcp
CMD  ["nginx", "-g", "daemon off;"][root@docker ~]# docker build -t nginx:latest nginx
Successfully tagged nginx:latest

验证镜像

# 查看镜像并创建容器
[root@docker ~]# docker images nginx:latest
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    645dd2d9a8ec   3 minutes ago   274MB
[root@docker ~]# docker run -itd --name myweb nginx:latest
e440b53a860a93cc2b82ad0367172c344c7207def94c4c438027c60859e94883# 查看容器地址并访问验证
[root@docker ~]# docker inspect myweb |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.2/
Nginx is running !# 查看 nginx 服务的用户
# nginx 服务为了提高安全性,在启动之后默认会使用nobody 用户对外提供服务
[root@docker ~]# docker exec -it myweb ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 15:48 pts/0    00:00:00 nginx: master process nginx 
nobody         7       1  0 15:48 pts/0    00:00:00 nginx: worker process
root          32       0  0 15:49 pts/1    00:00:00 ps -ef[root@docker ~]# docker rm -f myweb

3  php-fpm镜像

按照下面的要求创建php-fpm镜像

  • php-fpm 服务监听地址为 127.0.0.19000
  • php-fpm 使用和 nginx 相同的普通用户运行完成镜像制作,并验证

准备配置文件

获取并修改php-fpm配置文件

使用nobody 用户启动运行 php-fpm 服务

# 获取配置文件
[root@docker ~]# mkdir php
[root@docker ~]# docker run -itd --name myphp mylinux:latest
[root@docker ~]# docker exec -it myphp dnf install -y php-fpm
[root@docker ~]# docker cp myphp:/etc/php-fpm.d/www.conf php/
[root@docker ~]# docker rm -f myphp
# 修改配置文件
[root@docker ~]# sed -ri 's,^(listen = ).*,\1127.0.0.1:9000,' php/www.conf

制作镜像

# 编写 dockerfile 文件
[root@docker ~]# vim php/Dockerfile
FROM mylinux:latest
RUN  dnf install -y php-fpm && dnf clean all && \mkdir -p /run/php-fpm /usr/local/nginx/html && \chown -R nobody.nobody /run/php-fpm /var/log/php-fpm /usr/local/nginx/html
COPY www.conf /etc/php-fpm.d/www.conf
USER nobody
WORKDIR /usr/local/nginx/html
EXPOSE 9000/tcp
CMD ["/usr/sbin/php-fpm", "--nodaemonize"][root@docker ~]# docker build -t php-fpm:latest php
Successfully tagged php-fpm:latest

验证镜像

# 查看镜像并创建容器
[root@docker ~]# docker images php-fpm:latest
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
php-fpm      latest    b2404bd119b0   48 seconds ago   275MB
[root@docker ~]# docker run -itd --name myphp php-fpm:latest
6eeff6af4a6469c298944b2bdd2ba69f32ebcbc6cb683a0a05af4eefbf90e8c1# 验证服务
[root@docker ~]# docker exec -it myphp /bin/bash
# 验证用户
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
# 我们无法直接调用 php 服务,可以通过查看进程验证服务
bash-4.4$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
nobody         1       0  0 16:13 pts/0    00:00:00 php-fpm: master process (/etc/php-fpm.conf)
nobody         7       1  0 16:13 pts/0    00:00:00 php-fpm: pool www
nobody         8       1  0 16:13 pts/0    00:00:00 php-fpm: pool www
nobody         9       1  0 16:13 pts/0    00:00:00 php-fpm: pool www
nobody        10       1  0 16:13 pts/0    00:00:00 php-fpm: pool www
nobody        11       1  0 16:13 pts/0    00:00:00 php-fpm: pool www
nobody        12       0  0 16:13 pts/1    00:00:00 /bin/bash
nobody        19      12  0 16:13 pts/1    00:00:00 ps -ef
bash-4.4$ exit[root@docker ~]# docker rm -f myphp

三  docker私有仓库

1  概述

私有仓库是存储 docker image 的仓库

管理了一个 docker 集群,在所有节点维护镜像的一致性是一个非常麻烦繁琐的任务,使用公共仓库,我们又无法控制仓库中的镜像、版本等数据,私有仓库就是解决这些问题的最佳方法。

用户只需要维护私有仓库里面的镜像即可,docker 客户端可以通过私有仓库创建容器服务。

主流仓库有 docker Registry 和 vmware HarborRegistry 提供了仓库的核心功能,包括分层传输机制、WEB接口等功能

Habor 是在 Registry 上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:提供 WEB界面,优化用户体验,支持登陆、搜索功能,区分公有、私有镜像,以及基于角色的访问控制,集成日志审计、支持水平扩展等功能

2  原理

 

3  安装部署

主机清单

主机名ip地址最低配置
registry192.168.1.352CPU,4G内存

registry安装部署

# 在 registry 上安装私有仓库
[root@registry ~]# dnf install -y docker-distribution
# 启动私有仓库,并设置开机自启动
[root@registry ~]# systemctl enable --now docker-distribution

4  管理

<1> 概述

仓库配置文件及数据存储路径

  • /etc/docker-distribution/registry/config.yml
  • /var/lib/registry
  • 默认端口号5000

查看私有镜像仓库中的镜像名称或标签

  • 名称: curl http://仓库IP:端口/v2/ catalog
  • 标签: curl http://仓库IP:端口/v2/镜像路径/tags/list

如何让Docker知道私有仓库的地址?

配置文件 /etc/docker/daemon.json

核心参数

镜像仓库地址     [ "registry-mirrors":["http://registry:5000" ]

私有仓库地址     [ "insecure-registries":["registry:5000" ]

<2> 案列

配置私有仓库上传镜像 nginx到仓库 img 目录下 myimg:web
上传镜像php-fpm到仓库img目录下myimg:php-fpm
上传镜像 httpd 到仓库 library 目录下httpd:latest
上传镜像mylinux到仓库library 目录下mylinux:latest
运行容器删除所有容器和镜像分别使用 img/myimg:web 和 library/httpd:latest 创建容器
访问验证

客户端配置

所有node节点都需要配置

[root@docker ~]# vim /etc/hosts
192.168.1.35    registry
# 修改配置文件
[root@docker ~]# vim /etc/docker/daemon.json
{"registry-mirrors": ["http://registry:5000"],"insecure-registries":["registry:5000"]
}
# 重启服务生效
[root@docker ~]# systemctl restart docker

上传镜像

  • 使用 docker tag 通过标签设置上传地址和路径
  • 使用 docker push 上传镜像
# 给 nginx 镜像设置标签
[root@docker ~]# docker tag  nginx:latest registry:5000/img/myimg:web
# 上传 nginx 镜像
[root@docker ~]# docker push registry:5000/img/myimg:web
The push refers to repository [registry:5000/img/myimg]
c9d01852a13b: Pushed 
......
web: digest: sha256:3e1fc9ad1ee46ee4619c95dc9d71034d919e53abfc size: 952# 上传 php-fpm 镜像
[root@docker ~]# docker tag  php-fpm:latest registry:5000/img/myimg:php-fpm
[root@docker ~]# docker push registry:5000/img/myimg:php-fpm
The push refers to repository [registry:5000/img/myimg]
619c95dc93e1: Pushed 
......
php-fpm: digest: sha256:619c95dc93e1fc9ad1ee46ee4d71034d919e53abfc size: 875# 上传 httpd 镜像 
[root@docker ~]# docker tag  httpd:latest registry:5000/library/httpd:latest
[root@docker ~]# docker push registry:5000/library/httpd:latest
The push refers to repository [registry:5000/library/httpd]
95dc9d71034d: Pushed
......
latest: digest: sha256:95dc9d71034d919e53abfc3e1fc9ad1ee46ee4619c size: 968

验证测试

查看镜像名称: curl http://仓库IP:5000/v2/_catalog
查看镜像标签: curl http://仓库IP:5000/v2/镜像路径/tags/list
使用易读格式: python3 -m json.tool

# 查看仓库中所有镜像的名称
[root@docker ~]# curl http://registry:5000/v2/_catalog
{"repositories":["img/myimg", "library/httpd"]}# 查看某一镜像的所有标签
[root@docker ~]# curl http://registry:5000/v2/img/myimg/tags/list
{"name":"img/myimg","tags":["web", "php-fpm"]}# 易读格式查看镜像名称
[root@docker ~]# curl -s http://registry:5000/v2/_catalog |python3 -m json.tool
{"repositories": ["img/myimg","library/httpd"]
}# 易读格式查看镜像标签
[root@docker ~]# curl -s http://registry:5000/v2/img/myimg/tags/list |python3 -m json.tool
{"name": "img/myimg","tags": ["php-fpm","web"]
}

 创建容器

# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
......# 删除所有镜像
[root@docker ~]# docker rmi $(docker images -q)
......# 使用仓库中的镜像运行容器
[root@docker ~]# docker run -itd --rm registry:5000/img/myimg:web
2b7cd6d88a7665dbea0a4b3d99478e9f302c0a5661d7676d6d3bd3cb6d181# library 是默认路径,可以省略路径地址
[root@docker ~]# docker run -itd --rm httpd:latest
634766f788d665dbea0a4b39709e0a2cc8624fd99478e9f302c0a5661d767

相关文章:

容器编排学习(二)镜像制作和私有仓库介绍

一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像&#xff0c;但碰到复杂的情况就十分不方便例如碰到下面的情况需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方法 Dockerfile是一种更强大的镜像制作方式…...

tcp记录

网络传输&#xff1a;大小端 Qt网络编程实现TCP通信 TCP/IP通讯与socket编程 Qt一步步搭建TcpServer1——封装QTcpServer&#xff0c;QTcpSocket qtcpserver官方文档 Python address already in use 服务器端的端口号和客户端的端口号没有关系 一般服务器是需要BIND指定端口号…...

IDEA中使用Java连接MySQL数据库的配置和使用方法

文章目录 IDE和必要配置数据库连接代码 IDE和必要配置 IDE&#xff1a;IntelliJ IDEA 2023.1 必要配置&#xff1a; 1、安装好JDK&#xff0c;并且配置环境变量 2、导入MYSQL数据库所需的驱动 如果没有导入&#xff0c;可以参考这篇文章IDEA中的MySQL数据库所需驱动包的下载和…...

android——服务JobService

JobService是Android L时候官方新增的组件&#xff0c;适用于需要特定条件才执行后台任务的场景。由系统统一管理和调度&#xff0c;在特定场景下使用JobService更加灵活和省心&#xff0c;相当于是Service的加强或者优化。 JobService是JobScheduler的回调&#xff0c;是安排的…...

一文讲清楚redis的线程池jedis

背景 在shigen实习的时候&#xff0c;遇到了日志系统的性能优化问题&#xff0c;当时的优化点就是&#xff1a;使用redis的线程池&#xff0c;实现并发状态下的性能优化。但是找了很多的技术方案&#xff0c;发现redis的线程池配置起来比较麻烦。正巧&#xff0c;这个周末shig…...

备战面试每日一题

1.如何理解this&#xff1f; this表示的是函数运行时自动生成的一个内部对象&#xff0c;只能在函数内部使用&#xff0c;总是指向调用它的对象。 this是在运行时进行绑定的&#xff0c;并不是在编写的时候绑定&#xff0c;它的上下文取决于函数调用时的各种条件。this的绑定…...

【嵌入式数据库之sqlite3】

目录 一.数据库基本概念&#xff08;理解&#xff09; 1.数据 2.数据库 二.常用的数据的数据库&#xff08;了解&#xff09; 1.大型数据库 2.中型数据库 3.小型数据库 三.基于嵌入式的数据库&#xff08;了解&#xff09; 四.SQLite基础&#xff08;了解&#xff09;…...

Android 9.0 pms中关于启动app时获取app的ActivityInfo信息相关源码分析

1.前言 在android9.0的系统rom定制化开发中,在对于app启动时,在进行系统中,通过Launcher调用pms来查询app的相关ActivityInfo的相关信息,然后调用 ams来启动activity,这篇来分析pms中获取app的ActivityInfo的相关信息的相关源码分析 2.pms中关于启动app时获取app的Activ…...

华为数通方向HCIP-DataCom H12-821题库(单选题:321-340)

第321题 BGP的Open报文是用于建立对等体连接的,以下哪一项不属于Open报文中携带的参数信息? A、发送者的Router ID B、AS号 C、BGP版本号 D、TCP端口号 答案:D 解析:以下是BGP的Open报文: 第322题 在建立BGP对等体的过程中,OpenSent状态表明BGP等待的Open报文 并对收…...

《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

目录 1--TCP/IP协议栈 2--TCP服务器端默认函数调用顺序 3--TCP客户端的默认函数调用顺序 4--Linux实现迭代回声服务器端/客户端 5--Windows实现迭代回声服务器端/客户端 6--TCP原理 7--Windows实现计算器服务器端/客户端 1--TCP/IP协议栈 TCP/IP协议栈共分 4 层&#xf…...

【每日一题】43. 字符串相乘

43. 字符串相乘 - 力扣&#xff08;LeetCode&#xff09; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例…...

机器学习——K最近邻算法(KNN)

机器学习——K最近邻算法&#xff08;KNN&#xff09; 文章目录 前言一、原理二、距离度量方法2.1. 欧氏距离2.2. 曼哈顿距离2.3. 闵可夫斯基距离2.4. 余弦相似度2.5. 切比雪夫距离2.6. 马哈拉诺比斯距离2.7. 汉明距离 三、在MD编辑器中输入数学公式&#xff08;额外&#xff0…...

同步FIFO的verilog实现(1)——计数法

一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写&#xff0c;是一种先入先出的数据缓冲器&#xff0c;与一般的存储器的区别在于没有地址线&#xff0c; 使用起来简单&#xff0c;缺点是只能顺序读写数据&#xff0c;其数据地址由内部读写指针自动加1完成&…...

python正则表达式笔记1

最近工作中经常用到正则表达式处理数据&#xff0c;慢慢发现了正则表达式的强大功能&#xff0c;尤其在数据处理工作中&#xff0c;记录下来分享给大家。 一、 正则表达式语法介绍 正则表达式&#xff08;或 RE&#xff09;指定了一组与之匹配的字符串&#xff1b;模块内的函…...

YOLO目标检测——口罩规范佩戴数据集+已标注xml和txt格式标签下载分享

实际项目应用&#xff1a;目标检测口罩佩戴检测数据集的应用场景涵盖了公共场所监控、疫情防控管理、安全管理与控制以及人员统计和分析等领域。这些应用场景可以帮助相关部门和机构更好地管理口罩佩戴情况&#xff0c;提高公共卫生和安全水平&#xff0c;保障人们的健康和安全…...

Android 13 - Media框架(9)- NuPlayer::Decoder

这一节我们将了解 NuPlayer::Decoder&#xff0c;学习如何将 MediaCodec wrap 成一个强大的 Decoder。这一节会提前讲到 MediaCodec 相关的内容&#xff0c;如果看不大懂可以先跳过此篇。原先觉得 Decoder 部分简单&#xff0c;越读越发现自己的无知&#xff0c;Android 源码真…...

23.09.5 《CLR via C#》 笔记5

第六章 类型和成员基础 类型可以定义0或多个以下成员&#xff1a;常量、字段、实例构造器、类型构造器、方法、操作符重载、转换操作符、属性、事件、类型类型的可见性分为public和internal(默认)C#中&#xff0c;成员的可访问性分为private、protected、internal、protected …...

laravel部署api项目遇到问题总结

laravel线上部署问题 一、Ubuntu远程Mysql 61“Connection refused”二、Ubuntu更新php8三、线上部署Permission denied3.1、部署完之后访问域名出现报错&#xff1a;3.2、The /bootstrap/cache directory must be present and writable. 四、图片访问404五、git部署线上文件 一…...

lintcode 1646 · 合法组合【字符串DFS, vip 中等 好题】

题目 https://www.lintcode.com/problem/1646 给一个单词s,和一个字符串集合str。这个单词每次去掉一个字母&#xff0c;直到剩下最后一个字母。求验证是否存在一种删除的顺序&#xff0c;这个顺序下所有的单词都在str中。例如单词是’abc’&#xff0c;字符串集合是{‘a’,’…...

【多线程】线程安全 问题

线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...