Docker日常使用文档

1.为什么是docker

  • 在开发的时候,在本机测试环境可以跑,生产环境跑不起来

    这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接打包在一起,无论在那个机器上保证了环境一致。

    优势1: 一致的运行环境,更轻松的迁移

  • 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了

    这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。

    优势2:对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源

  • 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器

    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。

    优势3: 通过镜像复制N多个环境一致容器

2.Docker和虚拟机区别

关于Docker与虚拟机的区别,我在网上找到的一张图,非常直观形象地展示出来,话不多说,直接上图。

比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。

传统虚拟机 Docker容器
磁盘占用 几个GB到几十个GB左右 几十MB到几百MB左右
CPU内存占用 虚拟操作系统非常占用CPU和内存 Docker引擎占用极低
启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 每次部署都费时费力 从第二次部署开始轻松简捷
耦合性 多个应用服务安装到一起,容易互相影响 每个应用服务一个容器,达成隔离
系统依赖 需求相同或相似的内核,目前推荐是Linux

3.Docker的安装

​ 3.1安装docker(Centos7.x)

  • 卸载原始docker

    $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
    
  • 安装docker依赖

    $ sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2
    
  • 设置docker的yum源

    $ sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
    
  • 安装最新版的docker

    $ sudo yum install docker-ce docker-ce-cli containerd.io
    
  • 指定版本安装docker

    $ yum list docker-ce --showduplicates | sort -r
    $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    $ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
    
  • 启动docker

    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    
  • 关闭docker

    $ sudo systemctl stop docker
    
  • 测试docker安装

    $ sudo docker run hello-world
    

4.2 bash安装(通用所有平台)

  • 在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。

    $ curl -fsSL get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh --mirror Aliyun
    
  • 启动docker

    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    
  • 创建docker用户组

    $ sudo groupadd docker
    
  • 将当前用户加入docker组

    $ sudo usermod -aG docker $USER
    
  • 测试docker安装是否正确

    $ docker run hello-world
    

5.Docker 的核心架构

  • 镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
  • 容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
  • 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
  • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像

6.docker配置阿里云镜像加速

  • 访问阿里云登录自己账号查看docker镜像加速服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 验证docker的镜像加速是否生效
[root@localhost ~]# docker info..........127.0.0.0/8Registry Mirrors:'https://lz2nib3q.mirror.aliyuncs.com/'Live Restore Enabled: falseProduct License: Community Engine

7.常用命令

6.1 辅助命令

# 1.安装完成辅助命令docker version   --------------------------  查看docker的信息docker info      --------------------------  查看更详细的信息docker --help   --------------------------  帮助命令

6.2 Images 镜像命令

# 1.查看本机中所有镜像docker images   --------------------------  列出本地所有镜像-a          列出所有镜像(包含中间映像层)-q         只显示镜像id# 2.搜索镜像docker search [options] 镜像名  ------------------- 去dockerhub上查询当前镜像-s 指定值     列出收藏数不少于指定值的镜像  docker search --filter=stars=3--no-trunc    显示完整的镜像信息# 3.从仓库下载镜像docker pull 镜像名[:TAG|@DIGEST]    ----------------- 下载镜像# 4.删除镜像docker rmi 镜像名    --------------------------  删除镜像-f      强制删除

6.3 Contrainer 容器命令

# 1.运行容器docker run 镜像名   --------------------------  镜像名新建并启动容器--name                    别名为容器起一个名字-d                            启动守护式容器(在后台启动容器)-p                            映射端口号:原始端口号       指定端口号启动例:docker run -it --name myTomcat -p 8888:8080 tomcatdocker run -it -d --name mytomcat -p 8888:8080 tomcat:8.0docker run -d --name myTomcat -P tomcat# 2.查看运行的容器docker ps                 --------------------------  列出所有正在运行的容器-a           正在运行的和历史运行过的容器-q            静默模式,只显示容器编号# 3.停止|关闭|重启容器docker start   容器名字或者容器id  --------------- 开启容器docker restart 容器名或者容器id    --------------- 重启容器docker stop  容器名或者容器id      ------------------ 正常停止容器运行docker kill  容器名或者容器id      ------------------ 立即停止容器运行# 4.删除容器docker rm -f 容器id和容器名     docker rm -f $(docker ps -aq)       --------------------------  删除所有容器# 5.查看容器内进程docker top 容器id或者容器名 ------------------ 查看容器内的进程# 6.查看查看容器内部细节docker inspect 容器id      ------------------ 查看容器内部细节# 7.查看容器的运行日志docker logs [OPTIONS] 容器id或容器名  ------------------ 查看容器日志-t          加入时间戳-f             跟随最新的日志打印--tail     数字 显示最后多少条# 8.进入容器内部docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令-i     以交互模式运行容器,通常与-t一起使用-t        分配一个伪终端    shell窗口   bash # 9.容器和宿主机之间复制文件docker cp 文件|目录 容器id:容器路径           -----------------   将宿主机复制到容器内部docker cp 容器id:容器内资源路径 宿主机目录路径  -----------------   将容器内资源拷贝到主机上# 10.数据卷(volum)实现与宿主机共享目录docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名注意: 1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中# 11.打包镜像docker save 镜像名 -o  名称.tar# 12.载入镜像docker load -i   名称.tar# 13.容器打包成新的镜像docker commit -m "描述信息" -a "作者信息"   (容器id或者名称)打包的镜像名称:标签

8.docker的镜像原理

8.1 镜像是什么?

镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。

8.2 为什么一个镜像会那么大?

镜像就是花卷

  • UnionFS(联合文件系统):

    Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。

8.3 Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成。

  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。

  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。

  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

8.4 为什么docker镜像要采用这种分层结构呢?

最大的一个好处就是资源共享

  • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

9.Docker安装常用服务

9.1 安装mysql

# 1.拉取mysql镜像到本地docker pull mysql:tag (tag不加默认最新版本)# 2.运行mysql服务docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag                          --没有暴露外部端口外部不能连接docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d  mysql:tag  --暴露外部端口# 3.进入mysql容器docker exec -it 容器名称|容器id bash# 4.外部查看mysql日志docker logs 容器名称|容器id# 5.使用自定义配置参数docker run --name mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag# 6.将容器数据位置与宿主机位置挂载保证数据安全docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag# 7.通过其他客户端访问 如在window系统|macos系统使用客户端工具访问# 8.将mysql数据库备份为sql文件docker exec mysql|容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出全部数据docker exec mysql sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出指定库数据docker exec mysql sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出指定库数据不要数据# 9.执行sql文件到mysql中docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql

9.2 安装Redis服务

# 1.在docker hub搜索redis镜像docker search redis# 2.拉取redis镜像到本地docker pull redis# 3.启动redis服务运行容器docker run --name redis -d redis:tag (没有暴露外部端口)docker run --name redis -p 6379:6379 -d redis:tag (暴露外部宿主机端口为6379进行连接) # 4.查看启动日志docker logs -t -f 容器id|容器名称# 5.进入容器内部查看docker exec -it 容器id|名称 bash  # 6.加载外部自定义配置启动redis容器默认情况下redis官方镜像中没有redis.conf配置文件 需要去官网下载指定版本的配置文件1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz  下载官方安装包2.. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件3. 修改需要自定义的配置bind 0.0.0.0 开启远程权限appenonly yes 开启aof持久化4. 加载配置启动docker run --name redis -v /root/redis:/usr/local/etc/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf  # 7.将数据目录挂在到本地保证数据安全docker run --name redis -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis redis-server                     /usr/local/etc/redis/redis.conf

9.3 安装Nginx

# 1.在docker hub搜索nginxdocker search nginx# 2.拉取nginx镜像到本地[root@localhost ~]# docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxafb6ec6fdc1c: Pull complete b90c53a0b692: Pull complete 11fa52a0fdc0: Pull complete Digest: sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latest# 3.启动nginx容器docker run -p 80:80 --name nginx01 -d nginx# 4.进入容器docker exec -it nginx01 /bin/bash查找目录:  whereis nginx配置文件:  /etc/nginx/nginx.conf# 5.复制配置文件到宿主机docker cp nginx01(容器id|容器名称):/etc/nginx/nginx.conf 宿主机名录# 6.挂在nginx配置以及html到宿主机外部docker run --name nginx02 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx

9.4 安装Tomcat

# 1.在docker hub搜索tomcatdocker search tomcat# 2.下载tomcat镜像docker pull tomcat# 3.运行tomcat镜像docker run -p 8080:8080 -d --name mytomcat tomcat# 4.进入tomcat容器docker exec -it mytomcat /bin/bash# 5.将webapps目录挂载在外部docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d --name mytomcat tomcat

9.5 安装MongoDB数据库

# 1.运行mongDBdocker run -d -p 27017:27017 --name mymongo mongo  ---无须权限docker logs -f mymongo --查看mongo运行日志# 2.进入mongodb容器docker exec -it mymongo /bin/bash直接执行mongo命令进行操作# 3.常见具有权限的容器docker run --name  mymongo  -p 27017:27017  -d mongo --auth# 4.进入容器配置用户名密码mongouse admin 选择admin库db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})   //创建用户,此用户创建成功,则后续操作都需要用户认证exit# 5.将mongoDB中数据目录映射到宿主机中docker run -d -p 27017:27017 -v /root/mongo/data:/data/db --name mymongo mongo

9.6 安装ElasticSearch

  • 注意:调高JVM线程数限制数量

0.拉取镜像运行elasticsearch

# 1.dockerhub 拉取镜像docker pull elasticsearch:6.4.2
# 2.查看docker镜像docker images
# 3.运行docker镜像docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.4.2

1. 预先配置

# 1.在centos虚拟机中,修改配置sysctl.confvim /etc/sysctl.conf
# 2.加入如下配置vm.max_map_count=262144
# 3.启用配置sysctl -p注:这一步是为了防止启动容器时,报出如下错误:bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

2.启动EleasticSearch容器

# 0.复制容器中data目录到宿主机中docker cp 容器id:/usr/share/share/elasticsearch/data /root/es
# 1.运行ES容器 指定jvm内存大小并指定ik分词器位置docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /root/es/plugins:/usr/share/elasticsearch/plugins -v /root/es/data:/usr/share/elasticsearch/data elasticsearch:6.4.2

3.安装IK分词器

# 1.下载对应版本的IK分词器wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip# 2.解压到plugins文件夹中yum install -y unzipunzip -d ik elasticsearch-analysis-ik-6.4.2.zip# 3.添加自定义扩展词和停用词cd plugins/elasticsearch/configvim IKAnalyzer.cfg.xml<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">ext_dict.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">ext_stopwords.dic</entry></properties># 4.在ik分词器目录下config目录中创建ext_dict.dic文件   编码一定要为UTF-8才能生效vim ext_dict.dic 加入扩展词即可
# 5. 在ik分词器目录下config目录中创建ext_stopword.dic文件 vim ext_stopwords.dic 加入停用词即可# 6.重启容器生效docker restart 容器id
# 7.将此容器提交成为一个新的镜像docker commit -a="xiaochen" -m="es with IKAnalyzer" 容器id xiaochen/elasticsearch:6.4.2

4. 安装Kibana

# 1.下载kibana镜像到本地docker pull kibana:6.4.2# 2.启动kibana容器docker run -d --name kibana -e ELASTICSEARCH_URL=http://10.15.0.3:9200 -p 5601:5601 kibana:6.4.2

10.Docker中出现如下错误解决方案

[root@localhost ~]# docker search mysql 或者 docker pull 这些命令无法使用
Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: x509: certificate has expired or is not yet valid
  • 注意:这个错误的原因在于是系统的时间和docker hub时间不一致,需要做系统时间与网络时间同步
# 1.安装时间同步sudo yum -y install ntp ntpdate
# 2.同步时间sudo ntpdate cn.pool.ntp.org
# 3.查看本机时间date
# 4.从新测试

11.Dockerfile

11.1 什么是Dockerfile

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件

  • 通过架构图可以看出通过DockerFile可以直接构建镜像

11.2 Dockerfile解析过程

11.3 Dockerfile的保留命令

官方说明:https://docs.docker.com/engine/reference/builder/

保留字 作用
FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 构建镜像时需要运行的指令
EXPOSE 当前容器对外暴露出的端口号
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY 类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

11.3.1 FROM 命令

  • 基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

  • 语法:

    FROM  <image>
    FROM  <image>[:<tag>]     使用版本不写为latest
    FROM  <image>[@<digest>]  使用摘要
    

11.3.2 MAINTAINER 命令

  • 镜像维护者的姓名和邮箱地址[废弃]

  • 语法:

    MAINTAINER <name>
    

11.3.3 RUN 命令

  • RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

  • 语法:

    RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    RUN echo helloRUN ["executable", "param1", "param2"] (exec form)
    RUN ["/bin/bash", "-c", "echo hello"]
    

11.3.4 EXPOSE 命令

  • 用来指定构建的镜像在运行为容器时对外暴露的端口

  • 语法:

    EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
    EXPOSE 80/udp
    

11.3.5 CMD 命令

  • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 语法:

    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)
    

11.3.6 WORKDIR 命令

  • 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

  • 语法:

    WORKDIR /path/to/workdirWORKDIR /a
    WORKDIR b
    WORKDIR c
    `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`
    

11.3.7 ENV 命令

  • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

  • 语法:

    ENV <key> <value>
    ENV <key>=<value> ...
    

11.3.8 ADD 命令

  • 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

  • 语法:

    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/   通配符添加
    ADD test.txt relativeDir/  可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD url
    

11.3.9 COPY 命令

  • 用来将context目录中指定文件复制到镜像的指定目录中

  • 语法:

    COPY src dest
    COPY ["<src>",... "<dest>"]
    

11.3.10 VOLUME 命令

  • 用来定义容器运行时可以挂在到宿主机的目录

  • 语法:

    VOLUME ["/data"]
    

11.3.11 ENTRYPOINT命令

  • 用来指定容器启动时执行命令和CMD类似

  • 语法:

      ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2
    

    ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

12.高级网络配置

12.1 说明

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-987im4Uo-1667353704120)(C:/Users/1/Desktop/笔记/Docker_1.assets/image-20201125105847896.png)]

12.2 查看网络信息

# docker network ls

12.3 创建一个网桥

# docker network create -d bridge 网桥名称

12.4 删除一个网桥

# docker network rm 网桥名称

12.5 容器之前使用网络通信

# 1.查询当前网络配置
- docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8e424e5936b7        bridge              bridge              local
17d974db02da        docker_gwbridge     bridge              local
d6c326e433f7        host                host                local
# 2.创建桥接网络
- docker network create -d bridge info
[root@centos ~]# docker network create -d bridge info
6e4aaebff79b1df43a064e0e8fdab08f52d64ce34db78dd5184ce7aaaf550a2f
[root@centos ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8e424e5936b7        bridge              bridge              local
17d974db02da        docker_gwbridge     bridge              local
d6c326e433f7        host                host                local
6e4aaebff79b        info                bridge              local
# 3.启动容器指定使用网桥
- docker run -d -p 8890:80 --name nginx001 --network info nginx
- docker run -d -p 8891:80 --name nginx002 --network info nginx `注意:一旦指定网桥后--name指定名字就是主机名,多个容器指定在同一个网桥时,可以在任意一个容器中使用主机名与容器进行互通`
[root@centos ~]# docker run -d -p 8890:80 --name nginx001 --network info nginx
c315bcc94e9ddaa36eb6c6f16ca51592b1ac8bf1ecfe9d8f01d892f3f10825fe
[root@centos ~]# docker run -d -p 8891:80 --name nginx002 --network info nginx
f8682db35dd7fb4395f90edb38df7cad71bbfaba71b6a4c6e2a3a525cb73c2a5
[root@centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f8682db35dd7        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:8891->80/tcp   nginx002
c315bcc94e9d        nginx               "/docker-entrypoint.…"   7 minutes ago       Up 7 minutes        0.0.0.0:8890->80/tcp   nginx001
b63169d43792        mysql:5.7.19        "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        3306/tcp               mysql_mysql.1.s75qe5kkpwwttyf0wrjvd2cda
[root@centos ~]# docker exec -it f8682db35dd7 /bin/bash
root@f8682db35dd7:/# curl http://nginx001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.....

13.高级数据卷配置

13.1 说明

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

13.2 创建数据卷

[root@centos ~]# docker volume create my-vol
my-vol

13.3 查看数据卷

[root@centos ~]# docker volume inspect my-vol
[{"CreatedAt": "2020-11-25T11:43:56+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}
]

13.4 挂载数据卷

[root@centos ~]# docker run -d -P --name web  -v my-vol:/usr/share/nginx/html  nginx
[root@centos ~]# docker inspect web"Mounts": [{"Type": "volume","Name": "my-vol","Source": "/var/lib/docker/volumes/my-vol/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}],

13.5 删除数据卷

docker volume rm my-vol

14.Docker Compose

14.1 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

14.2 安装与卸载

1.linux
  • 在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
2.macos、window
  • Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用
3.bash命令补全
$ curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
4.卸载
  • 如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
5.测试安装成功
$ docker-compose --versiondocker-compose version 1.25.5, build 4667896b

14.3 docker compose使用

# 1.相关概念

首先介绍几个术语。

  • 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元。∂一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
# 2.场景

最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。

  • springboot应用
  • mysql服务
  • redis服务
  • elasticsearch服务
# 3.docker-compose模板
- 参考文档:https://docker_practice.gitee.io/zh-cn/compose/compose_file.html
version: "3.0"
services:mysqldb:image: mysql:5.7.19container_name: mysqlports:- "3306:3306"volumes:- /root/mysql/conf:/etc/mysql/conf.d- /root/mysql/logs:/logs- /root/mysql/data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: rootnetworks:- emsdepends_on:- redisredis:image: redis:4.0.14container_name: redisports:- "6379:6379"networks:- emsvolumes:- /root/redis/data:/datacommand: redis-servernetworks:ems:
# 4.通过docker-compose运行一组容器
- 参考文档:https://docker_practice.gitee.io/zh-cn/compose/commands.html
[root@centos ~]# docker-compose up                              //前台启动一组服务
[root@centos ~]# docker-compose up -d                          //后台启动一组服务

14.4 docker-compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

version: "3"services:webapp:image: examples/webports:- "80:80"volumes:- "/data"

注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。

如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。

下面分别介绍各个指令的用法。

build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

version: '3'
services:webapp:build: ./dir

你也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。

使用 dockerfile 指令指定 Dockerfile 文件名。

使用 arg 指令指定构建镜像时的变量。

version: '3'
services:webapp:build:context: ./dirdockerfile: Dockerfile-alternateargs:buildno: 1

command

覆盖容器启动后默认执行的命令。

command: echo "hello world"

container_name

指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。

container_name: docker-web-container

注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。

depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web

version: '3'services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres

注意:web 服务不会等待 redis db 「完全启动」之后才启动。

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

env_file: .envenv_file:- ./common.env- ./apps/web.env- /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

# common.env: Set development environment
PROG_ENV=development

environment

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

environment:RACK_ENV: developmentSESSION_SECRET:environment:- RACK_ENV=development- SESSION_SECRET

如果变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

healthcheck

通过命令检查容器是否健康运行。

healthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3

image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

networks

配置容器连接的网络。

version: "3"
services:some-service:networks:- some-network- other-networknetworks:some-network:other-network:

ports

暴露端口信息。

使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:- "3000"- "8000:8000"- "49100:22"- "127.0.0.1:8001:8001"

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

sysctls

配置容器内核参数。

sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn=1024- net.ipv4.tcp_syncookies=0

ulimits

指定容器的 ulimits 限制值。

例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。

  ulimits:nproc: 65535nofile:soft: 20000hard: 40000

volumes

数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。

该指令中路径支持相对路径。

volumes:- /var/lib/mysql- cache/:/tmp/cache- ~/configs:/etc/configs/:ro

如果路径为数据卷名称,必须在文件中配置数据卷。

version: "3"services:my_src:image: mysql:8.0volumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:

14.5 docker-compose 常用命令

1. 命令对象与格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的使用格式。

docker-compose 命令的基本的使用格式是

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
2. 命令选项
  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
  • --x-networking 使用 Docker 的可拔插网络后端特性
  • --x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
  • --verbose 输出更多调试信息。
  • -v, --version 打印版本并退出。
3.命令使用说明
up

格式为 docker-compose up [options] [SERVICE...]

  • 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

  • 链接的服务都将会被自动启动,除非已经处于运行状态。

  • 可以说,大部分时候都可以直接通过该命令来启动一个项目。

  • 默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。

  • 当通过 Ctrl-C 停止命令时,所有容器将会停止。

  • 如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

  • 默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容


down
  • 此命令将会停止 up 命令所启动的容器,并移除网络

exec
  • 进入指定的容器。

ps

格式为 docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。

选项:

  • -q 只打印容器的 ID 信息。

restart

格式为 docker-compose restart [options] [SERVICE...]

重启项目中的服务。

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

格式为 docker-compose rm [options] [SERVICE...]

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

start

格式为 docker-compose start [SERVICE...]

启动已经存在的服务容器。


stop

格式为 docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

top

查看各个服务容器内运行的进程。


unpause

格式为 docker-compose unpause [SERVICE...]

恢复处于暂停状态中的服务。


15.docker可视化工具

15.1 安装Portainer

官方安装说明:https://www.portainer.io/installation/

[root@ubuntu1804 ~]#docker pull  portainer/portainer[root@ubuntu1804 ~]#docker volume create portainer_data
portainer_data
[root@ubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
20db26b67b791648c2ef6aee444a5226a9c897ebcf0160050e722dbf4a4906e3
[root@ubuntu1804 ~]#docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                            NAMES
20db26b67b79        portainer/portainer   "/portainer"        5 seconds ago       Up 4 seconds        0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   portainer

15.2 登录和使用Portainer

用浏览器访问:http://localhost:9000

卷。


start

格式为 docker-compose start [SERVICE...]

启动已经存在的服务容器。


stop

格式为 docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

top

查看各个服务容器内运行的进程。


unpause

格式为 docker-compose unpause [SERVICE...]

恢复处于暂停状态中的服务。


15.docker可视化工具

15.1 安装Portainer

官方安装说明:https://www.portainer.io/installation/

[root@ubuntu1804 ~]#docker pull  portainer/portainer[root@ubuntu1804 ~]#docker volume create portainer_data
portainer_data
[root@ubuntu1804 ~]#docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
20db26b67b791648c2ef6aee444a5226a9c897ebcf0160050e722dbf4a4906e3
[root@ubuntu1804 ~]#docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                            NAMES
20db26b67b79        portainer/portainer   "/portainer"        5 seconds ago       Up 4 seconds        0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   portainer

15.2 登录和使用Portainer

用浏览器访问:http://localhost:9000

[外链图片转存中…(img-YygJVWgp-1667353704121)]

Docker学习文档(个人向)相关推荐

  1. Docker学习文档之一 安装软件-Linux环境

    由于我没有linux系统,所以还是得靠virtual box来获取一个linux操作系统,如果是linux系统的可以直接跳过这步 首先我们搜索下载Ubuntu的iso镜像文件,一般在官网下载 直接点击 ...

  2. Docker学习文档之三 其他相关-参考

    ###参考链接 Docker在Windows下的安装以及Hello World Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像 Getting Started ...

  3. Docker学习文档之三 其他相关-Dockerfile指令

    ###Dockerfile指令 Docker可以从Dockerfile中一步一步的读取指令来自动的创建镜像,常使用Dockerfile来创建用户自定义的镜像.格式如下:# Comment INSTRU ...

  4. Docker学习文档之三 其他相关-Docker常用命令

    查看容器的root用户密码docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1因为docker容器启动时的root用户 ...

  5. Docker学习文档之三 其他相关-安全性

    ###docker安全性 如果不想我们制作的镜像被别人访问到,则可以将该镜像推送到docker hub的私人仓库中,这样只有登陆该用户的时候才能访问到私有仓库的镜像,具体步骤如下: 进入docker ...

  6. Docker学习文档之三 其他相关-生产环境

    ###测试环境部署和生产环境的部署 在测试完成之后,按照上面的步骤将容器打成对应版本的镜像,然后在生产环境中应该这个镜像,基本上这两个环境进行的内容基本上是一致的,所以很少存在测试环境没问题,部署到生 ...

  7. Docker学习文档之二 搭建环境-Linux环境

    linux中docker部署javaweb 和上面widows中的一样,可以使用Dockerfile,然后build成镜像,再在运行时将linux的部署项目的文件夹通过 -v 挂载到镜像容器中. 也可 ...

  8. Docker学习文档之二 搭建环境-Windows环境

    ###创建镜像和在docker中搭建JavaWeb运行环境 在docker中创建镜像有两种方法: 通过进入容器修改基础镜像之后,使用docker commit <基础镜像ID> <镜 ...

  9. Docker学习文档之一 安装软件-Windows环境

    windows按照docker的基本要求 64为操作系统,win7或者更高 支持" Hardware Virtualization Technology",并且,"vir ...

最新文章

  1. nginx 反向代理跨域访问配置_nginx反向代理配置去除前缀
  2. python cgi库_《Python 数据库 GUI CGI编程》
  3. azure云数据库_如何使用Cloud Shell创建Azure SQL数据库
  4. P2313 [HNOI2005]汤姆的游戏
  5. Chrome 添加印象笔记网页剪辑插件
  6. 那些年,我们一起玩过的儿童游戏
  7. 安卓手机投屏软件_适合智能电视手机投屏的软件
  8. arduino继电器控制风扇_如何基于Arduino制作DHT22控制的风扇
  9. tensorflow,pytorch中normalize方法
  10. Hbuilder X自定义安装微信开发工具无法启动
  11. 教你写Makefile
  12. Kubernetes哪一点最打动你?或者,它发布过的哪一项特性让你认为最厉害?
  13. 【YOLOv5】结合GradCAM热力图可视化
  14. RK3399学习笔记 1.0.3---python环境 Firefly Core-3399pro-jd4 Win10上RKNN工具安装
  15. effective c++条款44 将与参数无关的代码抽离templates
  16. ICLR 2018 有什么值得关注的亮点?
  17. 港中文计算机金融,香港中文大学金融数据分析和风险管理科学硕士专业
  18. apk安装提示:Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=XXX]
  19. 第十四届全国大学生电工数学建模竞赛A题-高比例风电电力系统储能运行及配置分析
  20. 手机如何批量导入通讯录,批量删除通讯录?

热门文章

  1. Shell脚本学习笔记——paste
  2. Android 撕衣服(刮刮乐游戏)
  3. UI设计师未来的4个发展方向
  4. 概率论:方差、标准差、协方差、皮尔逊相关系数、线性相关
  5. 2020届秋招 网易互娱游戏研发工程师面经(已offer)
  6. AI 以 5:0 比分击败美顶级飞行员;经典对抗攻击 Deepfool 原理详解
  7. CC2530接入OneNET-实现数据上传和命令下发
  8. instagram广告的展现形式有哪些?instagram广告投放全球代理商
  9. 戴尔笔记本电脑重装win10开机蓝屏进不去系统怎么办?
  10. python:turtle绘制纸飞机