Docker基础一篇就足够

Docker

  • 简介

虚拟机实现了硬件上的虚拟,而Docker则实现了操作系统级别的虚拟;其应用场景:

  • Web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;

当运行容器时,使用的镜像如果在本地不存在,docker就会自动从docker镜像仓库中下载,默认是从Docker Hub公共镜像源下载

  • 原理
    • Docker引擎如下图

在这里插入图片描述

* Sever是一个常驻进程;
* REST API实现了client和server间的交互协议;
* CLI实现容器和镜像的管理,为用户提供统一的操作界面;

在这里插入图片描述

  • 镜像

    **docker镜像就是一个只读的模板**,例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了Apache或用户需要的其它应用程序。**镜像可以用来创建docker容器,一个镜像可以创建很多容器**。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用;
    

在这里插入图片描述

图右边有多个只读层,它们重叠在一起,除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节, 并且能够在docker宿主机的文件系统上访问到。统一文件系统技术就是将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统;

  • 仓库

    集中存放镜像文件的场所,仓库的概念跟Git很相似,注册服务器可以理解为GitHub这样的托管服务;实际上,**仓库注册服务器上存放着多个仓库,每个仓库中又包含多个镜像,每个镜像有不同的标签(tag)**;
    
  • 容器

    **docker利用容器来运行应用,容器是从镜像创建的实例**,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台;**可以把容器看做一个简易版的Linux环境**(包括root权限、进程空间、用户空间和网络空间等)**和运行在其中的应用程序**;
    

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的;
在这里插入图片描述
一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程;一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层;

在这里插入图片描述

  • 构建镜像

    • docker commit 通过容器构建
docker commit [options] container
  -a author
  -m message
  -p pause
  • docker build 通过Dockerfile文件构建

  • 镜像操作:

docker pull <image-name>    //获取镜像
docker push    //上传镜像
docker images  //查看本地镜像列表
docker rmi <image-id>    //删除镜像
//镜像保存 创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一层都保存了它们的元数据,这个命令只能对镜像生效;
docker save <image-id>  
  • 镜像获取操作:
//利用Dockerfile来创建镜像
docker build
//通过容器构建镜像(即将容器的读写层转换为一个只读层,这样就把一个容器转换成了一个不可变的镜像)
docker commit <container-id> 
  • 容器操作:
docker create <image-id>  //创建容器,即为指定的镜像添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行
docker start <container-id>  //启动容器 docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间;
docker exec <container-id>   //进入容器
docker stop <container-id>  //停止容器
docker rm  <container-id>    //删除容器
/*
运行容器,docker run就是docker create和docker start两个命令的组合,支持的参数也是一致的。如果指定容器已经存在会报错,可以增加--rm参数实现容器退出时自动删除
docker ps      //查看正在运行的容器列表,加上-a参数显示所有容器
*/
docker run  <container-id>   
//导出容器 创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,值保存了当前统一视角看到的内容。export后的容器在import到Docker中,只有一个容器当前状态的镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像;
docker export <container-id> 
docker rmi <container-id> //删除容器
  • 特殊操作:
docker inspect   // 提取出容器或者镜像最顶层的元数据
docker run -d -P|[-p 访问端口:绑定端口] [--name 别名] Image command
  /*
    -P: 是容器内部端口随机映射到主机的高端口
    -p: 是容器内部端口绑定到指定的主机端口
  */
  • docker容器连接

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息;并且docker连接会创建一个父子关系,其中父容器可以看到子容器的信息;


Docker-compose

  • docker-compose 用来做docker的多容器控制。使用docker-compose进行部署特点如下
    • Dockerfile 定义应用的运行环境
    • docker-compose.yml 定义组成应用的各服务
    • docker-compose up 启动整个应用
docker-compose up -d <appliaction-name> //创建并启动容器应用
  • docker-compose.yml文件解析

一份标准配置文件应该包含version、services、networks三大部分,其中最关键的就是services和networks两个部分;compose文件是一个定义服务、网络和卷的YAML文件,默认路径是./docker-compose.yml
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动之时执行构建任务,这个构建标签就是build,它可以指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像启动服务器;也可以是相对路径;

  • FROM

    放在Dockerfile的第一行,告诉Docker使用哪个镜像作为基础;

  • RUN

    每个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base。一个Dockerfile中可以包含多个RUN,按定义顺序执行。RUN都是启动一个容器、执行命令、然后提交存储层文件变更。每一条RUN的语句命令的执行都是独立的,如果需要将两条命令或者多条命令联合起来执行需要加上&&

  • CMD

    作为执行container时候的默认行为(容器默认的启动命令),当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令;一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用;

  • EXPOSE

    声明运行时容器提供的服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在Dockerfile中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,会自动随机映射EXPOSE的端口;

  • ADD & COPY

    当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中。ADD和COPY的源必须在context路径下,它们的区别主要有两点:
    ADD指令可以从一个URL地址下载内容复制到容器的文件系统中;
    ADD指令会将压缩打包格式的文件解开后复制到指定位置,而COPY只做复制操作;

  • WORKDIR

    设置CMD指明的命令的运行目录
    
  • VOLUME

用于在容器中创建一个或多个卷,而更多的时候,是在执行docker run时指定要创建的卷以及本地路径来进行映射;

docker-copmose build 创建或者重新创建服务使用的镜像,后面指定的服务的名称,创建之后的镜像名为project_service,即项目名后跟服务名;与docker build一样,执行的时候也需要Dockerfile文件,当修改了Dockerfile文件或它的上下文之后,可以运行docker-compose build重新创建镜像,此时无需指定服务名称

docker-compose ps  //查看当前项目下的容器
docker-compose port  //查看服务中的端口被映射到了宿主机的哪个端口上,使用这条命令时必须通知指定服务名称和内部端口
docker-compose logs  //查看service的日志
docker-compose pause  //暂停服务
docker-compose kill  //通过向容器SIGKILL信号强行停止服务
docker-compose pull  //拉取服务依赖的镜像
docker-compose restart  //重启某个服务的所有容器。只有正在运行的服务才能重启,停止的服务不能使用restart命令
  • 数据卷是一个或多个容器专门指定绕过Union File System的目录,为持续性或共享数据提供一些有用的功能,比如:
    • 数据卷可以在容器间共享和重用
    • 数据卷数据改变是直接修改的
    • 数据卷数据改变不会被包括在容器中
    • 数据卷是持续性的,直到没有容器使用它们

容器名称必须唯一,即你只能命名一个叫test的容器。如果你想复用容器名,则必须在创建新的容器前通过docker rm删除旧的容器或者创建容器时添加–rm选项;
链接允许容器间安全通信,使用–link选项创建链接;容器间的链接实际上允许一个源容器提供信息访问给一个接收容器。Docker创建了一个安全隧道而不需要对外公开任何端口给外部容器,因此不需在创建容器的时候添加-p或-P指定对外公开的端口;
Docker主要通过以下两种方式提供连接信息给接收容器:

  • 环境变量
  • 更新/etc/hosts文件

/etc/hosts文件在源容器被重启之后会自动更新IP地址,而环境变量中的IP地址则不会自动更新的;

退出docker容器

exit;

docker进入mysql

docker exec -it <name> bash  //进入容器
mysql -uroot -p   //启动mysql 接下来输入密码

docker进入Kafka

docker exec -it <name> /bin/bash  //进入容器
发布了622 篇原创文章 · 获赞 150 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/feizaoSYUACM/article/details/89455472