docker指令存档
目录
Docker
1、概念
2、架构图
3、安装
4、Docker怎么工作的?
5、Docker常用命令
帮助命令
镜像命令
1、查看镜像
2、帮助命令
3、搜索镜像
4、拉取镜像
5、删除镜像
容器命令
1、启动
2、查看运行的容器
3、删除容器
4、启动&停止
其他命令
1、后台启动容器
2、查看日志
3、查看容器内的进程信息
4、查看镜像的元数据
5、进入当前正在运行的容器
方式一
方式二
6、从容器内拷贝文件到主机上
6、小结
7、Docker安装Nginx
1、搜索镜像
2、下载镜像
3、运行镜像
4、测试
停止
流程
思考
8、Docker安装Tomcat
1、下载并启动
2、测试&问题
3、解决问题
4、再测试
思考
9、部署es&kibana
1、启动
2、查看内存状态
3、停掉
4、增加内存限制
5、测试
思考
10、可视化
1、什么是portainer?
2、测试
11、镜像
1、是什么?
2、怎么获得?
2.镜像加载原理
3、镜像层&容器层
4、提交自己的镜像
1、启动
2、进入并拷贝
3、提交镜像
12、Docker理念
持久化
同步操作
13、容器数据卷(Volume)
同步文件
1、挂载 -v
2、测试
3、反向测试
安装MySQL
1、下载
2、测试连接
具名&匿名挂载
1、匿名挂载
2、具名挂载
3、卷路径
4、判断是哪种挂载?
初识DockerFile
1、构建自己的镜像
2、匿名挂载同步查看
数据卷容器
1、容器挂载
2、删除测试
多个MySQL实现数据共享
结论
再见DockerFile
构建步骤
构建过程
DockerFile指令
实战测试
1、编写DockerFile
2、测试
查看构建历史
CMD&ENTRYPOINT
1、测试CMD
2、测试ENTRYPOINT
Tomcat镜像
Dockerfile
运行&挂载
测试
主机修改tomcat
外网访问
catalina.out
发布自己的镜像
DockerHub
阿里云
Docker流程
14、Docker网络
1、清空环境
2、查看地址
3、问题
1、启动容器并查ip
2、ping测试
启动容器后我们再次测试 ip a
再启动一个tomcat测试
绘制网络模型图
3、容器互联--link
4、自定义网络
网络模式
1、清理环境
2、创建我们自己的网络
3、启动测试我们自己的网络
4、网络连通
15、Redis集群部署实战
1、redis集群的搭建
2、停掉主机&获取值
3、查看集群节点信息
16、打包镜像
1、打包项目
2、编写Dockerfile
3、构建镜像
4、测试访问
本地测试
外网访问
Docker
1、概念

Docker核心思想:隔离,每个箱子是隔离的,打包装箱。
虚拟机技术缺点

1、资源占用多
2、冗余步骤多
3、启动慢
容器技术
容器化技术不是模拟的一个完整的操作系统。

比较Docker和虚拟机技术的不同:
-
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
-
容器内的应用直接运行在宿主机,容器是没有自己内核的,也没有虚拟我们的硬件,所以就轻便了。
-
每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
优点:

2、架构图

镜像(image):【类】
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,Tomcat镜像-->run-->tomcat1容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):【对象】
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建。目前可以把这个容器理解为就是一个简易的Linux系统。
仓库(repository):存放镜像的地方。分为共有仓库和私有仓库。
3、安装
环境准备:
1、保证系统内核在3.10以上
uname -r
我的版本:3.10.0-1160.el7.x86_64
2、查看镜像是否是centos7
cat /etc/os-release
3、进入帮助文档
Get Docker | Docker Docs
开始
1、旧版本的 Docker
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
2、需要的安装包
yum install -y yum-utils
3、\textcolor{red}{设置镜像仓库} ,解决下载慢
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
4、更新软件包索引
yum makecache fast
5、安装docker引擎(ce 社区版)
yum install docker-ce docker-ce-cli containerd.io
6、启动docker
systemctl start docker
7、通过版本号查看是否启动成功
docker version
8、测试运行
docker run hello-world

9、查看拉取的镜像
docker images

附:怎么卸载引擎?
1、卸载依赖 yum remove docker-ce docker-ce-cli containerd.io 2、删除资源 rm -rf /var/lib/docker /var/lib/docker 这个是docker的默认工作路径。
4、Docker怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!

Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层。

2、Docker利用的是宿主机的内核,vm 需要 guest os
新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载 guest os ,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级。
5、Docker常用命令
docker | Docker Docs
镜像就像手机中APP安装包,容器就像已安装的APP应用
帮助命令
1、查看版本 docker version 2、查看信息(镜像和容器的数量等) docker info 3、查看命令 docker 命令 --help
镜像命令
1、查看镜像
1、查看本地主机上所有的镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 4 weeks ago 13.3kB REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的大小 Options(选项):-a, --all # 列出所有的镜像 -q, --quiet # 只显示镜像的id
2、帮助命令
docker images --help

3、搜索镜像
搜索镜像 [root@localhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11593 mariadb MariaDB Server is a high performing open sou… 4409 mysql/mysql-server Optimized MySQL Server Docker images. Create… 857 STARS:收藏量 --filter=STARS=3000 搜索出来的镜像就是收藏量大于3000的。
过滤搜索镜像:

4、拉取镜像
下载镜像 docker pull 镜像名[:tag] # 如果不写tag,默认就是最新版本

解决下载镜像慢!
##使用阿里云镜像加速器
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
指定版本下载:
docker pull mysql:5.7

查看下载的镜像:

5、删除镜像
删除镜像:
rm:删除 i:images -f:强制删除 后面可以指定id来删除
docker rmi -f 容器id #删除指定的容器 docker rmi -f 容器id 容器id 容器id #删除多个容器 docker rmi -f $(docker images -aq) #删除全部的容器

容器命令
前提:必须有镜像才能创建容器,我们来下载一个centos镜像来测试学习。
docker pull centos

1、启动
docker run [可选参数] image /bin/bash # 参数说明 --name="Name" 容器名称 Tomcat01 Tomcat02 用来区分容器 -d 后台方式运行 -it 使用交互方式(需要给定控制台)运行,进入容器查看内容 -p 指定容器的端口(四种方式)-p ip:主机端口:容器端口-p 主机端口:容器端口(常用)-p 容器端口-p 随机指定端口
通过启动镜像进入容器:
/bin/bash:这个是指定的控制台
docker run -it centos /bin/bash

查看容器内的centos并退出:
exit # 从容器中退回主机 Ctrl + P + Q # 容器不停止退回主机


2、查看运行的容器
1、查看运行中的容器 docker ps 2、查看运行过的容器 docker ps -a 3、查看最近运行的容器 docker ps -a -n=1 4、查看当前所有容器的编号 docker ps -aq

3、删除容器
docker rm 容器id # 删除指定的容器 ,不能删除正在运行的容器,如果要强制删除,rm -f docker rm -f $(docker ps -aq) # 删除所有的容器 docker ps -a -q|xargs docker rm #删除所有的容器
xargs 作用:将上个命令的输出作为参数传给 docker rm 这个命令

4、启动&停止
注意:这里跟之前的 docker run [可选参数] image /bin/bash 不同,之前是第一次,没有容器id。
\textcolor{red}{启动容器后,还是在主机,并没有进入容器} !
docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前容器

其他命令
1、后台启动容器
# 命令docker run -d 镜像名 docker run -d centos

出现问题:
我们使用命令 docker ps 后,发现 centos 停止了。
\textcolor{blue}{常见的坑} :docker 容器使用后台运行,就必须要有一个前台进程,因为docker发现没有应用,就会自动停止。
例如安装Nginx:容器启动后,docker发现自己没有提供服务,就会立刻停止,就是没有程序了。
2、查看日志
# 自己编写一段shell脚本 docker run -d centos /bin/sh -c "while true;do echo giegie;sleep 1;done" # 显示日志 --tf # 显示日志 f:跟踪日志(实时显示) t:时间戳(timestamps) --tail number # 要显示的尾部日志条数 [root@localhost ~]# docker logs -tf --tail 10 4b121dd5bc49

3、查看容器内的进程信息
[root@localhost ~]# docker top 4b121dd5bc49 UID PID PPID C STIME TTY TIME CMD root 70910 70890 0 20:52 ? 00:00:00 /bin/sh -c while true;do echo giegie;sleep 1;done root 73560 70910 0 21:14 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
UID:用户id
PID:当前进程id
PPID:父进程id
4、查看镜像的元数据
docker inspect 容器id

5、进入当前正在运行的容器
我们通常使用的容器是由后台方式运行的,所以需要进入容器内来修改一些配置。
方式一
docker exec:\textcolor{red}{进入容器后开启一个新的终端,可以在里面操作(常用)} 。
# exec -it 前后台交互执行 docker exec -it 容器id /bin/bash

方式二
docker attach:\textcolor{red}{进入容器正在执行的终端,不会启动新的进程} 。
docker attach 容器id

6、从容器内拷贝文件到主机上
拷贝是一个手动过程,未来我们使用 -v 卷 的技术,可以实现。
docker cp 容器id:容器内路径 目的的主机路径

6、小结

7、Docker安装Nginx
1、搜索镜像
docker search nginx
2、下载镜像
docker pull nginx
3、运行镜像
# 先查看镜像 docker images # 取别名后运行 docker run -d --name nginx01 -p 3344:80 nginx

4、测试
1、本地测试
curl localhost:3344

2、外网测试(通过互联网)

停止

流程

思考
我们每次改动Nginx配置文件,都需要进入容器内部?这就十分的麻烦,我们通过在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部就可以自动修改。 -v 数据卷!
8、Docker安装Tomcat
我们之前的启动都是后台,停止容器之后,容器还是可以查到的
# 官方的使用,下载下来,运行后,就删除容器了(镜像还在) docker run -it --rm tomcat:9.0


1、下载并启动
# 下载最新的Tomcat docker pull tomcat # 通过虚拟机端口3355映射内部tomcat端口8080,启动tomcat镜像来启动tomcat容器,取名为tomcat01 docker run -d -p 3355:8080 --name tomcat01 tomcat

2、测试&问题
首先进入网站测试,404。之后我们进入容器:
docker exec -it tomcat01 /bin/sh
进入容器内发现问题:
1、Linux命令少了。
2、没有webapps。

原因:阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除出去了。它是保证最小的可运行环境。
3、解决问题
将webapps.dist的内容全部拷贝到webapps里面。
cp -r webapps.dist/* webapps

4、再测试

思考
我们以后部署项目,每次都要进入容器,十分麻烦。我们要是可以在容器外提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。
9、部署es&kibana
es:暴露的端口多,而且十分耗内存,它的数据一般需要放置到安全目录,挂载。
官网启动弹性搜索(elasticsearch)
# --net somenetwork:网络配置,暂时不需要 docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
1、启动
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

CPU资源有限,所以可能会卡。

2、查看内存状态
docker stats

3、停掉

4、增加内存限制
# 修改配置文件 -e 环境配置修改 docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

5、测试

思考
使用kibana怎么用网络连接到es?

10、可视化
portainer和Rancher(CI/CD)
1、什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作。
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、测试
外网测试:
http://192.168.85.129:8088/


内网测试:
curl localhost:8088
11、镜像
1、是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、环境变量、配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
2、怎么获得?
1、从远程仓库下载
2、从朋友拷贝过来
3、自己制作DockerFile
#####
1、UnionFS

2.镜像加载原理

bootfs(文件加载系统):就像我们启动电脑->加载->界面,界面加载完成后,不需要加载了。

阉割版

资源复用

3、镜像层&容器层


4、提交自己的镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
1、启动
# 启动一个默认的tomcat docker run -it -p 8080:8080 tomcat

2、进入并拷贝
# 发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的!我们自行拷贝文件。 注意:这里新开了一个shell,之前的tomcat不要关闭了。

3、提交镜像
# 将我们操作过的容器通过commit提交为一个镜像,我们以后就使用这个我们修改过的镜像即可。 docker commit -a="gay" -m="add webapps app" 709df7e3e649 tomcat02:1.0

提交容器id后,在镜像中能看到新的镜像。也就是当前容器的状态!
类似于虚拟机里面的快照,可以回滚。

12、Docker理念
将应用和环境打包成一个镜像。
持久化
如果数据都在容器中,那么我们容器删除,数据就会丢失。
\textcolor{red}{需求:数据可以持久化} 。
MySQL的容器删了,删库跑路?
\textcolor{red}{需求:MySQL的数据可以存储在本地} 。
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地!这就是卷技术,\textcolor{red}{目录的挂载} ,将我们容器内的目录挂载到Linux虚拟机上面。
同步操作

13、容器数据卷(Volume)
容器的\textcolor{red}{持久化} 和\textcolor{red}{同步操作} ,容器间也是可以数据共享的。
方式一
同步文件
1、挂载 -v
# 直接使用命令来挂载 -v 通过主机目录映射容器内目录 docker run -it -v 主机目录:容器内目录 镜像 /bin/bash # 测试:挂载到主机后进入容器 [root@localhost home]# docker run -it -v /home/ceshi:/home centos /bin/bash

查看
# 在主机上查看上面的那个容器详情 docker inspect 容器id

理解成在主机上创建了一个快捷方式,那么容器没了,主机上的那个也就没啥用了,跟着没了。有点不同的是,它文件内容是双向绑定的!
2、测试
在容器内建一个文件,测试主机上是否也生成一个对应的文件

3、反向测试
在主机内修改文件,已经退出的容器依旧可以获取到文件内容!
# exit 退出并停止容器 # ctrl + p + q 退出不会停止容器

好处:\textcolor{red}{我们以后修改只需要在本地修改即可,容器内会自动同步} !
安装MySQL
1、下载
# 获取镜像 [root@localhost home]# docker pull mysql:5.7 # 运行容器,需要做数据挂载 # -d:后台运行 -p:端口映射 -v:卷挂载 -e:环境配置 --name:容器别名 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

2、测试连接
本地使用Navicat连接

本地新建一个数据库,去Linux上面查看

假设我们将主机上的容器删除,我们挂载到本地的数据卷依旧存在,这就实现了容器的持久化功能。
相当于只删除了一个快捷方式而已。

具名&匿名挂载
1、匿名挂载
# 匿名挂载 -v 容器内路径! -P 随机映射端口(注:p是大写的) docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有的volume的情况 docker volume ls

2、具名挂载
# 具名挂载 -v 卷名:容器内路径 区别之前我们是: -v /xx/xx:/xx/xx docker run -d -P --name nginxginx02 -v juming-nginx:/etc/nginx nginx # 查看一下这个卷 docker volume inspect juming-nginx

3、卷路径
所有的docker容器内的卷,没有指定目录的情况下都是在
/var/lib/docker/volumes/xxxx/_data

4、判断是哪种挂载?
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载? # 1、匿名挂载 -v 容器内路径 # 2、具名挂载 -v 卷名:容器内路径 # 3、指定路径挂载 -v /宿主机路径:容器内路径 拓展: # 通过 -v 容器内路径:ro rw 改变读写权限 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。 ro: readonly #只读 rw: readwrite #可读可写,默认是这个 # 一旦设置了容器权限,那么容器对我们挂载出来的内容就有限定了。 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
初识DockerFile
方式二
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,所以脚本是一个一个的命令,每个命令都是一层。
1、构建自己的镜像
# 创建一个dockerfile文件,名字可以随机,建议DockerFile [root@localhost docker-test-volume]# cat dockerfile1 FROM centos # -f:文件的地址 -t:生成的镜像名 构建,在哪里呢?名字呢? [root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t chenjun/centos:1.0 . # 文件中内容,注意VOLUME之后要有个空格。指令(大写)参数,这里的每个命令,就是镜像的一层,这种是匿名挂载 FROM centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash
将chenjun/contos:1.0挂载到cenos(即FROM centos)

2、匿名挂载同步查看

数据卷容器

1、容器挂载
通过我们刚才写的自己的镜像来启动三个容器 docker run -it --name docker01 容器id或者自己取的容器名 # --volumes-fom:将docker02挂载到docker01上面 docker run -it --name docker02 --volumes-fom docker01 容器id或者自己取的容器名

docker03挂载到docker01上面

2、删除测试
哪怕你删除了docker01,其他两个不会收到影响, --volumes-fom 类似于备份一样。他们都是挂载到宿主机上面了!
区别于之前的挂载,那是一种类似创建快捷方式(双向、共享),!
注意:容器需要先启动,你才能通过 exec -it 或者 attach 进入。

多个MySQL实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
结论
容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地(-v),这个时候,本地的数据是不会删除的。
再见DockerFile
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
构建步骤
-
1、编写一个DockerFile文件
-
2、docker build 构建成为一个镜像
-
3、docker run 运行镜像
-
4、docker pull 发布镜像(DockerHub、阿里云镜像仓库!)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像。
构建过程
-
1、每个保留关键字(指令)都必须是大写字母
-
2、从上到下的顺序执行
-
3、# 表示注释
-
4、每一个指令都会创建提交一个新的镜像层,并提交!

DockerFile是面向开发的,我们以后需要发布项目,做镜像,就需要编写DockerFile文件。Docker镜像逐渐成为企业交付的标准。
DockerFile:构建文件,定义了一切的步骤,源代码。
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品。
Docker容器:容器就是镜像运行起来提供服务器。
DockerFile指令
通过DockerFile指令,我们可以自己写镜像!
FROM # 基础镜像,一切从这里构建 centos MAINTAINER # 镜像是谁写的,姓名+邮箱 RUN # 镜像构建时需要运行的命令 ADD # 步骤:tomcat镜像,这个tomcat压缩包,添加内容 WORKDIR # 镜像的工作目录 例如:/bin/bash VOLUME # 挂载的目录 EXPOSE # 暴露端口配置 CMD # 指定这个容器启动时需要运行的命令,只有最后一个会生效,可被替代。 ENTERYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承DockerFile时,就会运行ONBUILD的指令,触发指令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量

实战测试
1、编写DockerFile
# 编写一个自己的DockerFile文件 echo:输出 在原有的centos上写自己的镜像。 FROM centos MAINTAINER chenjun<1318593513@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum install -y vim RUN yum install -y net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash # 构建 -f:DockerFile文件路径 -t:镜像名:[tag] docker build -f mydockerfile-centos -t mycentos:0.1 .
原本是没有vim命令的,现在我们给他装上。

2、测试

查看构建历史
这个查看历史可以方便我们查看别的镜像是怎么构建的!!!
[root@localhost docker-file]# docker history 镜像id

CMD&ENTRYPOINT
CMD # 指定这个容器启动时需要运行的命令,只有最后一个会生效,可被替代。 ENTERYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
1、测试CMD
vim dockerfile-cmd-test # 建文件 FROM centos CMD ["ls","-a"] # 构建DockerFile,即自己的镜像 docker build -f dockerfile-cmd-test -t cmdtest . # 运行,这里的镜像没有版本号,所以不用加 docker run -it cmdtest

替换,不可追加!
[root@localhost docker-file]# docker run -it cmdtest -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. ERRO[0000] error waiting for container: context canceled # cmd的情况下,-l 替换了CMD["ls","-a"]命令,-l不是命令,所以报错了。

2、测试ENTRYPOINT
可追加!
vim dockerfile-cmd-entrypoint # 建文件 FROM centos ENTRYPOINT ["ls","-a"] # 构建DockerFile,即自己的镜像 docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .

Tomcat镜像
-
1、准备镜像文件 tomcat 压缩包,jdk 的压缩包。

-
2、编写DockerFile文件,官方命名\textcolor{red}{Dockerfile} ,build会自动寻找这个文件,就不用 -f 去指定了。
-
3、构建生成的目标镜像 docker build -t diytomcat . 这个 diytomcat 就是我们的镜像!

Dockerfile
FROM centos MAINTAINER chenjun<1318593513@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.22.tar.gz /usr/local/ RUN yum install -y vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
运行&挂载
[root@localhost tomcat]# docker run -d -p 9090:8080 --name chenjuntomcat -v /home/chenjun/build/tomcat/test://usr/local/apache-tomcat-9.0.22/webapps/test -v /home/chenjun/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.22/logs diytomcat

测试

主机修改tomcat

web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> </web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>
外网访问

catalina.out
[root@localhost tomcatlogs]# pwd /home/chenjun/build/tomcat/tomcatlogs# 查看多少人访问了我们的这个服务器 [root@localhost tomcatlogs]# cat catalina.out
发布自己的镜像
DockerHub
-
1、地址:https://hub.docker.com/ 注册自己的账号
-
2、登录:docker login -u jc110
-
3、标签:docker tag 镜像id jc110/tomcat:1.0
-
4、推送:docker push jc110/tomcat:1.0
DockerHub


阿里云
阿里云镜像服务
-
1、登录阿里云
-
2、找到容器镜像服务
-
3、创建命名空间
-
4、创建容器镜像
-
5、docker登录后推送
$ docker login --username=jc_s**** registry.cn-hangzhou.aliyuncs.com $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/gay/gaytest:[镜像版本号] $ docker push registry.cn-hangzhou.aliyuncs.com/gay/gaytest:[镜像版本号]


报错:
Error response from daemon: Get "https://registry.cn-hangzhou.aliyuncs.com/v2/": unauthorized: authentication required
解决:

登录
docker login --username=jc_study registry.cn-hangzhou.aliyuncs.com


查看

Docker流程
docker save保存的是镜像(image),docker export保存的是容器(container)。
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像。



14、Docker网络
1、清空环境
# 我们先删除所有的容器和镜像 # 强制删除所有的容器 [root@localhost ~]# docker rm -f $(docker ps -aq) # 强制删除所有的镜像 [root@localhost ~]# docker rmi -f $(docker images -aq)


2、查看地址
# 查看地址 ip a 或者 ip addr 或者 ifconfig [root@localhost ~]# ip a

3、问题
docker是如何处理容器网络访问的?

1、启动容器并查ip
# 拉取并通过后台运行tomcat镜像来启动容器 [root@localhost ~]# docker run -d -P --name tomcat01 tomcat# 查看容器的内部网络地址 ip addr [root@localhost ~]# docker exec -it tomcat01 ip addr
遇到问题:
# docker exec -it tomcat01 ip addr错误docker没有ip指令 OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown
解决问题:
# 进入容器执行 apt-get update & apt-get install -y iproute2 root@93989b839391:/usr/local/tomcat# apt-get update & apt-get install -y iproute2

# 发现容器启动的时候会得到一个docker分配的 eth0@if97 的ip地址

2、ping测试
# Linux虚拟机ping通docker容器内部 [root@localhost ~]# ping 容器ip

原理
172.17.0.1 这个是docker给我们的主机的ip
172.17.0.2 这个是docker给我们的容器(tomcat01)的ip
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是 veth-pair 技术!
启动容器后我们再次测试 ip a

97: eth0@if96
容器内 ip addr

96: eth0@if97
再启动一个tomcat测试

99: vethd82c62d@if98
进入容器后 ip a
172.17.0.2 这个是docker给我们的容器(tomcat02)的ip

98: eth0@if99
我们发现这个容器带来网卡,都是一对一对的
veth-pair就是一对的虚拟机接口,他们都是成对出现的,一端连着协议,一端彼此相连。(veth意思是virtual ethernet,虚拟以太网连接)
正因为这个特性,veth-pair 充当一个桥梁,连接各种 虚拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用veth-pair
tomcat01和tomcat02 都在同一个网段,所以它两都是可以相互ping通的,即:容器和容器之间是可以相互ping通的!
docker exec -it tomcat02 ping 172.17.0.2
绘制网络模型图

结论:tomcat01和tomcat02 是共用的一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0 。

Docker中所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件,很快。)
只要容器停止/删除,对应的网桥一对就没有了。
255.255.0.1/16
可用主机数:2 的16次方 -2 (减去网关和广播)= 65 534
255.255.255.255
11111111.11111111.11111111.11111111
前16个叫网络位,后16个是主机位。与或算法
思考
我们编写微服务的时候需要绑定数据库,database url=ip:,项目不重启,数据库ip换掉了,我们怎么处理这个问题?可以用名字来进行容器的访问。
这里启动不同的容器ip都不同,这怎搞?
解决:类似springcloud的feign去Nacos找服务名即可。
3、容器互联--link
# 以交互方式进入正在运行的容器 tomcat02 [root@localhost ~]# docker exec -it tomcat02 /bin/bash # 发现 tomcat02的 ping 命令无法使用 root@db1ab920ec45:/usr/local/tomcat# ping tomcat01# 解决 apt install iputils-ping # 如果执行错误,先执行这个: apt-get update root@db1ab920ec45:/usr/local/tomcat# apt install iputils-ping
tomcat02去ping通tomcat01测试

# 出现问题 root@db1ab920ec45:/usr/local/tomcat# ping tomcat01 ping: tomcat01: Name or service not known # 怎么解决? [root@localhost ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat# 出现问题 OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown # 怎么解决? root@dfdd58783733:/usr/local/tomcat# apt-get update & apt-get install -y iproute2# 出现问题 bash: ping: command not found # 怎么解决? root@dfdd58783733:/usr/local/tomcat# apt install iputils-ping # 如果执行错误,先执行这个: apt-get update


之前我们是通过ip去ping通的,现在我们link过后直接通过服务名去ping通!
# 列举网络 [root@localhost ~]# docker network ls# 查看网络详情 [root@localhost ~]# docker network inspect 2704ec4445bc


之前我们用tomcat03去连接tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
# 查看host配置,在这里原理发现! [root@localhost ~]# docker exec -it tomcat03 cat /etc/hosts

--link 就是我们在 hosts 配置中增加了一个 172.17.0.3 tomcat02 db1ab920ec45,但是tomcat02却没有绑定tomcat01。
我们现在已经不建议使用--link了。自定义网络,不使用docker0.
docker0的问题:他不支持容器名连接访问。
4、自定义网络
# 查看所有的docker网络 [root@localhost ~]# docker network ls

网络模式
bridge:桥接 docker 搭桥(默认,自己架构也使用这个)
host:和宿主机共享网络
none: 不配置网络
container:容器内网络连通(用的少,局限很大)
测试
1、清理环境

2、创建我们自己的网络
# 我们直接启动命令 --net bridge ,而这个是我们的docker0 # 平常写法 [root@localhost ~]# docker run -d -P --name tomcat01 # 相当于下面这种默认的 [root@localhost ~]# docker run -d -P --name tomcat01 --net bridge tomcat# docker0特点:默认的,域名不能访问,--link可以打通连接。 # 我们可以自定义一个网络# --driver bridge # --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254 # --gateway 192.168.0.1[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

查看我们自己配置的网络的详情
[root@localhost ~]# docker network inspect mynet

3、启动测试我们自己的网络
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat [root@localhost ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat [root@localhost ~]# docker network inspect mynet


# 再次测试两个容器的ping连接,可以成功 docker exec -it tomcat-net-01 ping 192.168.0.3
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐平时这样使用网络!
好处:不同的集群使用不同的网络,保证集群是安全和健康的。
4、网络连通



# 将tomcat01和mynet连通 docker network connect mynet tomcat01# 连通之后就是将tomcat01 放到了mynet网路下 # 一个容器两个ip地址: # 例如:阿里云服务器,公网ip,私网ip# tomcat01容器去ping我们自己的网络 docker exec -it tomcat01 ping tomcat-net-01
结论:假设我们需要跨网络操作别人,就需要使用 docker network connect 连通!
15、Redis集群部署实战

# 创建网卡
docker network create redis --subnet 172.38.0.0/16# 通过脚本创建六个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done# 创建结点1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf#创建结点6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf# 创建集群
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
1、redis集群的搭建


2、停掉主机&获取值

3、查看集群节点信息

16、打包镜像
Springboot微服务打包Docker镜像
-
1、架构springboot项目
-
2、打包应用
-
3、编写DockerFile
-
4、构建镜像
-
5、发布运行
1、打包项目

打开 demo-0.0.1-SNAPSHOT.jar 的文件位置,然后cmd
java -jar demo-0.0.1-SNAPSHOT.jar
下载docker插件

2、编写Dockerfile

FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
3、构建镜像

4、测试访问
本地测试

使用了Docker之后,给别人交付的就是一个镜像就可以了!!!
外网访问

关闭防火墙
systemctl stop firewalld
开机自动关闭防火墙
systemctl disable firewalld
相关文章:
docker指令存档
目录 Docker 1、概念 2、架构图 3、安装 4、Docker怎么工作的? 5、Docker常用命令 帮助命令 镜像命令 1、查看镜像 2、帮助命令 3、搜索镜像 4、拉取镜像 5、删除镜像 容器命令 1、启动 2、查看运行的容器 3、删除容器 4、启动&停止 其他命令…...
Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据
Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据,我们该如何将它们…...
ChatGPT 和文心一言 | 两大AI助手哪个更胜一筹
欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步ÿ…...
flink学习之窗口处理函数
窗口处理函数 什么是窗口处理函数 Flink 本身提供了多层 API,DataStream API 只是中间的一环,在更底层,我们可以不定义任何具体的算子(比如 map(),filter(),或者 window()),而只是…...
Python 基于pytorch从头写GPT模型;实现gpt实战
1.GPT简介 GPT(Generative Pre-trained Transformer)模型是一种基于Transformer架构的生成式预训练模型,由OpenAI开发。它采用了无监督学习的方式进行预训练,然后通过微调适应特定的任务。GPT模型的结构由多层Transformer解码器组…...
2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题
2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题 题目总数:7 总分数:100 编程题 第 1 题 问答题 二进制回文 编程实现: 输入一个正整数,判断它的二进制形式是否是回文数,如果是输出True…...
头歌C++之Switch控制语句编程实训
目录 第1关:根据输入数字判断是星期几 本关必读 本关任务 测试说明 第2关:根据输入的数值和运算符做相应运算 本关必读 本关任务 测试说明 第3关:根据输入年月计算该月份的天数 本关必读 本关任务...
CNN卷积理解
1 卷积的步骤 1 过滤器(卷积核)(Filter或Kernel): 卷积层使用一组可学习的过滤器来扫描输入数据(通常是图像)。每个过滤器都是一个小的窗口,包含一些权重,这些权重通过训…...
DataKit迁移MySQL到openGauss
前言 本文将分享DataKit迁移MySQL到openGauss的项目实战,供广大openGauss爱好者参考。 1. 下载操作系统 https://www.openeuler.org/zh/download https://support.huawei.com/enterprise/zh/doc/EDOC1100332931/1a643956 https://support.huawei.com/enterprise…...
Dockerfile里ADD * 保留原来的目录结构
1、问题 给新模块写Dockerfile,很多静态资源分散在各个目录,于是Dockerfile里我直接一句: ADD ./* /dest/镜像出来后,启动容器,进入容器种后发现:文件拷贝成功,但原来的目录结构都不在了&…...
C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层
C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…...
C语言实战系列二:简单超市收银系统
从一个简单的超市收银系统,我们来练习一个系统如何设计,然后如何实现的思路。 在Ubuntu环境下使用C语言编写一个简单的超市收银系统。以下是一个基本的示例,涵盖了商品管理、购物车、交易处理等功能。 代码 #include <stdio.h> #inc…...
coding推送代码Jenkins自动构建部署
实现功能:我们向coding推送代码,通过webhook自动通知Jenkins,实现自动构建部署 coding 项目设置 / 开发者选项 / Service Hook 输入以下参数 发送POST请求服务 URL:htttp://xxx用户名:xxx密码:xxx Jen…...
Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务
一. 背景介绍 1. ETL是什么 ETL(Extract-Transform-Load),即数据抽取、转换、装载的过程。它是一种思想,主要是说,从不同的数据源获取数据,并通过对数据进行处理(格式,协议等转换&a…...
《微信小程序开发从入门到实战》学习九十三
7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示: indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时,可以使用HexColor,也可以使用r…...
Java服务端使用freemarker+wkhtmltoimage生成Echart图片
目录 1.通过 freemarker 将ftl转成html 1.1 freemarker 手册: 1.2 添加freemarker maven依赖 1.3 添加 echart-test.ftl 模版文件 1.4 添加 FreemarkerTool 工具类 1.5 添加测试main方法 1.6 运行,生成echart-test-时间戳.html 文件 2. 通过wkhtmltoimage将html 转为p…...
一款颜值与实力并存的翻页时钟(免费)
FliTik是一款颜值与实力并存的翻页时钟,安卓端是完全免费的,无任何广告,极简风 ,软件默认是12小时制,可以在设置中启用24小时制,并且还支持设置显示秒钟、日期、文案,滴答声和语音报时。 支持横…...
Objective-C方法的声明实现及调用
1.无参数的方法 1)声明 a.位置:在interface括弧的外面 b.语法: - (返回值类型)方法名称; interface Person : NSObject -(void) run; end 2)实现 a.位置:在implementation中实现 b.语法:加大括弧将方法实现的代码写在大括孤之中 …...
第十四届蓝桥杯国赛 C++ B 组 C 题——班级活动(AC)
目录 1. 班级活动1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定8. 原题链接 2. 解题思路3. AC_Code 1. 班级活动 前置知识点:思维,分类讨论 1. 问题描述 小明的老师准备组织一次班级活动。班上一共有 n…...
GraphQL的力量:简化复杂数据查询
1. GraphQL GraphQL 是一种由 Facebook 开发并于 2015 年公开发布的数据查询和操作语言,也是运行在服务端的运行时(runtime)用于处理 API 查询的一种规范。不同于传统的 REST API,GraphQL 允许客户端明确指定它们需要哪些数据&am…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
