• 概述

    • 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 APIDocker 的守护进程通信。
      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

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

    解决办法:

    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 命令来查看是否配置成功。