Bootstrap

Docker使用详解

在这里插入图片描述

Docker 在运行时分为 Docker 引擎(服务端守护进程)客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具Docker 引擎 进行交互。

Client客户端

Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。

Host主机

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Image镜像

简单的理解,Docker 镜像就是一个 Linux 的文件系统,这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据。

通过镜像启动一个容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。

Docker 把 App 文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:

  • 多个 App 可以共用相同的底层镜像(初始的操作系统镜像);

  • App 运行时的 IO 操作和镜像文件隔离;

  • 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个 App 镜像可以用来运行无数个不同业务的容器。

Container容器

镜像(Image)和容器(Container)的关系,就像是程序和进程一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

镜像分层

Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。

新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

总结下来就是:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

Volume数据卷

实际上我们的容器就好像是一个简易版的操作系统,只不过系统中只安装了我们的程序运行所需要的环境,前边说到我们的容器是可以删除的,那如果删除了,容器中的程序产生的需要持久化的数据怎么办呢?容器运行的时候我们可以进容器去查看,容器一旦删除就什么都没有了。

所以数据卷就是来解决这个问题的,是用来将数据持久化到我们宿主机上,与容器间实现数据共享,简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产生的数据就可以持久化了,比如我们的数据库容器,就可以把数据存储到我们宿主机上的真实磁盘中。

Registry注册中心

Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像。

Docker 公司提供了公共的镜像仓库 https://hub.docker.com(Docker 称之为 Repository)提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签对应该软件的各个版本。我们可以通过 「<仓库名>:<标签>」 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 「latest」 作为默认标签。

Docker命令
1.服务相关命令
#启动docker服务
systemctl start docker

#停止docker服务
systemctl stop docker

#重启docker服务
systemctl restart docker

#查看docker服务状态
systemctl status docker

#查询命令使用方法
docker 指定命令 --help
2.镜像相关命令
  • 查看镜像: 查看本地所有的镜像

    docker images
    docker images –q # 查看所用镜像的id
    
  • 搜索镜像:从网络中查找需要的镜像

    docker search 镜像名称
    
  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。

    docker pull 镜像名称
    
  • 删除镜像: 删除本地镜像

    docker rmi 镜像id # 删除指定本地镜像
    docker rmi `docker images -q` # 删除所有本地镜像
    
3.容器相关命令
  • 创建容器

    docker run 参数 指定镜像:指定版本 /bin/bash(在容器内执行的shell脚本,默认是/bin/bash)
    
  • 退出容器

    容器内输入exit
    
  • 查看当前正在运行的容器

    docker ps 参数
    
  • 进入容器

    docker exec 参数 容器名称 /bin/bash#退出容器时,容器不会关闭
    
  • 停止容器

    docker stop 容器名称
    
  • 启动容器

    docker start 容器名称
    
  • 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除

    docker rm 容器名称
    docker rm `docker ps -aq` #删除所有容器
    
  • 查看容器信息

    docker inspect 容器名称
    
  • 导出容器为镜像

    docker export 容器名 > 导出位置
    
  • 容器参数说明($PWD可以获取当前目录的绝对路径)

    • -i:允许你对容器内的标准输入 (STDIN) 进行交互。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
    • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭
    • -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
    • –name:为创建的容器命名
    • -a :查看所有容器
    • -p:设置端口映射,如:-p 3307:3306 将宿主机的3307端口与容器的3306端口映射
    • -e 设置名=设置值:设置环境变量
4.数据卷相关命令
  • 创建容器时,使用-v参数设置数据卷

    docker run ... -v 宿主机目录(文件):容器内目录(文件)...
    #1.目录必须是绝对路径
    #2.如果目录不存在,会自动创建
    #3.可以挂载多个数据卷(一个-v挂载一个数据卷)
    
5.数据卷容器相关命令

配置数据卷容器步骤:

  1. 创建数据卷容器,并给此容器挂载数据卷

    docker run -it --name=容器名 -v 容器内目录(用此方式创建宿主机会自动分配一个目录当数据卷) ...
    
  2. 创建使用该数据卷容器的容器

    docker run ... --volumes-from 依赖的数据卷容器名
    
镜像制作
容器转为镜像
docker commit 容器id 自定义镜像名称:自定义版本号 #将容器转为镜像
docker save -o 压缩文件名称 自定义镜像名称:自定义版本号 #将镜像转为压缩文件
docker load -i 压缩文件名称 #将压缩文件还原成镜像
docker import 压缩文件名称 自定义镜像名称:自定义版本号 #将压缩文件还原成镜像
#docker import:丢弃了所有的历史记录和元数据信息,仅保存容器当时的快照状态。在导入的时候可以重新制定标签等元数据信息
#docker load:将保存完整记录,体积较大
Dockerfile(更常用)
关键字作用备注
FROM指定父镜像指定dockerfile基于那个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell
  1. 编写dockerfile文件

    • 用vim新建并编写dockerfile文件
  2. 根据dockerfile文件新建镜像

    docker build -f dockerfile文件路径 -t 新镜像名称:版本 .
    #.的作用是指定dockerfile文件所在目录,以及指定构建上下文,由于设定了-f选项所以只生效第二个功能
    
Docker Compose实现服务编排

Docker Compose是一个外部工具,可以使用Docker Compose来按一定顺序启动Docker容器,从而实现服务编排。

Docker Compose使用yml文件来做到按顺序启动Docker容器。

  • 安装Docker Compose

    # Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
    curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    # 设置文件可执行权限 
    chmod +x /usr/local/bin/docker-compose
    # 查看版本信息 
    docker-compose -version
    
  • 卸载Docker Compose

    # 二进制包方式安装的,删除二进制文件即可
    rm /usr/local/bin/docker-compose
    

docker-compose.yml文件基础配置

version: '版本号'
services:
  自定义容器1名:
   image: 该容器使用的镜像:镜像版本
   ports:
    - 宿主机端口:容器映射的端口
   links:
    - 链接到的另一个容器
   volumes:
    - 宿主机目录1:容器内目录1 #配置的数据卷,可配置多个
    - 宿主机目录2:容器内目录2
  自定义容器2名:
    image: 该容器使用的镜像:镜像版本
    expose:
      - "暴露端口"
Docker Compose使用步骤
  1. 创建docker-compose目录并进入该目录

  2. 利用 Dockerfile 定义运行环境镜像

  3. 用vim新建并编写docker-compose.yml文件

  4. 在有docker-compose.yml文件的目录下 使用docker-compose 启动容器

    docker-compose up
    
Docker 私有仓库
  • 私有仓库搭建

    # 1、拉取私有仓库镜像 
    docker pull registry
    # 2、启动私有仓库容器 
    docker run -id --name=registry -p 5000:5000 registry
    # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
    # 4、修改daemon.json   
    vim /etc/docker/daemon.json    
    # 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
    {"insecure-registries":["私有仓库服务器ip:5000"]} 
    # 5、重启docker 服务 
    systemctl restart docker
    docker start registry
    
  • 将镜像上传至私有仓库

    # 1、标记镜像为私有仓库的镜像     
    docker tag centos:7 私有仓库服务器IP:5000/centos:7
     
    # 2、上传标记的镜像     
    docker push 私有仓库服务器IP:5000/centos:7
    
  • 从私有仓库拉取镜像

    #拉取镜像 
    docker pull 私有仓库服务器ip:5000/centos:7
    
;