第 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
2docker tag 源镜像名:tag 新的名字:tag
重命名并不会重新复制一个镜像删除镜像
1
2
3
4docker rmi 镜像名/镜像ID
注意事项:
如果镜像被重命名了, 通过镜像ID是不能直接删除的
如果镜像被重命名了2次, 需要删除两次镜像才会被删除
2.3 镜像的导入导出
镜像导入
1
2docker 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
7docker 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
4docker 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
2docker rm $(docker ps -aq)
docker rm `docker ps -aq` # 反单引号波浪号对应的键, esc下面的键
3.4 容器的进入/退出
进入容器
创建并进入
1
docker run -it --name 容器名 镜像名 shell命令
手动进入
1
2docker run -itd --name 容器名 镜像名 shell命令
docker exec -it 容器名/容器ID bash
退出容器
1
2exit
ctrl+d
3.5 容器的日志/信息/端口/重命名
查看容器的日志信息
1
docker logs 容器名/容器ID
查看容器的详细信息
1
2
3
4
5
6https://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 旧的容器名 新的容器名