
第 1 章 Docker基础
1.1 docker简介
在这一部分我们主要讲两个方面:
docker是什么、docker特点
1.1.1 docker是什么
docker是什么?
 docker的中文解释是码头工人。
官方解释:
 Docker是一个开源的容器引擎,它基于LCX容器技术,使用Go语言开发。
 源代码托管在Github上,并遵从Apache2.0协议。
 Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
 Docker就是一种快速解决生产问题的一种技术手段,开发,运行和部署应用程序的开放管理平台。
 开发人员能利用docker 开发和运行应用程序
 运维人员能利用docker 部署和管理应用程序
Docker的生活场景对比:
| 物理机 |  | 
| 虚拟机 |  | 
| 容器是 |  | 
单独的理解一下容器:
| 动画片《七龙珠》里面的胶囊 | 1号胶囊启动后的效果 | 
|---|---|
|  |  | 
 Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。
 由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预。
1.1.2为什么使用Docker
 Docker使您能够将应用程序与基础架构分开,以便您可以快速交付软件。
 借助Docker,您可以像管理应用程序一样管理基础架构。
 通过利用Docker的方法快速进行运输,测试和部署代码,您可以显着缩短编写代码和在生产环境中运行代码之间的延迟。
例如:
    开发人员在本地编写代码,可以使用Docker同事进行共享,实现协同工作。
 使用Docker开发完成程序,可以直接对应用程序执行自动和手动测试。
 当开发人员发现错误或BUG时,可以直接在开发环境中修复后,并迅速将它们重新部署到测试环境进行测试和验证。
 利用Docker开发完成后,交付时,直接交付Docker,也就意味着交付完成。后续如果有提供修补程序或更新,需要推送到生成环境运行起来,也是一样的简单。
Docker主要解决的问题:
 保证程序运行环境的一致性;
 降低配置开发环境、生产环境的复杂度和成本;
 实现程序的快速部署和分发。
1.1.3Docker的架构与结构
架构图

Docker是采用了(c/s)架构模式的应用程序
Client dockerCLI :客户端docker命令行
REST API : 一套介于客户端与服务端的之间进行通信并指示其执行的接口
Server docker daemon:服务端dacker守护进程等待客户端发送命令来执行
Docker的四大核心技术
IMAGE-镜像
CONTAINER-容器
DATA VOLUMES-数据卷
NETWORK-网络
结构图

Docker客户端(Docker Client)
Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,通过更改或指定DOCKER_HOST连接远程服务端。
Docker服务端(Docker Server)
Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象(Docker Objects),如镜像、容器、网络、数据卷等
Docker Registries
俗称Docker仓库,专门用于存储镜像的云服务环境.
Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。
Docker 对象(Docker Objects)
镜像:一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
容器:镜像被运行起来后的实例。
网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。
数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。
1.1.4官方资料:
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
Docker 英文文档网址:https://docs.docker.com/
Docker 中文文档网址:http://docker-doc.readthedocs.io/zh_CN/latest/
1.1.4docker特点
三大理念:
构建:龙珠里的胶囊,将你需要的场景构建好,装在一个小胶囊里
运输:随身携带着房子、车子等,非常方便
运行:只需要你轻轻按一下胶囊,找个合适的地方一放,就ok了
优点:
多:    适用场景多
快: 环境部署快、更新快
好: 好多人在用
省: 省钱省力省人工
缺点:
太腻歪人:  依赖操作系统
不善沟通: 依赖网络
不善理财: 银行U盾等场景不能用
1.2 docker快速入门
1.2.1docker历程:
 自2013年出现以来,发展势头很猛,现在可说是风靡全球。
 docker的第一版为0.1.0 发布于2013年03月23日
 Docker2017年改版前的版本号是1.13.1发布于2017年02月08日
    Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月,有点类似于ubuntu的版本发布方式。
    企业版自然会提供一些额外的服务,当然肯定也是收费的。
    企业版说明https://blog.docker.com/2017/03/docker-enterprise-edition/
社区版分为stable和edge两种发布方式。
stable版本是季度发布方式,比如17.03, 17.06, 17.09
edge版本是月份发布方式, 比如17.03, 17.04……


注:
Stable:gives you reliable updates every quarter
(稳定:给你可靠的每季度更新一次)
Edge:gives you new features every month
(优势:每个月给你新特性)
1.2.2 官方要求
为什么用ubuntu学docker
 
图片来源:https://docs.docker.com/engine/installation/#server
docker要求的ubuntu环境

ubuntu下载地址:https://www.ubuntu.com/download/desktop
ubuntu主机环境需求
| 1 | 执行命令 | 
执行效果

1.2.3 部署docker
官网参考:
安装步骤
| 1 | 安装基本软件 | 
网卡区别:
安装前:只有ens33和lo网卡
 
安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1
 
1.2.4 docker加速器
在国内使用docker的官方镜像源,会因为网络的原因,造成无法下载,或者一直处于超时。所以我们使用 daocloud的方法进行加速配置。
加速器文档链接:http://guide.daocloud.io/dcs/daocloud-9153151.html
方法:
访问 https://dashboard.daocloud.io 网站,登录 daocloud 账户
 
点击右上角的 加速器

在新窗口处会显示一条命令,

| 1 | 我们执行这条命令 | 
1.2.5 docker 其他简介
docker的基本命令格式:
| 1 | 基本格式 | 
删除docker命令:
| 1 | sudo apt-get purge docker-ce -y | 
docker基本目录简介:
| 1 | /etc/docker/ #docker的认证目录 | 
docker常见问题:
背景
 因为使用的是sudo安装docker,所以会导致一个问题。以普通用户登录的状况下,在使用docker images时必须添加sudo,那么如何让docker免sudo依然可用呢?
理清问题
 当以普通用户身份去使用docker命令时,出现以下错误:
| 1 | Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/images/create?fromSrc=-&message=&repo=ubuntu-16.04&tag=: dial unix /var/run/docker.sock: connect: permission denied | 
 可以看都,最后告知我们时权限的问题。那么在linux文件权限有三个数据左右drwxrwxrwx,其中第一为d代表该文件是一个文件夹前三位、中三位、后三位分别代表这属主权限、属组权限、其他人权限。

 上图是报错文件的权限展示,可以看到其属主为root,权限为rw,可读可写;其属组为docker,权限为rw,可读可写。如果要当前用户可直接读取该文件,那么我们就为docker.sock 添加一个其他用户可读写权限 或者添加1个用户组就可以了
方法1:一劳永逸
| 1 | 如果还没有 docker group 就添加一个: | 
方法2:
| 1 | 每次启动docker或者重启docker的之后 | 
方法3:每条命令前面加上sudo
总结
Docker 安装方法
- 下载客户端安装
- 命令行安装
1.3 docker安装和卸载
安装
| 1 | 1. 安装基本软件 | 
卸载
| 1 | 删除docker | 
docker加速器设置 -> 可选
| 1 | 访问 https://dashboard.daocloud.io 网站,登录 daocloud 账户 | 
1.4 权限问题
| 1 | 只需要设置一次 | 
1.5 docker服务相关操作命令
| 1 | docker服务器关闭 | 
2. docker镜像管理
2.1 镜像的搜索/获取/查看
- 镜像搜索- 1 
 2
 3
 4
 5
 6
 7
 8
 9- 命令 
 docker search 镜像名称
 字段关键字
 NAME: 镜像的名字
 DESCRIPTION: 对镜像的描述
 STARS: 下载量
 OFFICIAL: 是不是官方发布 的
 AUTOMATED: 是不是自动启动镜像中携带的程序
 举例: 在一个镜像中安装了nginx, 启动镜像的时候nginx是否跟随启动
- 获取镜像 - 1 
 2
 3
 4- 下载远程仓库(如Docker Hub)中的镜像 
 docker pull 镜像名称
 镜像存储目录
 /var/lib/docker/image
- 查看镜像 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- 命令 
 查看所有的镜像
 docker images
 docker image ls
 查看某个镜像
 docker images 镜像的名字
 docker image ls 镜像的名字
 字段关键字
 REPOSITORY: 镜像的名字, 不是唯一的
 TAG: 镜像的版本, latest代表最新的版本
 IMAGE ID: 镜像的ID, 这是唯一的
 CREATED: 镜像创建的时间
 SIZE: 镜像大小
2.2 镜像重命名/删除
- 镜像重命名 - 1 
 2- docker tag 源镜像名:tag 新的名字:tag 
 重命名并不会重新复制一个镜像
- 删除镜像 - 1 
 2
 3
 4- docker rmi 镜像名/镜像ID 
 注意事项:
 如果镜像被重命名了, 通过镜像ID是不能直接删除的
 如果镜像被重命名了2次, 需要删除两次镜像才会被删除
2.3 镜像的导入导出
- 镜像导入 - 1 
 2- docker load -i/--input 要导入的镜像文件的名字 
 docker load < 要导入的镜像文件的名字
- 镜像导出 - 1 - docker save -o/--output 导出之后的镜像名(自己起名) 要导出的镜像的镜像名/镜像ID 
2.4 镜像的历史和详细信息
- 查看镜像的历史信息 - 1 
 2- 制作镜像的时候的操作步骤 
 docker history 镜像名/镜像ID
- 查看镜像的详细信息 - 1 
 2
 3- 镜像的属性信息, 以json格式输出的 
 docker inspect 镜像名/镜像ID
 docker inspect -f {{.}} 镜像名/镜像ID
2.6 总结

3. docker容器管理
docker将镜像文件启动, 得到一个容器, 一个容器可以被看做一个操作系统
3.1 容器的查看/创建/启动
- 容器查看 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- 命令 
 docker ps # 查看运行状态的容器
 docker ps -a # 查看所有状态的容器
 字段关键字
 CONTAINER ID: 容器的ID
 IMAGE: 镜像名, 容器是基于那个镜像启动的
 COMMAND: 内部执行的命令
 CREATED: 容器被创建的时间
 STATUS: 当前容器的状态: 运行, 暂停, 停止
 PORTS: 容器对外的端口
 NAMES: 创建出来的容器的名字, 没指定这个名字是随机的
- 容器创建 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- 容器被创建, 但是还不能使用, 需要启动 
 docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
 - OPTIONS: 创建容器的一些参数
 -i, --interactive: 容器是否和标准输入进行关联
 -t, --tty: 创建容器的时候是不是给容器管理虚拟终端
 --rm: 容器停止之后是否会自动销毁
 --name: 给创建的容器指定一个名字, 如果不指定, 名字是随机生成的
 - IMAGE: 镜像名/镜像ID
 - [COMMAND] [ARG...]
 启动容器之后, 在容器中执行一个命令
 - 不知道指定什么命令, 指定bash
 - 容器中装了redis
 redis-server
- 容器启动 - 启动创建的容器 - 1 
 2
 3
 4
 5
 6
 7- docker start 参数 容器的名字 
 - 参数:
 a: 关联标准输出/标准错误
 i: 关联标准输入
 应用场景:
 - 创建了一个容器, 需要启动
 - 容器的运行被终止stop, 可以再次启动
- 创建新容器并启动 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- 创建并运行容器 run == create + start 
 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 - OPTIONS:
 -i, --interactive: 容器是否和标准输入进行关联
 -t, --tty: 创建容器的时候是不是给容器管理虚拟终端
 --rm: 容器停止之后是否会自动销毁
 --name: 给创建的容器指定一个名字, 如果不指定, 名字是随机生成的
 -d, --detach: 容器启动之后是守护进程, 容器启动之后, 不能直接进入到容器内部
 - IMAGE: 容器名字/容器ID
 - [COMMAND] [ARG...]
 启动容器之后, 在容器中执行一个命令
 - 不知道指定什么命令, 指定bash == /bin/bash
 - 容器中装了redis
 redis-server
 
3.2 容器的暂停/重启
- 暂停 - 1 - docker pause 容器名/容器ID 
- 取消暂停 - 1 - docker unpause 容器名/容器ID 
- 重启 - 1 
 2
 3
 4- docker restart [OPTIONS] CONTAINER [CONTAINER...] 
 - OPTIONS:
 -t: 延时重启, 默认10s
 - CONTAINER: 容器名/ 容器ID
3.3 容器的关闭/终止/删除
- 关闭 - 1 
 2
 3- 延时关闭容器, 默认10s 
 docker stop
 docker stop -t 19 # 指定延时关闭的时间
- 终止 - 1 
 2- 直接马上关闭 
 docker kill
- 删除 - 删除未运行的容器 - 1 - docker rm 容器名/容器ID 
- 删除运行的容器 - 1 - docker rm -f 容器名/容器ID 
- 批量删除容器 - 1 
 2- docker rm $(docker ps -aq) 
 docker rm `docker ps -aq` # 反单引号波浪号对应的键, esc下面的键
 
3.4 容器的进入/退出
- 进入容器 - 创建并进入 - 1 - docker run -it --name 容器名 镜像名 shell命令 
- 手动进入 - 1 
 2- docker run -itd --name 容器名 镜像名 shell命令 
 docker exec -it 容器名/容器ID bash
 
- 退出容器 - 1 
 2- exit 
 ctrl+d
3.5 容器的日志/信息/端口/重命名
- 查看容器的日志信息 - 1 - docker logs 容器名/容器ID 
- 查看容器的详细信息 - 1 
 2
 3
 4
 5
 6- https://yq.aliyun.com/articles/230067 
 查看镜像的详细信息
 docker inspect 镜像名/镜像ID
 查看容器详细信息
 docker inspect 容器名/容器ID
 docker inspect -f {{.NetworkSettings.Networks.bridge.Gateway}} 73b8e3d09e6c
- 查看容器的端口信息 - 1 
 2- 查看本机和容器的端口映射 
 docker port 容器名/容器ID
- 容器重命名 - 1 - docker rename 旧的容器名 新的容器名 
3.6 总结

