• 概述

    • Docker 是一个开源的应用容器引擎,基于Go 语言 并遵从Apache2.0协议开源。
    • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
    • 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
  • 应用场景

    • Web 应用的自动化打包和发布。
    • 自动化测试和持续集成、发布。
    • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 架构模式

    • Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

    • Docker 容器通过 Docker 镜像来创建。

    • 容器与镜像的关系类似于面向对象编程中的对象与类:

      Docker 面向对象
      容器 对象
      镜像 类

      概念名词 含义
      Docker 镜像(Images) 用于创建 Docker 容器的模板。
      Docker 容器(Container) 独立运行的一个或一组应用。
      Docker 客户端(Client) 通过命令行或其他工具使用 Docker API 与 Docker 的守护进程通信。
      Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
      Docker 仓库(Registry) 用来保存镜像。Docker Hub 提供了庞大的镜像集合供使用。
  • 优点

    • 简化程序
      Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
    • 避免选择恐惧症
      Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
    • 节省开支
      云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
  • 相关链接

Docker 安装

Docker 使用

简单使用

Hello World

使用 docker run 命令来在容器内运行一个应用程序:输出Hello world。

1
2
# Docker 以 ubuntu16.04 镜像创建一个新容器,然后在容器里执行并输出结果
docker run ubuntu:16.04 echo "Hello World"

第一次拉取, 会检测本地没有ubuntu16.04的镜像, 直接从远端拉取。

运行交互式容器

  • 进入容器进行交互
  • 可以通过运行exit命令或者使用CTRL+D来退出容器
1
2
3
4
# -i:允许你对容器内的标准输入 (STDIN) 进行交互
# -t:在新容器内指定一个伪终端或终端
docker run -i -t ubuntu:16.04
docker run -it ubuntu:16.04

后台模式运行

1
2
3
4
5
6
7
8
9
10
11
# 创建一个以进程方式运行的容器
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

# 确认容器是否有在运行, 获取正在运行的容器ID
docker ps

# 查看容器内的标准输出
docker logs [ContainerID]

# 停止容器运行
docker stop [ContainerID]

常用环境部署

容器环境部署

1
2
3
4
5
6
7
8
9
# 配置国内镜像
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >> /etc/apt/sources.list

# 更新安装源
apt-get update

容器与宿主机之间的文件复制

  • 容器往宿主机拷贝

    1
    docker cp [ContainerID]:/database_dump_bak/db_bak.dmp /home/test
  • 宿主机往容器拷贝

    1
    docker cp wenjian_001.xml  [ContainerID]:/mnt/5101388419

容器与宿主机共享文件

1
2
# 进入Docker容器后,进入 /share 文件夹下即可查看到共享内容
docker run -it -v /home/wzx/下载:/share wzx/ubuntu:16.04 /bin/bash

镜像使用

列出本地主机上的镜像列表

1
2
3
4
5
docker images

# e.g:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu 16.04 9361ce633ff1 5 weeks ago 118MB
  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

列出本地正在运行的容器

1
docker ps

容器内部获取当前ID

1
2
# 其实就是主机名, 记下可用于保存镜像使用
hostname

获取新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。

如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它

1
2
# 如果不指定一个镜像的版本标签, 将默认使用 ubuntu:latest 镜像
docker pull ubuntu

查找远端镜像

比如我们需要一个httpd的镜像来作为我们的web服务。

1
docker search httpd

更新镜像

比如本地的 ubuntu:16.04 配置了一定环境之后, 想重新弄一个同样镜像tag来配置另一个环境

1
2
3
4
5
# 查看本地镜像列表
docker images

# 更新镜像
docker commit -m="test for update image" -a="wzx" 9361ce633ff1 wzx/ubuntu:v1
  • -m : 提交的描述信息
  • -a : 指定镜像作者
  • 9361ce633ff1 : 容器ID
  • wzx/ubuntu:v1 : 指定要创建的目标镜像名

重命名镜像

docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

1
docker tag 9bf883b9c50c wzx/ubuntu:16.04

重命名容器

dokcer rename 容器ID REPOSITORY:TAG(仓库:标签)

1
docker rename 9c7da7245195 wzx/ubuntu:16.04

删除镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 停止所有的容器
docker stop $(docker ps -a -q)

## 如果要删除所有容器的话, 需加上:
docker rm $(docker ps -a -q)

# 查看本地镜像列表
docker images

# 删除单个镜像
docker rmi [ContainerID]

# 删除所有镜像
docker rmi $(docker images -q)
  • 注1: 删除镜像时报必须停止容器的错误

    具体错误: Error response from daemon:###unable to delete ### (must be forced) - image is being used by stopped

    错误解析: 这是由于要删除的目标镜像中有容器存在,故无法删除镜像

    解决办法: 先删除镜像中的容器,再删除该镜像

    1
    2
    docker rm [ContainerID]
    docker rmi [ImageID]
  • 注2: 删除镜像时报镜像被引用的错误

    具体错误: Error response from daemon: conflict: unable to delete ### (must be forced) - image is referenced in multiple repositories

    错误解析: 镜像被引用了, 删除时可指定repository和tag的方式来删除

    解决办法:

    1
    docker rmi tmp/ubuntu:16.04

docker 命令手册(详)

Dockerfile 快速构建镜像

构建命令

docker build -t REPOSITORY:TAG(仓库:标签) path(Dockerfile文件所在目录路径)

1
2
# 构建
docker build -t wzx/ubuntu:16.04 .

Dockerfile 命令大全

Dockerfile命令详解(超全版本)

常见问题

1. 修改sources.list源

ubuntu默认源执行apt-update,此时build过程非常慢,而且打包出来的镜像使用时也会存在慢的情况。

首先从清华源或Ubuntu 16.04 几个国内更新源复制list列表,保存为sources.list存放与dockerfile同目录下。

因此在 apt-get update 之前加入

1
ADD sources.list /etc/apt/

2. 镜像加速

配置网易的加速器: http://hub-mirror.c.163.com

在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

可以通过 docker info 命令来查看是否配置成功。