docker常用知识

Docker

Docker 基础

docker 介绍

docker 是一个开源的应用容器引擎,是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间,容器与容器之间隔离的更加彻底.每个容器会有自己的权限管理,独立的网格与存储栈,以及自己的资源管理,能使一台宿主机上可以友好的共存多个容器.

docker架构

核心组件:

  • 客户端[也就是 linux 终端,通过 linux 命令进行操作]
  • dokcer 服务器,是一个守护进程[守护进程是不能和用户交互的,在后台运行.用来管理容器和镜像]
  • docker 镜像[可执行程序].镜像可以启动,启动之后就是一个容器.一般不需要我们制作镜像,直接从 registry 仓库中拉下来使用
  • docker 容器[docker 只占用磁盘资源,启动之后占用的是内存和 cpu 资源]
  • 镜像仓库

docker 的基本使用

  • 查看 docker 版本

           ```docker version```
    
  • 配置加速器

           以 mac 为例:
    
            https://dashboard.daocloud.io/  进入DaoCloud注册登录后点击小火箭可以找到对应的配置 docker 镜像站的镜像地址.打开 docker桌面版,点击设置按钮可以进入到preference,选择 docker engine .将以下代码复制到 json 文件内后选择apple&restart 即可
    
"registry-mirrors": [
    "http://f1361db2.m.daocloud.io"
  ]

docker 镜像管理

  • 镜像的搜索

    docker search 镜像名

    输出解释:

    • NAME: 镜像名字
    • DESCRIPTION: 镜像描述
    • STARS: 下载量
    • OFFICIAL: 是否为官方出品[ok]代表为官方的
    • AUTOMATED: 是不是自动化编译出来的,自动化是指通过 dockerfile 制作的
  • 镜像的获取[可以指定具体版本,不指定则拉取最新版本 latest]

    docker pull 镜像名:版本
    
  • 镜像的查看[如果要查看指定镜像,后面跟上镜像名]

    docker images (镜像名)或者 docker image ls (镜像名)

    输出解释:

    • REPOSITORY: 仓库
    • TAG: 版本[latest 为最新版本]
    • IMAGE ID: 镜像 id,唯一的
    • CREATED: 镜像的创建时间
    • SIZE: 镜像的大小
  • 镜像别名

    docker tag source_image:版本 target_image:版本

  • 删除镜像

    docker rmi镜像名或镜像id

    需要注意:

    如果给镜像起过别名就不可以用 id 去删除,因为同一个 image id 下面有多个 image.只删一次的话不是删除的镜像,只有指定镜像名的那一条被删除了,另一条依旧存在.当镜像没有被引用时才会被删除

  • 镜像导出[导出镜像,不能修改镜像]

     docker save [-o 或者--output] 导出后的镜像tar文件名字以img结尾 镜像
    
  • 镜像导入

    docker load [-i或者--input ] 通过 save 导出之后的镜像tar 文件的名字
    或者
    docker load > 通过 save 导出之后的镜像名
    
  • 镜像历史信息[也就是制作镜像的操作步骤]

    docker history 镜像名或镜像 id
    
  • 镜像的详细信息[也就是镜像的属性信息,以 json 格式输出]

    docker inspect [-f或者--format 格式化输出][-s 或者--size 输出镜像的大小也就是 docker images 里得 size][--type 返回时指定类型,默认是 json] 镜像名或镜像 id
    例如:docker inspect -f {{.}} 镜像名   只输出 value 没有 key 可以通过{{}}获取指定键值对的值.   这里.代表当前镜像,也就是最外层的 json,{{.containerconfig.hostname}} 就可以获取到 hostname 的值了
    

docker 容器管理

  • 查看容器

    docker ps [-a 或--all如果没有-a 只能显示正在运行的,有了-a 显示所有状态的][-q 或--quiet只显示容器的 id]
    

    输出解释:

    • CONTAINER ID: 容器启动之后的ID,这个ID是唯一的

    • IMAGE: 这个容器是通过哪个镜像启动起来的,对应的是镜像的名字[镜像名:版本]

    • COMMAND: 镜像启动之后,默认执行的第一个命令

    • CREATED: 容器创建时间

    • STATUS: 容器当前状态

      - 运行 up

      - 刚被创建 created

      - 停止Exited

      - 暂停 pauses

    • PORTS: 容器和宿主机对应的映射端口

    • NAMES: 容器启动之后的名字,启动镜像的时候没有指定名字,会自动指定

  • 创建容器[容器被创建,但是还不能使用,需要启动]

    docker create [-i 或者--interactive][-t 或者--tty][--rm][--name] 镜像名 [command容器启动之后,指定一个默认执行的 shell 命令,根据实际情况指定,如果什么都不做就写 bash]
    参数解释:
    -i: 创建的容器是否关联标准输入[也就是是否和终端进行交互]
    -t: 是否给这个容器分配终端
    --rm: 容器被停止(关闭)之后,是否自动删除容器
    --name: 创建容器的时候给容器起名,如果没指定会随机生成
    
  • 启动容器

    docker start 参数 容器名字/容器 id参数解释:a: 关联标准输出和标准错误i: 关联表示标准输入应用场景:1. 容器创建后启动2. 容器被关闭或者停止后重新启动
    
  • 创建并启动容器

    docker run 参数 镜像 [command]参数解释:-i: 创建的容器是否关联标准输入[也就是是否和终端进行交互]-t: 是否给这个容器分配终端--rm: 容器被停止(关闭)之后,是否自动删除容器--name: 创建容器的时候给容器起名,如果没指定会随机生成-d 或者--detach 容器运行后是不是守护进程
    
  • 暂停容器

    docker pause 容器名/容器id
    
  • 取消暂停

    docker unpause 容器名/容器id
    
  • 重启

    docker restart 容器名/容器id
    
  • 关闭容器[延时关闭,默认为 10s],可以停止一个或多个容器,多个容器以空格分隔

    docker stop [-t 多少秒之后杀死容器的进程] 容器名/容器id
    
  • 终止容器[马上关闭,没有延时]

    docker kill 容器名/容器id
    
  • 删除容器

    # 删除未运行的容器[非 up 状态]docker rm 容器名/容器id# 删除运行中的容器docker rm -f 容器名/容器 id参数解释:-f 或者--force-l 或者--link-v 或者--vloumes# 批量删除容器[需要多个命令的集合]docker rm -f $(docker ps -aq)
    

$()或者``里放 shell 命令可以在其他命令里执行该命令,并把结果返回给前面的函数

  • 进入容器

    docker exec -it 容器 [command]参数解释:-i: 创建的容器是否关联标准输入[也就是是否和终端进行交互]-t: 是否给这个容器分配终端
    
  • 退出容器

    通过 exec 进来就不可以使用 ctrl+c 退出而是使用 exit 退出或者快捷键 ctrl+d
    
  • 查看容器的日志信息

    docker logs 容器名/容器id
    
  • 查看容器的详细信息

    docker inspect 容器名/容器id
    
  • 查看容器的端口信息[需要在启动容器时指定映射才能看到.因为容器之间是隔离的,容器和宿主器之间是没办法通信的,如果要通信需要通过网络进行端口映射,指定哪个端口可以和外部进行通信]

    docker port 容器名/容器id
    
  • 容器重命名

    docker rename 容器名 新名字
    
  • 导出容器[该导出方式导出后可以修改镜像]

    docker export 容器名 > 导出的镜像名
    
  • 导入容器

    cat 要导入的镜像文件名 | docker import - 导入的新镜像的名字
    

区别:

通过容器导入的镜像可以指定名字,image id 也会分配一个新的,size 比镜像导入要小[是因为文件大小发生了变化,所以镜像的哈希值也会发生变化 ]

通过容器export导出时会把历史记录删除,镜像导出 save 不会

并不是通过容器导出的只能容器的方法导入,是可以交替使用的

Docker高级

数据拷贝[容器好宿主机之间]

docker cp 宿主机目录/文件 容器名/容器id:容器路径docker cp 容器名/容器id:容器路径 宿主机目录/文件 

数据卷的使用

数据卷: 宿主机的存储目录,该目录在宿主机和 docker 容器之间共享数据

要将目录中的数据和 docker 容器进行数据共享,也叫做挂载数据卷

挂载的时机:

  1. 容器被创建的时候 create
  2. 容器被创建并运行的时候 run

指定设置挂载数据卷使用通过-v 或者--volume 参数 宿主机路径:容器路径

宿主机路径必须是绝对路径

如果宿主机路径不存在会自动创建

如果容器路径不存在也会自动创建

例如:

docker run -it --name 容器名 -v 宿主机路径:容器路径:权限[默认为 rw 读写]

权限问题:

通过-v 进行数据卷挂载,默认时读写的挂载方式

rw 为读写,ro 为只读,可以修改容器对挂载目录的权限

既可以挂载文件也可以挂载目录

数据卷容器的使用

数据卷容器就是一个普通的容器,在这个容器中提供了一个挂载目录(共享目录)

只要被创建出来的容器就可以被作为数据卷容器使用

创建数据卷容器
docker create -itd --name 容器名 -v 挂载目录[没有会自动创建] 镜像名 [shell命令command]
数据卷容器的挂载使用

参数: --volumes-form 数据卷容器的名字/数据卷容器的 id

小例子:

# 1. 创建数据卷容器docker run -itd --name data_sheet -v /share_dir ubuntu:18.04 bash# 2. 启动测试容器1,挂载到数据卷容器docker run -itd --name test1 [ --volumes-from data_sheet指定数据卷容器] ubuntu:18.04镜像名 bash# 3. 启动测试容器2,挂载到数据卷容器docker run -itd --name test2 --volumes-from data_sheet ubuntu:18.04 bash # 4. 测试数据是否共享进入 test1 的终端:docker exec -it 593ca01feca1 bash并在 test1 的 share_dir 中新建一个文件 hello,内容为 hello进入 test2 的终端,检查文件以及内容是否正确:docker exec -it d16524efb984 bash
数据卷容器数据备份

因为容器可能会被我们误删,如果误删了数据也跟着丢了.所以我们需要将数据卷容器中的数据进行备份

  1. 创建一个临时新容器,挂载到数据卷容器上,和宿主机目录形成映射关系

    docker run -itd --name data_copy3 --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 bash# 注意: 和宿主机共享数据的目录不能和挂载数据卷容器的名字一样,否则文件夹中默认是宿主机文件夹里得内容,会覆盖掉数据卷中的
    
  2. 进入到该容器data_copy中

    docker exec -it d8009a6970e4 bash
    
  3. 将数据卷容器的/share_dir中的内容拷贝到该容器的/share_dir中

    如果数据量大使用 tar先进行打包tar -cvf 打包文件.tar 被打包的文件/路径...tar -zcvf /share_dir2/share_dir.tar.gz share_dir以下是压缩的内容:share_dir/share_dir/a.txt
    
  4. 备份完该容器就没用了,直接删除就可以了

    docker stop d8009a6970e4docker rm d8009a6970e4
    

这四步操作也可以一步完成:

docker run -itd --name data_copy4 --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 tar -zcvf /share_dir2/share_dir.tar.gz share_dir
数据卷容器数据还原
# 如果是之前压缩过了则需要解压缩tar -zxvf 压缩文件.tar.gz -C 解压目录docker run -itd --name data_store --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 tar zxvf /share_dir2/share_dir.tar.gz -C /share_dir

docker网络管理[了解]

docker 端口映射

docker 容器和外界是隔离的,如果要和外界通信需要 tcp 网络通信,通信需要绑定端口

  • 随机端口映射

    # 在宿主机随便找一个没有被占用的空闲端口和容器的 80 端口进行映射[也就是 nginx 的默认端口]docker run -itd -P nginx 
    
  • 指定端口映射/指定多端口映射[宿主机的 ip:宿主机的端口:容器的端口或者宿主机的端口:容器的端] 多个端口映射直接追加-p 即可

    端口必须是空闲端口

docker run -itd -p 1216:80 nginx
网络管理命令
docker network commandcommands:    connect: 将指定的容器加入到指定的网络中    create: 创建一个网络    disconnect: 将容器从一个网络中删除    inspect: 查看网络的详细信息    ls: 查看当前网络    prune: 删除所有的没有被使用的网络.没有被使用不代表没用,该功能慎用    rm: 删除一个或多个指定的网络

你可能感兴趣的:(docker常用知识)