【docker】基础知识,常用命令,日常使用足够了

osc_xsr0bfp3 2020-11-11 08:33:36
Docker Compose


1、docker安装

yum安装并启动程序

[root@192 ~]# yum install docker -y
[root@192 ~]# systemctl enable docker
[root@192 ~]# systemctl start docker

配置docker镜像加速

[root@192 ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors": ["https://qegs5iwg.mirror.aliyuncs.com"]
}
[root@192 ~]# systemctl restart docker

镜像加速获取方法:
登录阿里云——>产品——>容器服务ACK——>控制台——>容器镜像服务——>镜像中心——>镜像加速器,根据提示,完成镜像加速配置(需要登录注册)

2、docker镜像管理

在主机上查看当前镜像

[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest d70eaf7277ea 2 weeks ago 72.9 MB
docker.io/mysql latest db2b37ec6181 2 weeks ago 545 MB
docker.io/centos latest 0d120b6ccaa8 2 months ago 215 MB
[root@192 ~]# docker images -q //只查看镜像的id
d70eaf7277ea
db2b37ec6181
0d120b6ccaa8

查找想要下载的镜像,并下载

[root@192 ~]# docker search all
[root@192 ~]# docker search centos
[root@192 ~]# docker pull docker.io/centos

查看镜像详情

[root@192 ~]# docker image inspect $IMAGEID

修改镜像名字和tag,等同于 复制某个镜像,修改名字和标签
镜像的名字和标签一起用时中间加: 例如 docker.io/mysql:latest

[root@192 ~]# docker tag $imageid mycentos_nginx:7 
[root@192 ~]#docker tag $REPOSITORY:TAG centos7:ok

删除镜像

# docker image rm daocloud.io/library/mysql //使用镜像名删除
# docker rmi ed9c93747fe1 //使用id删除
# docker rmi docker.io/ubuntu:latest --force //镜像在使用中强制删除
# docker rmi $(docker images -q) //删除所有镜像
如果镜像正在被未运行的容器使用,则需要强制删除,但是如果正在被运行的容器使用,则强制删除也无法删除

查看镜像制作过程,相当与dockerfile(后面说)

[root@192 ~]# docker image history library/centos
//自己做镜像,但是做完的镜像时间长了,我们往往会忘记对镜像做了什么,故可以查看镜像的制作历史。但往往我们会通过dockerfile的方式做镜像,简单便捷,相当于脚本,脚本里就能看记录,无需查看历史。

3、docker容器管理

拉起docker容器

命令 动作 参数1、2、3… REPOSITORY shell命令
docker run -it docker.io/centos cat /etc/hosts
docker run -it --name mysql /bin/bash
[root@192 ~]# docker run -it --name test docker.io/centos /bin/bash
[root@192 ~]# docker run -it -h $remote_ip/$remote_hostname docker.io/centos /bin/bash
参数详解:
-i 捕获标准输入输出,保持交互式的意思
-t 分配一个终端或控制台,每一个控制台都要伴随一个shell
-d 后台运行容器,并返回ID
-m 设定容器使用的内存
/bin/bash 容器运行起来之后运行的程序,也可以是任何的命令。
--name 给运行的容器命名
--dns-search: 指定容器主机所隶属的域
--dns :指定 dns 服务器地址
--memory-swap 设定swap 
--cpuset-cpus="1,3" 限制容器使用的 vCPU 的 1 和 3 核心上
--blkio-weight 600 默认情况下,所有容器能平等地读写磁盘 , 默认为 500, 可以提高权重为 600
--device-read-bps ,限制读某个设备的 bps 。
--device-write-bps ,限制写某个设备的 bps 。
--device-read-iops ,限制读某个设备的 iops 。
--device-write-iops ,限制写某个设备的 iops
(bps 是 byte per second ,每秒读写的数据量,iops 是 io per second ,每秒 IO 的次数。)
--cidfile: 指定容器运行之后container长id的存放文件位置
--restart=always:默认情况下docker重启之后所有容器会被关闭,这个选项的意思是容器随docker engine自启动。
--rm 退出时就删除该容器。默认情况下,每个容器在退出时,他的文件系统会保存下来。这样一方面有利于调试,因为可以通过查看日志等方式来确定最终状态;另一方面,也可以保持容器所产生的数据。如果仅仅需要短暂的运行一个容器,且不需要保存容器中的数据,就可以在exit容器时自动清理掉容器及其产生的数据。

退出容器

[root@432a76428d1d /]#^p^q //退出容器继续运行
[root@432a76428d1d /]# exit //退出后,容器停止工作,拉起时加--restart=always参数的容器不会停止。

停止或启动容器

[root@192 ~]# docekr stop 容器 ID
[root@192 ~]# docekr start 容器 ID
//run是将镜像拉起成为一个容器,未run过的容器,docker ps -a 是查不到,也就无法通过docekr start 或者docker stop进行操作

查看容器的运行状态

[root@192 ~]# docker ps //运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3d143546f7a docker.io/centos "/bin/bash" 5 seconds ago Up Less than a second serene_sammet
432a76428d1d docker.io/centos "/bin/bash" 11 minutes ago Up 11 minutes loving_tesla
[root@192 ~]# docker ps -a //所有拉起的容器
[root@192 ~]# docker ps -a -q //查看所有容器id
[root@192 ~]# docker ps -qf status=running //查看某种状态的容器id 

登录容器

[root@192 ~]# docker attach $CONTAINERID 
//回到run时的状态,真正登录到容器。执行exit会退出并停止容器。
[root@192 ~]# docker exec -it $CONTAINERID /bin/bash 
//exec调用docker命令。执行exit退出,不会停止容器,后面也可以直接加命令
[root@192 ~]# docker exec -it f3 hostname
f3d143546f7a
[root@192 ~]# docker exec f3 hostname
f3d143546f7a

删除容器

[root@192 ~]# docker rm $CONTAINERID
[root@192 ~]# docker rm -f $CONTAINERID //强制删除运行中的容器

查看容器信息/状态

[root@192 ~]# docker info //查看当前服务所有容器的信息
[root@192 ~]# docker stats $CONTAINERID //查看cpu、内存、磁盘IO等状态
[root@192 ~]# docker inspect $CONTAINERID //查看容器详细配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等
[root@192 ~]# docker logs $CONTAINERID //查看日志
[root@192 ~]# docker top $CONTAINERID //类似top
[root@192 ~]# docker diff $CONTAINERID //查看容器内发生变化的文件,C对应的文件内容的改变,A对应的均是文件或者目录的创建删除
[root@192 ~]# docker events //实时输出Docker服务器端的事件,包括容器的创建,启动,关闭等。

4、docker创建自定义镜像

拉起一个容器,部署想要的服务,然后再打包成镜像,做到下次开箱即用
commit:提交容器到镜像,实现容器持久化;
export:导出容器和镜像,实现容器内容持久化;
save:导出镜像文件,实现镜像内容持久化。


4.1、export,把正在运行的容器直接导出为tar包的镜像文件

[root@192 ~]# docker export -o mysql_service.tar $CONTAINERID
[root@192 ~]# docker export $CONTAINERID > 315.tar

将镜像导入至其他服务器

[root@192 ~]# docker import 315.tar
[root@192 ~]# docker import 315.tar name:7 //导入就加入名字和标签

4.2、save,直接把镜像打包出来

[root@192 ~]# docker save -o suibian.tar $REPOSITORY:$TAG

将镜像导入至其他服务器

[root@192 ~]# docker load < suibian.tar 

4.3、commit,生成新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY:TAG]
docker 提交,生成新版本。 -m 添加注释 /-a 作者/-p,–pause=true 提交时暂停容器运行 容器id/name 新的镜像名称
[root@192 ~]# docker commit -m "ownerimage" -a "centos" 315ed84d3304 hello:v1 

以上三者的区别、额… 有大神会
https://zhuanlan.zhihu.com/p/152219012

4.4、dockerfile,生成新的镜像(最常用)

可以将命令行的操作放到配置文件中,使用配置文件创建镜像。

  • 准备Dockerfile文件
[root@192 ~]# mkdir /dockerfiletest //docker build需要指定此目录名字
[root@192 ~]# cd /dockerfiletest
[root@192 dockerfiletest]# touch Dockerfile //固定名字,加载时自动识别该名字
[root@192 dockerfiletest]# cat Dockerfile 
FROM daocloud.io/library/centos:6
MAINTAINER xingyao xingyao@localhost.localdomain
RUN touch /tmp/a.txt
RUN useradd xingyao
RUN echo 123 |passwd --stdin xingyao
##注释:
FROM 基础镜像,存在直接使用,不存在自动下载
MAINTAINER 作者 作者邮箱
RUN 对镜像做的后续改变 
RUN 继续对镜像做改变 
RUN ...
每行命令均是 INSTRUCTION statement形式,即命令+清单的模式。
命令要大写
"#"是注解
可以将多行放到一行,使用&& 连接

更加详细的参数可以参考大牛的链接
https://www.cnblogs.com/ling-yu-amen/p/10955361.html

  • 使用Dockerfile创建镜像
[root@192 dockerfiletest]# docker build -t dockerfiletest:v1 . 
-t:tag是标识新建的镜像名
"."是用来指明使用的Dockerfile文件当前目录的,也可用绝对路径
由Dockerfile文件看出整个过程共5步,执行过程的详细信息会显示在终端
[root@192 dockerfiletest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockerfiletest v1 69728f308204 About a minute ago 194 MB

5、docker容器与宿主机之间文件共享

5.1、docker与宿主机之间copy文件

容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可如下方式copy到宿主机
[root@192 ~]# docker cp $容器:/usr/local/bin/docker-entrypoint.sh /root
将宿主机文件重新copy回容器
[root@192 ~]# docker cp /root/docker-entrypoint.sh $容器:/usr/local/bin/ 

5.2、docker容器卷

使用卷可以将宿主机的文件共享到容器中,因为是共享关系,所以宿主机目录和容器目录中的数据是同步的。但无论是新卷还是其他容器共享的卷都只能应用给新容器,也就是在创建容器时使用卷

新卷只能在容器创建过程当中挂载

[root@docker ~]# docker run -it -v /abc:/hello $容器
[root@docker ~]# touch /abc/abc.txt
[root@71fcb0382357 /]# ls /hello/
abc.txt
-v:指定宿主机上的一个路径:容器中的路径。所有目录无需新建

实际应用中可以利用多个-v选项把宿主机上的多个目录同时共享给新建容器:

# docker run -it -v /abc:/abc -v /def:/def $容器

共享其他容器的卷:
[root@docker ~]# docker attach 71
[root@71fcb0382357 /]# ls /hello/
abc.txt
[root@docker ~]# docker run -it --volumes-from $容器1 $容器2 /bin/bash
[root@9b0ca8808591 /]# ls /hello/
abc.txt





–volumes-from:表示将71fc容器中共享的目录也共享给这个新的容器,71fc容器挂载到哪里,新的容器就挂载到哪里

6、Docker-Compose

6.1、docker-compose介绍

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排

  • Docker-Compose 将所管理的容器分为三层 :
    工程( project )
    服务( service )
    容器( container )


  • Docker-Compose 运行目录下的所有文件( docker-compose.yml , extends 文件或环境变量文件等)组成一个工程。
    若无特殊指定工程名即为当前目录名。
  • 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
  • 一个服务当中可包括多个容器实例, Docker-Compose 并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
  • Docker-Compose 的工程配置文件默认为 docker-compose.yml ,可通过环境变量 COMPOSE_FILE或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
  • 使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
  • Compose 允许用户通过一个单独的 docker-compose.yml 模板文件( YAML 格式)来定义一组相关联的应用容器为一个项目( project )。
  • Docker-Compose 项目由 Python 编写,调用Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API ,就可以在其上利用 Compose 来进行编排管理。

6.2、 实现 Docker-Compose

  • 安装 python2-pip 及 docker-compose
[root@192 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@192 ~]# yum --enablerepo=epel -y install python2-pip
[root@192 ~]# pip install docker-compose
  • 编写一个 DockerFile
[root@192 file]# cat Dockerfile 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

为什么要docker运行apache要加FOREGROUND?
因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
参考:
https://www.cnblogs.com/cag2050/p/10144504.html


[root@192 file]# cat sshd 
FROM centos
MAINTAINER xingyao xingyao.com
RUN yum -y update
RUN yum -y install openssh-server
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
  • 实现 Docker-Compose
    制定一个应用配置
[root@192 file]# cat docker-compose.yml 
version: '3'
services:
db:
image: mariadb
volumes:
- /var/lib/docker/disk01:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: centos
MYSQL_PASSWORD: password
MYSQL_DATABASE: centos_db
ports:
- "3306:3306"
web:
build: .
ports:
- "80:80"
volumes:
- /var/lib/docker/disk02:/var/www/html
ssh:
build:
context: .
dockerfile: sshd
ports:
- "2222:22"
  • 生成容器和镜像
    关闭防火墙和selinux
[root@192 file]# docker-compose up -d
[root@192 file]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4096c00840b file_web "/usr/sbin/apachec..." 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp file_web_1
[root@192 file]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file_ssh latest 8a6791c952d6 8 minutes ago 281 MB
file_web latest 72bf0c7f6dbc 18 minutes ago 285 MB
  • 测试
# mysql -h 127.0.0.1 -u root -p -e "show variables like 'hostname';"
# mysql -h 127.0.0.1 -u centos -p -e "show databases;"
# echo "Hello xingyao" > /var/lib/docker/disk02/index.html
# curl localhost

6.3、 更多docker-compose操作

1) 显示应用容器的状态
# docker-compose ps
2) 显示应用容器的 log
# docker-compose logs
3) 进入应用容器
# docker exec -it root_db_1 /bin/bash
6. docekr-compose 其他操作
4) 停止应用容器
# docker-compose stop
5) 运行一个应用容器 , 如果有依赖的容器也将被
运行
# docker-compose up -d web
6) 删除应用容器
# docker-compose rm

更多docker-compose学习可以参考
https://www.cnblogs.com/minseo/p/11548177.html

7、docker网络类型

7.1、同主机通信

7.1.1、bridge模式

  • 当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair 设备, Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0 (容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。
  • bridge 模式是 docker 的默认网络模式,不写 --net 参数,就是 bridge 模式。使用 docker run -p时, docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。
# docker run -ti --net=bridge --name c7 centos /bin/bash

在这里插入图片描述

7.1.2、host模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace ,而是和宿主机共用一个 Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

# docker run -ti --net=host --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.1.3、Container 模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP ,而是和一个指定的容器共享 IP 、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

# docker run -ti --net=bridge --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.1.4、None 模式

使用 none 模式, Docker 容器拥有自己的Network Namespace ,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP 、路由等信息。需要我们自己为Docker 容器添加网卡、配置 IP 等。

# docker run -ti --net=none --name c7 myimages/centos-ip /bin/bash

在这里插入图片描述

7.2、跨主机通信

直接看各位大牛写的吧、、太多了。

8、docekr私有仓库

  • 环境准备
    client 192.168.135.161 #测试机
    docker 192.168.135.162 #私有库

  • 实现步骤
    拉取做私有镜像仓库的镜像:
[root@docker ~]# docker pull daocloud.io/library/registry
[root@docker ~]# docker images |grep regi
daocloud.io/library/registry latest b2b03e9146e1 3 months ago 33.3 MB
[root@docker ~]# docker run --restart=always -d -p 5000:5000 daocloud.io/library/registry //端口转发:解决容器端口访问问题 135.161访问-->宿主机135.162的5000端口--->容器的5000端口
93395acb90b8636453974921c9742837946b07e02d883f7157f373bdd2078e25
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93395acb90b8 daocloud.io/library/registry "/entrypoint.sh /e..." 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp naughty_goldwasser

进入到私有仓库容器中去

[root@docker ~]# docker exec -it 9339 /bin/sh //这里是sh,不是bash,无软连接
/ # netstat -lnp |grep :5000
tcp 0 0 :::5000 :::* LISTEN 1/registry
/ # 

访问私有仓库

[root@docker ~]# curl -I 127.0.0.1:5000 //查看状态码为200
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Sun, 21 Oct 2018 07:36:11 GMT
Content-Type: text/plain; charset=utf-8

下载小镜像buysbox上传到私有库

[root@client ~]# docker pull busybox
[root@client ~]# docker tag busybox 192.168.135.162:5000/busybox //宿主机ip
[root@client ~]# docker push 192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
Get https://192.168.135.162:5000/v1/_ping: http: server gave HTTP response to HTTPS client

如上显示由于客户端采用https,docker registry未采用https服务导致未上传成功"192.168.1.100:5000"请求改为http。

解决方法:

[root@client ~]# touch /etc/docker/daemon.json
[root@client ~]# vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.135.162:5000"] }
[root@client ~]# systemctl restart docker
[root@client ~]# docker push 192.168.135.162:5000/busybox
The push refers to a repository [192.168.135.162:5000/busybox]
8a788232037e: Pushed
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527

查看私有仓库里的所有镜像

[root@client-161 ~]# curl 192.168.135.162:5000/v2/_catalog
{"repositories":["busybox"]}

查看更详细的镜像信息:

[root@client-161 ~]# curl http://192.168.135.162:5000/v2/busybox/tags/list

客户端使用私有仓库的镜像

[root@client-161 ~]# docker pull 192.168.135.162:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.135.162:5000/busybox ...
latest: Pulling from 192.168.135.162:5000/busybox
90e01955edcd: Pull complete
Digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
Status: Downloaded newer image for 192.168.135.162:5000/busybox:latest
[root@client-161 ~]# docker images |grep busy
192.168.135.162:5000/busybox latest 59788edf1f3e 2 weeks ago 1.15 MB
版权声明
本文为[osc_xsr0bfp3]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4273197/blog/4712015

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云