文章目录
  1. 1 概述
    1. 1.1 传统部署方案的困惑
    2. 1.2 Docker 的优势
    3. 1.3 Docker 的架构
    4. 1.4 Docker 的作用
      1. 1.4.1 使用场景
      2. 1.4.2 支持的操作
    5. 1.5 Docker 的版本
  2. 2 Docker 的安装
    1. 2.1 CentOS 的版本要求
    2. 2.2 安装 Docker
    3. 2.3 当前用户加入 Docker 用户组
    4. 2.4 镜像加速
    5. 2.5 启动 Docker 服务器
    6. 2.6 查看 Docker 版本
  3. 3 镜像的使用(Image)
    1. 3.1 使用公共镜像
    2. 3.2 修改公共镜像
    3. 3.3 创建全新镜像
    4. 3.4 发布镜像
  4. 4 容器的使用(Container)
    1. 4.1 运行容器
    2. 4.2 列举进程
    3. 4.3 容器状态
    4. 4.4 run 命令详解
      1. 4.4.1 短暂性运行容器
      2. 4.4.2 交互式运行容器
      3. 4.4.3 后台模式运行容器
  5. 5 Docker 私服

Docker 是世界领先的软件容器化平台,它极大地方便了应用程序的构建、发布和运行。本文总结了 Docker 架构原理及其作用,并以 CentOS 7 环境为例,总结了 Docker 的环境搭建,镜像和容器的常用操作方法。

作者:王克锋
出处:https://kefeng.wang/2018/07/12/docker/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 概述

官网首页: https://www.docker.com/
官方仓库: https://hub.docker.com/
开源首页: https://github.com/docker

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC(Linux Container) 的高级容器引擎,源代码托管在 Github 上, 基于 Go 语言并遵从 Apache2.0 协议开源。

1.1 传统部署方案的困惑

软件部署时,很麻烦的事就是所依赖的环境的配置(操作系统、依赖的库和组件等),常规的两种方式都有缺陷:

  • 手工零星配置:繁琐且容易出错,每个部署都要重新操作无法重用;
  • 虚拟机方式(VmWare/VirualBox 等):为了启动所开发软件的一个进程,相当于需要启动一个虚拟的操作系统,浪费资源且启动慢。

1.2 Docker 的优势

Docker 允许开发者把应用程序、依赖环境和配置打包到一个可移植的 Docker 镜像文件中,然后发布到任何流行的 Linux 机器上。基于镜像启动容器,应用程序在容器中运行,就像在真实物理机器上运行一样。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。容器相当于进程级别(而不是操作系统级别)的虚拟机,在传统进程的外部包装了虚拟层,传统进程通过该虚拟层虚拟地访问外部资源。由于该容器是进程级别的,不浪费资源、启动快、体积也小。

比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以采用 Docker 方式部署。dotCloud 自家的 PaaS 产品就是建立在 Docker 之上。

1.3 Docker 的架构


镜像与容器的关系,是模板与实例的关系,相当于 Java 中的类与对象的关系。

  • Image(镜像): 作为创建容器的模板。
  • Container(容器): 独立运行的一个或多个应用,是镜像的实例。
  • Client(客户端): 可以是自带的 docker 命令,或者基于 Docker API 开发的工具,与 Docker 的守护进程(daemon)通信。
  • Host(主机): 用于执行 Docker 守护进程和容器的机器。
  • Registry(仓库): 用来存放镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
  • Docker Machine: 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker。

1.4 Docker 的作用

1.4.1 使用场景

  • 应用的打包与部署自动化
  • 创建轻量、私用的 PAAS 环境
  • 实现自动化测试、持续集成、持续部署
  • 部署与扩展 webapp、数据库和后台服务

1.4.2 支持的操作

  • 创建容器并把自己的应用放入容器;
  • 版本管理、复制和分享、修改;
  • 使用容器。

1.5 Docker 的版本

与 MySQL 类似,Docker 是个开源的商业产品,有企业版(Enterprise Edition,简称为 EE)和社区版(Community Edition,简称为 CE)两个版本。
企业版有高级功能,但要收费。通常社区版就够用了,本文以社区版为例。

2 Docker 的安装

2.1 CentOS 的版本要求

Docker 只能运行在64位的系统中。

  • CentOS 7 (64-bit): 系统内核版本为 3.10 以上;
  • CentOS 6.5 (64-bit): 系统内核版本为 2.6.32-431 以上;

2.2 安装 Docker

与 MySQL 类似,Docker 是服务器/客户端架构。
必须安装 Docker 软件包(包含服务器和客户端软件),并启动服务器,才能使用 docker 客户端命令来创建、管理、使用 Docker 容器。
Docker 软件包已经包含在默认的 CentOS-Extras 软件源里,可直接安装:

1
2
3
uname -r ## 查看内核版本(3.10.0-693.21.1.el7.x86_64)
# sudo yum -y remove docker* ## 卸载老版本
sudo yum -y install docker ## 安装

2.3 当前用户加入 Docker 用户组

默认情况下,执行 docker 命令需要 sudo 权限,必须以 sudo docker ... 形式执行。
为了简化命令,可把当前用户加入 Docker 用户组,就可以省略 sudo 直接执行 docker ...。此操作必须在 Docker 服务启动之前(否则需要重启 Docker 服务)。

1
2
3
4
sudo groupadd docker ## 添加 docker 用户组
sudo usermod -aG docker $USER ## 当前用户加入 docker 用户组
## 当前用户重新登录后,所属用户组才生效
groups ## 查看当前用户所属用户组(admin docker)

2.4 镜像加速

相关链接: http://www.docker-cn.com/registry-mirror
国内网络连接 Docker 的官方仓库,慢且不稳定,可将默认仓库改成国内的镜像网站(缺点是只包含主要镜像,所以如果官方仓库可用,则可不作些调整)。

1
2
3
## sudo vim /etc/docker/daemon.json
{"registry-mirrors": ["http://registry.docker-cn.com"]}
## 重启后生效: sudo systemctl restart docker

2.5 启动 Docker 服务器

1
2
3
4
5
sudo systemctl enable docker ## 加入开机启动
sudo systemctl start docker ## 立即启动
## sudo systemctl restart docker ## 立即重启
## sudo systemctl stop docker ## 立即停止
## sudo systemctl disable docker ## 禁止开机启动

2.6 查看 Docker 版本

执行命令 docker version,会输出下面信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64

Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Experimental: false

3 镜像的使用(Image)

Image 镜像文件,在各机器间是通用的,拷贝过去即可使用。
通常,为了快捷,尽量重用已有的 Image 文件,而不是自己制作。
如果要定制,也尽量基于已有的 Image 文件调整,而不是从头开始。

为了共享,Image 文件制作完成后,可以上传到网上的仓库。
Docker 的官方仓库 Docker Hub 是最重要、最常用的 Image 仓库。

3.1 使用公共镜像

运行容器时,使用的镜像如果在本地中不存在,Docker 会自动从 Docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。常用命令如下:

  • docker images: 列出本地主机上的镜像,信息项包括 REPOSITORY(远程仓库)/TAG(标签,同效于版本号,latest表示最新版本)/IMAGE ID(镜像ID)
  • docker search --filter "is-official=true" tomcat: 查找匹配指定名字的镜像,其中:OFFICIAL表示是否官方发布,STARS表示点赞人次
  • docker pull docker.io/tomcat: 从 registry 中拉取镜像
  • docker rmi -f IMAGE: 从本地主机删除指定的镜像

3.2 修改公共镜像

当公共镜像不能完全满足要求时,
可以从已经创建的容器中更新镜像,
再使用命令 docker commit 提交这个镜像。

3.3 创建全新镜像

  • 创建一个工作目录,在其中创建相关子目录和文件;
  • 工作目录中创建文件 Dockerfile,用来指示如何创建镜像;
  • 使用命令 docker build 创建镜像。

3.4 发布镜像

把 Image 文件分享到网上,让其他人使用。
hub.docker.comcloud.docker.com 注册一个账户。

1
2
3
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image push [username]/[repository]:[tag]

4 容器的使用(Container)

官方文档: https://docs.docker.com/engine/reference/commandline/docker/

4.1 运行容器

  • docker create [OPTIONS] IMAGE [COMMAND] [ARG...]: 新建容器
  • docker rm -f CONTAINER [CONTAINER...]: 删除已创建的容器,-f可停止并删除正在运行的容器
  • docker start CONTAINER [CONTAINER...]: 启动已创建的容器,保持原 {CONTAINER-ID} 不变
  • docker stop -t 10 CONTAINER [CONTAINER...]: 停止容器,停掉前等待 10s;
  • docker restart -t 10 CONTAINER [CONTAINER...]: 相当于 docker stopdocker start 的组合,停掉前等待 10s
  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]: 相当于 docker createdocker start 的组合

4.2 列举进程

  • docker ps: 查看正在运行的容器,输出容器ID、镜像名称、容器内命令、创建时间、端口映射等;
  • docker -a ps: 查看创建过的所有历史容器,包括已经停止运行的;
  • docker ps | grep ubuntu | awk '{print $1}': 根据镜像名称获取容器ID。

4.3 容器状态

  • docker logs -tf CONTAINER: 查看容器内的日志,显示时间戳并进入监视状态;
  • docker top CONTAINER: 查看容器内正在运行的进程;
  • docker stats [CONTAINER...]: 查看容器运行状态
  • docker inspect CONTAINER: 查看容器底层信息
  • docker port CONTAINER: 查看容器的端口映射;

4.4 run 命令详解

完整格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

4.4.1 短暂性运行容器

1
docker run ubuntu /bin/echo "Hello world" ## 显示信息 "Hello world"

根据指定的镜像名称,先在本地主机查找镜像(若不存在,则从镜像仓库 Docker Hub 下载公共镜像),然后创建容器。
镜像名称后面的内容,是要在容器里执行的命令。

4.4.2 交互式运行容器

1
docker run -it ubuntu /bin/bash

可运行容器,并在其命令行提示符下执行交互操作。
可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。

  • 参数 -i: 与容器内的STDIN进行交互
  • 参数 -t: 新容器内指定一个终端

4.4.3 后台模式运行容器

1
docker run -dp 8000:8080 ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

该命令以后台形式运行,相应日志需要借助于 docker psdocker logs 查看。

  • 参数 -d: 让容器在后台运行。
  • 参数 -p: 将容器内部使用的网络端口(8000)映射到我们使用的主机端口(8080)。

5 Docker 私服

与 Maven 类似,除了使用官方的公共仓库,自己也可以搭建私有仓库。以便加快镜像的下载速度。
参考文档:https://www.jianshu.com/p/74d7fa242936

文章目录
  1. 1 概述
    1. 1.1 传统部署方案的困惑
    2. 1.2 Docker 的优势
    3. 1.3 Docker 的架构
    4. 1.4 Docker 的作用
      1. 1.4.1 使用场景
      2. 1.4.2 支持的操作
    5. 1.5 Docker 的版本
  2. 2 Docker 的安装
    1. 2.1 CentOS 的版本要求
    2. 2.2 安装 Docker
    3. 2.3 当前用户加入 Docker 用户组
    4. 2.4 镜像加速
    5. 2.5 启动 Docker 服务器
    6. 2.6 查看 Docker 版本
  3. 3 镜像的使用(Image)
    1. 3.1 使用公共镜像
    2. 3.2 修改公共镜像
    3. 3.3 创建全新镜像
    4. 3.4 发布镜像
  4. 4 容器的使用(Container)
    1. 4.1 运行容器
    2. 4.2 列举进程
    3. 4.3 容器状态
    4. 4.4 run 命令详解
      1. 4.4.1 短暂性运行容器
      2. 4.4.2 交互式运行容器
      3. 4.4.3 后台模式运行容器
  5. 5 Docker 私服