Docker使用详解

Docker使用详解_第1张图片

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
    

你可能感兴趣的:(docker,容器)