Docker 是一个开源应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),对于我们的学习使用社区版就可以了。


谁适合阅读本教程?

本教程适合运维工程师及后端开发人员,通过本教程你可以一步一步了解 Docker 的使用。


阅读本教程前,您需要了解的知识

在阅读本教程前,你需要掌握 Linux 的常用命令。你可以通过本站的 Linux 教程 来学习相关命令。


Docker的应用场景

  • Web 应用的自动化打包和发布。

  • 自动化测试和持续集成、发布。

  • 在服务型环境中部署和调整数据库或其他的后台应用。

  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。


Docker 的优点

  • 1、简化程序:
    Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。

  • 2、避免选择恐惧症:
    如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

  • 3、节省开支:
    一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

  • 4、一致性:

    容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

    • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
    • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
    • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
    • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
       Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

相关链接

Docker 官网:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

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

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

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

Docker面向对象
容器对象
镜像

概念说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。


Docker 是一个开源应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),对于我们的学习使用社区版就可以了。


谁适合阅读本教程?

本教程适合运维工程师及后端开发人员,通过本教程你可以一步一步了解 Docker 的使用。


阅读本教程前,您需要了解的知识

在阅读本教程前,你需要掌握 Linux 的常用命令。你可以通过本站的 Linux 教程 来学习相关命令。


Docker的应用场景

  • Web 应用的自动化打包和发布。

  • 自动化测试和持续集成、发布。

  • 在服务型环境中部署和调整数据库或其他的后台应用。

  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。


Docker 的优点

  • 1、简化程序:
    Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。

  • 2、避免选择恐惧症:
    如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

  • 3、节省开支:
    一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

  • 4、一致性:

    容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

    • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
    • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
    • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
    • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
       Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

相关链接

Docker 官网:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

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

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

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

Docker面向对象
容器对象
镜像

概念说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。


Docker 支持以下的 Ubuntu 版本:

  • Ubuntu Precise 12.04 (LTS)
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Wily 15.10
  • 其他更新的版本……


前提条件

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。

通过 uname -r 命令查看你当前的内核版本

51coolma@51coolma:~$ uname -r



使用脚本安装 Docker

1、获取最新版本的 Docker 安装包

51coolma@51coolma:~$ sudo apt-get update


51coolma@51coolma:~$ sudo apt-get install -y docker.io


2、启动docker 后台服务

51coolma@51coolma:~$ sudo service docker start


Docker支持以下的CentOS版本:

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

前提条件

目前,CentOS 仅发行版本中的内核支持 Docker。

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。


使用 yum 安装(CentOS 7下)

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过 uname -r 命令查看你当前的内核版本
[root@51coolma ~]# uname -r 3.10.0-327.el7.x86_64


安装 Docker

Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

[root@51coolma ~]# yum -y install docker


安装完成。

启动 Docker 后台服务

[root@51coolma ~]# service docker start


测试运行 hello-world

[root@51coolma ~]#docker run hello-world


由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。


使用脚本安装 Docker

1、使用 sudoroot 权限登录 Centos。

2、确保 yum 包更新到最新。

$ sudo yum update

3、执行 Docker 安装脚本。

$ curl -fsSL https://get.docker.com/ | sh

执行这个脚本会添加 docker.repo 源并安装 Docker。

4、启动 Docker 进程。

$ sudo service docker start

5、验证 docker 是否安装成功并在容器中执行一个测试的镜像。

$ sudo docker run hello-world

到此,docker 在 CentOS 系统的安装完成。

Docker 引擎使用的是 Linux 内核特性,所以我们需要在 Windows 上使用一个轻量级的虚拟机 (VM) 来运行 Docker。

我们通过 Boot2Docker 来安装虚拟机和运行 Docker


安装

1、安装Boot2Docker 

最新版 Boot2Docker 下载地址:https://github.com/boot2docker/windows-installer/releases/latest

目前最新版为v1.8.0, 下载地址为:https://github.com/boot2docker/windows-installer/releases/download/v1.8.0/docker-install.exe

2、运行安装文件

运行安装文件,它将会安装 virtualbox、MSYS-git boot2docker Linux 镜像和 Boot2Docker 的管理工具。

接着连续点击"Next",进到如下界面

点击"Install"开始安装。

安装完成。

从桌面上或者 Program Files 中运行 Boot2Docker Start。

Boot2Docker Start 将启动一个 Unix shell 来配置和管理运行在虚拟主机中的 Docker,我们可以通过运行 docker version 来查看它是否正常工作。


运行 Docker

使用boot2docker.exe ssh 连接到虚拟主机上,然后执行docker run hello-world

到此,docker在Windows系统的安装完成。

使用 Homebrew 安装

macOS 我们可以使用 Homebrew 来安装 Docker。

Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:

$ brew install --cask --appdir=/Applications docker==> Creating Caskroom at /usr/local/Caskroom==> We'll set permissions properly so we won't need sudo in the futurePassword:          # 输入 macOS 密码==> Satisfying dependencies==> Downloading https://download.docker.com/mac/stable/21090/Docker.dmg######################################################################## 100.0%==> Verifying checksum for Cask docker==> Installing Cask docker==> Moving App 'Docker.app' to '/Applications/Docker.app'.🍺  docker was successfully installed!

在载入 Docker app 后,点击 Next,可能会询问你的 macOS 登陆密码,你输入即可。之后会弹出一个 Docker 运行的提示窗口,状态栏上也有有个小鲸鱼的图标( )。

手动下载安装

如果需要手动下载,请点击以下链接下载 Install Docker Desktop on Mac 。

如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。

从应用中找到 Docker 图标并点击运行。可能会询问 macOS 的登陆密码,输入即可。

点击顶部状态栏中的鲸鱼图标会弹出操作菜单。

第一次点击图标,可能会看到这个安装成功的界面,点击 "Got it!" 可以关闭这个窗口。

启动终端后,通过命令可以检查安装后的 Docker 版本。

$ docker --versionDocker version 17.09.1-ce, build 19e2cf6

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:​http://hub-mirror.c.163.com​。

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

之后我们可以通过 ​docker info​ 来查看是否配置成功。

$ docker info...Registry Mirrors: http://hub-mirror.c.163.comLive Restore Enabled: false


Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

输出Hello world

51coolma@51coolma:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world


各个参数解析:

  • docker: Docker 的二进制执行文件。

  • run:与前面的 docker 组合来运行一个容器。

  • ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  • /bin/echo "Hello world": 在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。


运行交互式的容器

我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力

51coolma@51coolma:~$ docker run -i -t ubuntu:15.10 /bin/bashroot@dc0050c79503:/#

各个参数解析:

  • -t:在新容器内指定一个伪终端或终端。

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10系统的容器

我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表


我们可以通过运行exit命令或者使用CTRL+D来退出容器。


启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

51coolma@51coolma:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63


在输出中,我们没有看到期望的"hello world",而是一串长字符

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看

51coolma@51coolma:~$ docker ps


CONTAINER ID:容器ID

NAMES:自动分配的容器名称

在容器内使用docker logs命令,查看容器内的标准输出

51coolma@51coolma:~$ docker logs 2b1b7a428627


51coolma@51coolma:~$ docker logs amazing_cori



停止容器

我们使用 docker stop 命令来停止容器:


通过docker ps查看,容器已经停止工作:

51coolma@51coolma:~$ docker ps


也可以用下面的命令来停止:

51coolma@51coolma:~$ docker stop amazing_cori

Docker 客户端

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

51coolma@51coolma:~# docker


可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:

51coolma@51coolma:~# docker stats --help



运行一个web应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

51coolma@51coolma:~# docker run -d -P training/webapp python app.py


参数说明:

  • -d:让容器在后台运行。

  • -P:将容器内部使用的网络端口映射到我们使用的主机上。


查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器

51coolma@51coolma:~$ docker ps


这里多了端口信息。

PORTS0.0.0.0:32769->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

这时我们可以通过浏览器访问WEB应用

我们也可以指定 -p 标识来绑定指定端口。

51coolma@51coolma:~$ docker run -d -p 5000:5000 training/webapp python app.py

docker ps查看正在运行的容器


容器内部的 5000 端口映射到我们本地主机的 5000 端口上。


网络端口的快捷方式

通过docker ps 命令可以查看到容器的端口映射,docker还提供了另一个快捷方式:docker port,使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。

上面我们创建的web应用容器ID为:7a38a1ad55c6 名字为:determined_swanson

我可以使用docker port 7a38a1ad55c6 或docker port determined_swanson来查看容器端口的映射情况

51coolma@51coolma:~$ docker port 7a38a1ad55c65000/tcp -> 0.0.0.0:5000
51coolma@51coolma:~$ docker port determined_swanson5000/tcp -> 0.0.0.0:5000

查看WEB应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

51coolma@51coolma:~$ docker logs -f 7a38a1ad55c6 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -

-f:dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。


查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

51coolma@51coolma:~$ docker top determined_swanson



检查WEB应用程序

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

51coolma@51coolma:~$ docker inspect determined_swanson[    {        "Id": "7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361",        "Created": "2016-05-09T16:20:45.427996598Z",        "Path": "python",        "Args": [            "app.py"        ],        "State": {            "Status": "running",......

停止WEB应用容器

51coolma@51coolma:~$ docker stop determined_swanson   determined_swanson

重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。

51coolma@51coolma:~$ docker start determined_swansondetermined_swanson

docker ps -l 来查看正在运行的容器


正在运行的容器,我们可以使用 docker restart 命令来重启


移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

51coolma@51coolma:~$ docker rm determined_swanson  determined_swanson

删除容器时,容器必须是停止状态,否则会报如下错误

51coolma@51coolma:~$ docker rm determined_swansonError response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f

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

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。

51coolma@51coolma:~$ docker images           REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEubuntu              14.04               90d5884b1ee0        5 days ago          188 MBphp                 5.6                 f40e9e0f10c8        9 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Btraining/webapp     latest              6fae60ef3446        11 months ago       348.8 MB

各个选项说明:

  • REPOSTITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSTITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

51coolma@51coolma:~$ docker run -t -i ubuntu:15.10 /bin/bash root@d77ccb2e5cca:/#

如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下:

51coolma@51coolma:~$ docker run -t -i ubuntu:14.04 /bin/bash root@39e968165990:/# 

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。


获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

C51coolma@51coolma:~$ docker pull ubuntu:13.1013.10: Pulling from library/ubuntu6599cadaf950: Pull complete 23eda618d451: Pull complete f0be3084efe9: Pull complete 52de432f084b: Pull complete a3ed95caeb02: Pull complete Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3Status: Downloaded newer image for ubuntu:13.10

下载完成后,我们可以直接使用这个镜像来运行容器。


查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

51coolma@51coolma:~$  docker search httpd


NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否docker官方发布


拖取镜像

我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

51coolma@51coolma:~$ docker pull httpdUsing default tag: latestlatest: Pulling from library/httpd8b87079b7a06: Pulling fs layer a3ed95caeb02: Download complete 0d62ec9c6a76: Download complete a329d50397b9: Download complete ea7c1f032b5c: Waiting be44112b72c7: Waiting

下载完成后,我们就可以使用这个镜像了。

51coolma@51coolma:~$ docker run httpd

创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像
  • 2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。
51coolma@51coolma:~$ docker run -t -i ubuntu:15.10 /bin/bashroot@e218edb10161:/# 
在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

51coolma@51coolma:~$ docker commit -m="has update" -a="youj" e218edb10161 51coolma/ubuntu:v2sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:

  • -m:提交的描述信息

  • -a:指定镜像作者

  • e218edb10161:容器ID

  • 51coolma/ubuntu:v2:指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 51coolma/ubuntu:v2

51coolma@51coolma:~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE51coolma/ubuntu       v2                  70bf1840fd7c        15 seconds ago      158.5 MBubuntu              14.04               90d5884b1ee0        5 days ago          188 MBphp                 5.6                 f40e9e0f10c8        9 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Btraining/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

使用我们的新镜像 51coolma/ubuntu 来启动一个容器

51coolma@51coolma:~$ docker run -t -i 51coolma/ubuntu:v2 /bin/bash                            root@1a9fbdeb5da3:/#

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

51coolma@51coolma:~$ cat Dockerfile FROM    centos:6.7MAINTAINER      Fisher "fisher@sudops.com"RUN     /bin/echo 'root:123456' |chpasswdRUN     useradd youjRUN     /bin/echo 'youj:123456' |chpasswdRUN     /bin/echo -e "LANG="en_US.UTF-8"" > /etc/default/localEXPOSE  22EXPOSE  80CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

51coolma@51coolma:~$ docker build -t youj/centos:6.7 .Sending build context to Docker daemon 17.92 kBStep 1 : FROM centos:6.7 ---> d95b5ca17cc3Step 2 : MAINTAINER Fisher "fisher@sudops.com" ---> Using cache ---> 0c92299c6f03Step 3 : RUN /bin/echo 'root:123456' |chpasswd ---> Using cache ---> 0397ce2fbd0aStep 4 : RUN useradd youj......

参数说明:

  • -t :指定要创建的目标镜像名

  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

51coolma@51coolma:~$ docker images REPOSITORY          TAG                 IMAGE ID            CREATED              SIZEyouj/centos       6.7                 860c279d2fec        About a minute ago   190.6 MB51coolma/ubuntu       v2                  70bf1840fd7c        17 hours ago         158.5 MBubuntu              14.04               90d5884b1ee0        6 days ago           188 MBphp                 5.6                 f40e9e0f10c8        10 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago          182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago          324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago          194.4 MBubuntu              15.10               4e3b13c8a266        5 weeks ago          136.3 MBhello-world         latest              690ed74de00f        6 months ago         960 Bcentos              6.7                 d95b5ca17cc3        6 months ago         190.6 MBtraining/webapp     latest              6fae60ef3446        12 months ago        348.8 MB

我们可以使用新的镜像来创建容器

51coolma@51coolma:~$ docker run -t -i youj/centos:6.7  /bin/bash[root@41c28d18b5fb /]# id youjuid=500(youj) gid=500(youj) groups=500(youj)

从上面看到新镜像已经包含我们创建的用户youj


设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

51coolma@51coolma:~$ docker tag 860c279d2fec youj/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

51coolma@51coolma:~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEyouj/centos       6.7                 860c279d2fec        5 hours ago         190.6 MByouj/centos       dev                 860c279d2fec        5 hours ago         190.6 MB51coolma/ubuntu       v2                  70bf1840fd7c        22 hours ago        158.5 MBubuntu              14.04               90d5884b1ee0        6 days ago          188 MBphp                 5.6                 f40e9e0f10c8        10 days ago         444.8 MBnginx               latest              6f8d099c3adc        13 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        5 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Bcentos              6.7                 d95b5ca17cc3        6 months ago        190.6 MBtraining/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。

下面我们来实现通过端口连接到一个 docker 容器。


网络端口映射

我们创建了一个 python 应用的容器。

51coolma@51coolma:~$ docker run -d -P training/webapp python app.pyfce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

我们使用 -P 参数创建一个容器,使用 docker ps 来看到端口5000绑定主机端口32768。

51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMESfce072cc88ce        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
51coolma@51coolma:~$ docker run -d -p 5000:5000 training/webapp python app.py33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                     NAMES33e4523d30aa        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp    berserk_bartikfce072cc88ce        training/webapp     "python app.py"     8 minutes ago        Up 8 minutes        0.0.0.0:32768->5000/tcp   grave_hopper

另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。

51coolma@51coolma:~$ docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                NAMES95c6ceef88ca        training/webapp     "python app.py"     6 seconds ago       Up 6 seconds        5000/tcp, 127.0.0.1:5001->5002/tcp   adoring_stonebraker33e4523d30aa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:5000->5000/tcp               berserk_bartikfce072cc88ce        training/webapp     "python app.py"     10 minutes ago      Up 10 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

这样我们就可以通过访问127.0.0.1:5001来访问容器的5002端口。

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UD 端口,可以在端口后面加上 /udp

51coolma@51coolma:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                NAMES6779686f06f6        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya95c6ceef88ca        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        5000/tcp, 127.0.0.1:5001->5002/tcp   adoring_stonebraker33e4523d30aa        training/webapp     "python app.py"     5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp               berserk_bartikfce072cc88ce        training/webapp     "python app.py"     12 minutes ago      Up 12 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

docker port 命令可以让我们快捷地查看端口的绑定情况。

51coolma@51coolma:~$ docker port adoring_stonebraker 5002127.0.0.1:5001

Docker容器连接

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。


容器命名

当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:

51coolma@51coolma:~$  docker run -d -P --name youj training/webapp python app.py43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 命令来查看容器名称。

51coolma@51coolma:~$ docker ps -lCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES43780a6eabaa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:32769->5000/tcp   youj

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录nginx,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf

www目录将映射为nginx容器配置的虚拟目录

logs目录将映射为nginx容器的日志目录

conf目录里的配置文件将映射为nginx容器的配置文件

进入创建的nginx目录,创建Dockerfile

FROM debian:jessieMAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"ENV NGINX_VERSION 1.10.1-1~jessieRUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62         && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list         && apt-get update         && apt-get install --no-install-recommends --no-install-suggests -y                                                 ca-certificates                                                 nginx=${NGINX_VERSION}                                                 nginx-module-xslt                                                 nginx-module-geoip                                                 nginx-module-image-filter                                                 nginx-module-perl                                                 nginx-module-njs                                                 gettext-base         && rm -rf /var/lib/apt/lists/*# forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.log         && ln -sf /dev/stderr /var/log/nginx/error.logEXPOSE 80 443CMD ["nginx", "-g", "daemon off;"]

通过Dockerfile创建一个镜像,替换成你自己的名字

docker build -t nginx .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/nginx$ docker images nginxREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              555bbd91e13c        3 days ago          182.8 MB

方法二、docker pull nginx

查找Docker Hub上的nginx镜像

51coolma@51coolma:~/nginx$ docker search nginxNAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDnginx                     Official build of Nginx.                        3260      [OK]       jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...   674                  [OK]richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   207                  [OK]million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   67                   [OK]maxexcloo/nginx-php       Docker framework container with Nginx and ...   57                   [OK]webdevops/php-nginx       Nginx with PHP-FPM                              39                   [OK]h3nrik/nginx-ldap         NGINX web server with LDAP/AD, SSL and pro...   27                   [OK]bitnami/nginx             Bitnami nginx Docker Image                      19                   [OK]maxexcloo/nginx           Docker framework container with Nginx inst...   7                    [OK]...

这里我们拉取官方的镜像

51coolma@51coolma:~/nginx$ docker pull nginx

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为nginx的镜像。


使用nginx镜像

运行容器

51coolma@51coolma:~/nginx$ docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx  45c89fab0bf9ad643bc7ab571f3ccd65379b844498f54a7c8a4e7ca1dc3a2c1e51coolma@51coolma:~/nginx$

命令说明:

  • -p 80:80:将容器的80端口映射到主机的80端口

  • --name mynginx:将容器命名为mynginx

  • -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www

  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf

  • -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs

查看容器启动情况

51coolma@51coolma:~/nginx$ docker psCONTAINER ID        IMAGE        COMMAND                      PORTS                         NAMES45c89fab0bf9        nginx        "nginx -g 'daemon off"  ...  0.0.0.0:80->80/tcp, 443/tcp   mynginxf2fa96138d71        tomcat       "catalina.sh run"       ...  0.0.0.0:81->8080/tcp          tomcat

通过浏览器访问

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录php-fpm,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/php-fpm/logs ~/php-fpm/conf

logs目录将映射为php-fpm容器的日志目录

conf目录里的配置文件将映射为php-fpm容器的配置文件

进入创建的php-fpm目录,创建Dockerfile

FROM debian:jessie# persistent / runtime depsENV PHPIZE_DEPS 		autoconf 		file 		g++ 		gcc 		libc-dev 		make 		pkg-config 		re2cRUN apt-get update && apt-get install -y 		$PHPIZE_DEPS 		ca-certificates 		curl 		libedit2 		libsqlite3-0 		libxml2 	--no-install-recommends && rm -r /var/lib/apt/lists/*ENV PHP_INI_DIR /usr/local/etc/phpRUN mkdir -p $PHP_INI_DIR/conf.d##<autogenerated>##ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data##</autogenerated>##ENV GPG_KEYS 0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3ENV PHP_VERSION 5.6.22ENV PHP_FILENAME php-5.6.22.tar.xzENV PHP_SHA256 c96980d7de1d66c821a4ee5809df0076f925b2fe0b8c362d234d92f2f0a178e2RUN set -xe 	&& buildDeps=" 		$PHP_EXTRA_BUILD_DEPS 		libcurl4-openssl-dev 		libedit-dev 		libsqlite3-dev 		libssl-dev 		libxml2-dev 		xz-utils 	" 	&& apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* 	&& curl -fSL "http://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME" 	&& echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - 	&& curl -fSL "http://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& for key in $GPG_KEYS; do 		gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; 	done 	&& gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" 	&& rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" 	&& mkdir -p /usr/src/php 	&& tar -xf "$PHP_FILENAME" -C /usr/src/php --strip-components=1 	&& rm "$PHP_FILENAME" 	&& cd /usr/src/php 	&& ./configure 		--with-config-file-path="$PHP_INI_DIR" 		--with-config-file-scan-dir="$PHP_INI_DIR/conf.d" 		$PHP_EXTRA_CONFIGURE_ARGS 		--disable-cgi # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)		--enable-mysqlnd # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)		--enable-mbstring 		--with-curl 		--with-libedit 		--with-openssl 		--with-zlib 	&& make -j"$(nproc)" 	&& make install 	&& { find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; } 	&& make clean 	&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -o APT::AutoRemove::SuggestsImportant=false $buildDepsCOPY docker-php-ext-* /usr/local/bin/##<autogenerated>##WORKDIR /var/www/htmlRUN set -ex 	&& cd /usr/local/etc 	&& if [ -d php-fpm.d ]; then 		# for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"		sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; 		cp php-fpm.d/www.conf.default php-fpm.d/www.conf; 	else 		# PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency		mkdir php-fpm.d; 		cp php-fpm.conf.default php-fpm.d/www.conf; 		{ 			echo '[global]'; 			echo 'include=etc/php-fpm.d/*.conf'; 		} | tee php-fpm.conf; 	fi 	&& { 		echo '[global]'; 		echo 'error_log = /proc/self/fd/2'; 		echo; 		echo '[www]'; 		echo '; if we send this to /proc/self/fd/1, it never appears'; 		echo 'access.log = /proc/self/fd/2'; 		echo; 		echo 'clear_env = no'; 		echo; 		echo '; Ensure worker stdout and stderr are sent to the main error log.'; 		echo 'catch_workers_output = yes'; 	} | tee php-fpm.d/docker.conf 	&& { 		echo '[global]'; 		echo 'daemonize = no'; 		echo; 		echo '[www]'; 		echo 'listen = [::]:9000'; 	} | tee php-fpm.d/zz-docker.confEXPOSE 9000CMD ["php-fpm"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/php-fpm$ docker build -t php:5.6-fpm .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/php-fpm$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEphp                 5.6-fpm             025041cd3aa5        6 days ago          456.3 MB

方法二、docker pull php

查找Docker Hub上的php镜像

51coolma@51coolma:~/php-fpm$ docker search phpNAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDphp                       While designed for web development, the PH...   1232      [OK]       richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   207                  [OK]phpmyadmin/phpmyadmin     A web interface for MySQL and MariaDB.          123                  [OK]eboraas/apache-php        PHP5 on Apache (with SSL support), built o...   69                   [OK]php-zendserver            Zend Server - the integrated PHP applicati...   69        [OK]       million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   67                   [OK]webdevops/php-nginx       Nginx with PHP-FPM                              39                   [OK]webdevops/php-apache      Apache with PHP-FPM (based on webdevops/php)    14                   [OK]phpunit/phpunit           PHPUnit is a programmer-oriented testing f...   14                   [OK]tetraweb/php              PHP 5.3, 5.4, 5.5, 5.6, 7.0 for CI and run...   12                   [OK]webdevops/php             PHP (FPM and CLI) service container             10                   [OK]...

这里我们拉取官方的镜像,标签为5.6-fpm

51coolma@51coolma:~/php-fpm$ docker pull php:5.6-fpm

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为php,标签为5.6-fpm的镜像。


使用php-fpm镜像

运行容器

51coolma@51coolma:~/php-fpm$ docker run -p 9000:9000 --name  myphp-fpm -v ~/nginx/www:/www -v $PWD/conf:/usr/local/etc/php -v $PWD/logs:/phplogs   -d php:5.6-fpm00c5aa4c2f93ec3486936f45b5f2b450187a9d09acb18f5ac9aa7a5f405dbedf51coolma@51coolma:~/php-fpm$ 

命令说明:

  • -p 9000:9000 :将容器的9000端口映射到主机的9000端口

  • --name myphp-fpm :将容器命名为myphp-fpm

  • -v ~/nginx/www:/www :将主机中项目的目录www挂载到容器的/www

  • -v $PWD/conf:/usr/local/etc/php :将主机中当前目录下的conf目录挂载到容器的/usr/local/etc/php

  • -v $PWD/logs:/phplogs :将主机中当前目录下的logs目录挂载到容器的/phplogs

查看容器启动情况

51coolma@51coolma:~/php-fpm$ docker psCONTAINER ID    IMAGE         COMMAND      ...    PORTS                    NAMES00c5aa4c2f93    php:5.6-fpm   "php-fpm"    ...    0.0.0.0:9000->9000/tcp   myphp-fpm
通过浏览器访问phpinfo()

PS:此处是通过nginx+php实现web服务,nginx配置文件的fastcgi_pass应该配置为myphp-fpm容器的IP。

fastcgi_pass  172.17.0.4:9000;

容器IP的查方法

docker inspect 容器ID或容器名 |grep '"IPAddress"'

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录mysql,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf

data目录将映射为mysql容器配置的数据文件存放路径

logs目录将映射为mysql容器的日志目录

conf目录里的配置文件将映射为mysql容器的配置文件

进入创建的mysql目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mysql && useradd -r -g mysql mysql# add gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x 	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* 	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" 	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu 	&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc 	&& chmod +x /usr/local/bin/gosu 	&& gosu nobody true 	&& apt-get purge -y --auto-remove ca-certificates wgetRUN mkdir /docker-entrypoint-initdb.d# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:# File::Basename# File::Copy# Sys::Hostname# Data::DumperRUN apt-get update && apt-get install -y perl pwgen --no-install-recommends && rm -rf /var/lib/apt/lists/*# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" importedRUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5ENV MYSQL_MAJOR 5.6ENV MYSQL_VERSION 5.6.31-1debian8RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)# also, we set debconf keys to make APT a little quieterRUN { 		echo mysql-community-server mysql-community-server/data-dir select ''; 		echo mysql-community-server mysql-community-server/root-pass password ''; 		echo mysql-community-server mysql-community-server/re-root-pass password ''; 		echo mysql-community-server mysql-community-server/remove-test-db select false; 	} | debconf-set-selections 	&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* 	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld 	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime	&& chmod 777 /var/run/mysqld# comment out a few problematic configuration values# don't reverse lookup hostnames, they are usually another containerRUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf 	&& echo 'skip-host-cache
skip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf 	&& mv /tmp/my.cnf /etc/mysql/my.cnfVOLUME /var/lib/mysqlCOPY docker-entrypoint.sh /usr/local/bin/RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compatENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306CMD ["mysqld"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/mysql$ docker build -t mysql .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/mysql$ docker images |grep mysqlmysql               5.6                 2c0964ec182a        3 weeks ago         329 MB

方法二、docker pull mysql

查找Docker Hub上的mysql镜像

51coolma@51coolma:/mysql$ docker search mysqlNAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql                    MySQL is a widely used, open-source relati...   2529      [OK]       mysql/mysql-server       Optimized MySQL Server Docker images. Crea...   161                  [OK]centurylink/mysql        Image containing mysql. Optimized to be li...   45                   [OK]sameersbn/mysql                                                          36                   [OK]google/mysql             MySQL server for Google Compute Engine          16                   [OK]appcontainers/mysql      Centos/Debian Based Customizable MySQL Con...   8                    [OK]marvambass/mysql         MySQL Server based on Ubuntu 14.04              6                    [OK]drupaldocker/mysql       MySQL for Drupal                                2                    [OK]azukiapp/mysql           Docker image to run MySQL by Azuki - http:...   2                    [OK]...

这里我们拉取官方的镜像,标签为5.6

51coolma@51coolma:~/mysql$ docker pull mysql:5.6

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.6的镜像。


使用mysql镜像

运行容器

51coolma@51coolma:~/mysql$ docker run -p 3306:3306 --name mymysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.621cb89213c93d805c5bacf1028a0da7b5c5852761ba81327e6b99bb3ea89930e51coolma@51coolma:~/mysql$ 

命令说明:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口

  • -v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf

  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs

  • -v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data

  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

查看容器启动情况

51coolma@51coolma:~/mysql$ docker ps CONTAINER ID    IMAGE         COMMAND                  ...  PORTS                    NAMES21cb89213c93    mysql:5.6    "docker-entrypoint.sh"    ...  0.0.0.0:3306->3306/tcp   mymysql

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录tomcat,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/tomcat/webapps ~/tomcat/logs ~/tomcat/conf

webapps目录将映射为tomcat容器配置的应用程序目录

logs目录将映射为tomcat容器的日志目录

conf目录里的配置文件将映射为tomcat容器的配置文件

进入创建的tomcat目录,创建Dockerfile

FROM java:8-jreENV CATALINA_HOME /usr/local/tomcatENV PATH $CATALINA_HOME/bin:$PATHRUN mkdir -p "$CATALINA_HOME"WORKDIR $CATALINA_HOME# runtime dependencies for Tomcat Native Libraries# Tomcat Native 1.2+ requires a newer version of OpenSSL than debian:jessie has available (1.0.2g+)# see http://tomcat.10.x6.nabble.com/VOTE-Release-Apache-Tomcat-8-0-32-tp5046007p5046024.html (and following discussion)ENV OPENSSL_VERSION 1.0.2h-1RUN {                 echo 'deb http://httpredir.debian.org/debian unstable main';         } > /etc/apt/sources.list.d/unstable.list         && { # add a negative "Pin-Priority" so that we never ever get packages from unstable unless we explicitly request them                echo 'Package: *';                 echo 'Pin: release a=unstable';                 echo 'Pin-Priority: -10';                 echo; # except OpenSSL, which is the reason we're here                echo 'Package: openssl libssl*';                 echo "Pin: version $OPENSSL_VERSION";                 echo 'Pin-Priority: 990';         } > /etc/apt/preferences.d/unstable-opensslRUN apt-get update && apt-get install -y --no-install-recommends                 libapr1                 openssl="$OPENSSL_VERSION"         && rm -rf /var/lib/apt/lists/*# see https://www.apache.org/dist/tomcat/tomcat-8/KEYSRUN set -ex         && for key in                 05AB33110949707C93A279E3D3EFE6B686867BA6                 07E48665A34DCAFAE522E5E6266191C37C037D42                 47309207D818FFD8DCD3F83F1931D684307A10A5                 541FBE7D8F78B25E055DDEE13C370389288584E7                 61B832AC2F1C5A90F0F9B00A1C506407564C17A3                 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED                 9BA44C2621385CB966EBA586F72C284D731FABEE                 A27677289986DB50844682F8ACB77FC2E86E29AC                 A9C5DF4D22E99998D9875A5110C01C5A2F6059E7                 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243                 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE                 F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23         ; do                 gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key";         doneENV TOMCAT_MAJOR 8ENV TOMCAT_VERSION 8.0.35ENV TOMCAT_TGZ_URL https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gzRUN set -x                 && curl -fSL "$TOMCAT_TGZ_URL" -o tomcat.tar.gz         && curl -fSL "$TOMCAT_TGZ_URL.asc" -o tomcat.tar.gz.asc         && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz         && tar -xvf tomcat.tar.gz --strip-components=1         && rm bin/*.bat         && rm tomcat.tar.gz*                 && nativeBuildDir="$(mktemp -d)"         && tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1         && nativeBuildDeps="                 gcc                 libapr1-dev                 libssl-dev                 make                 openjdk-${JAVA_VERSION%%[-~bu]*}-jdk=$JAVA_DEBIAN_VERSION         "         && apt-get update && apt-get install -y --no-install-recommends $nativeBuildDeps && rm -rf /var/lib/apt/lists/*         && (                 export CATALINA_HOME="$PWD"                 && cd "$nativeBuildDir/native"                 && ./configure                         --libdir=/usr/lib/jni                         --prefix="$CATALINA_HOME"                         --with-apr=/usr/bin/apr-1-config                         --with-java-home="$(docker-java-home)"                         --with-ssl=yes                 && make -j$(nproc)                 && make install         )         && apt-get purge -y --auto-remove $nativeBuildDeps         && rm -rf "$nativeBuildDir"         && rm bin/tomcat-native.tar.gz# verify Tomcat Native is working properlyRUN set -e         && nativeLines="$(catalina.sh configtest 2>&1)"         && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"         && nativeLines="$(echo "$nativeLines" | sort -u)"         && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then                 echo >&2 "$nativeLines";                 exit 1;         fiEXPOSE 8080CMD ["catalina.sh", "run"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/tomcat$ docker build -t tomcat .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/tomcat$ docker images|grep tomcattomcat              latest              70f819d3d2d9        7 days ago          335.8 MB

方法二、docker pull tomcat

查找Docker Hub上的tomcat镜像

51coolma@51coolma:~/tomcat$ docker search tomcatNAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDtomcat                     Apache Tomcat is an open source implementa...   744       [OK]       dordoka/tomcat             Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   19                   [OK]consol/tomcat-7.0          Tomcat 7.0.57, 8080, "admin/admin"              16                   [OK]consol/tomcat-8.0          Tomcat 8.0.15, 8080, "admin/admin"              14                   [OK]cloudesire/tomcat          Tomcat server, 6/7/8                            8                    [OK]davidcaste/alpine-tomcat   Apache Tomcat 7/8 using Oracle Java 7/8 wi...   6                    [OK]andreptb/tomcat            Debian Jessie based image with Apache Tomc...   4                    [OK]kieker/tomcat                                                              2                    [OK]fbrx/tomcat                Minimal Tomcat image based on Alpine Linux      2                    [OK]jtech/tomcat               Latest Tomcat production distribution on l...   1                    [OK]

这里我们拉取官方的镜像

51coolma@51coolma:~/tomcat$ docker pull tomcat

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为tomcat的镜像。


使用tomcat镜像

运行容器

51coolma@51coolma:~/tomcat$ docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat  acb33fcb4beb8d7f1ebace6f50f5fc204b1dbe9d524881267aa715c61cf7532051coolma@51coolma:~/tomcat$

命令说明:

-p 8080:8080:将容器的8080端口映射到主机的8080端口

-v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test

查看容器启动情况

51coolma@51coolma:~/tomcat$ docker ps CONTAINER ID    IMAGE     COMMAND               ... PORTS                    NAMESacb33fcb4beb    tomcat    "catalina.sh run"     ... 0.0.0.0:8080->8080/tcp   tomcat

通过浏览器访问

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录python,用于存放后面的相关东西。

51coolma@51coolma:~$ mdkir -p ~/python ~/python/myapp

myapp目录将映射为python容器配置的应用目录

进入创建的python目录,创建Dockerfile

FROM buildpack-deps:jessie# remove several traces of debian pythonRUN apt-get purge -y python.*# http://bugs.python.org/issue19846# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.ENV LANG C.UTF-8# gpg: key F73C700D: public key "Larry Hastings <larry@hastings.org>" importedENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700DENV PYTHON_VERSION 3.5.1# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'"ENV PYTHON_PIP_VERSION 8.1.2RUN set -ex         && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz         && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc         && export GNUPGHOME="$(mktemp -d)"         && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY"         && gpg --batch --verify python.tar.xz.asc python.tar.xz         && rm -r "$GNUPGHOME" python.tar.xz.asc         && mkdir -p /usr/src/python         && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz         && rm python.tar.xz                 && cd /usr/src/python         && ./configure --enable-shared --enable-unicode=ucs4         && make -j$(nproc)         && make install         && ldconfig         && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION         && find /usr/local -depth                 (                     ( -type d -a -name test -o -name tests )                     -o                     ( -type f -a -name '*.pyc' -o -name '*.pyo' )                 ) -exec rm -rf '{}' +         && rm -rf /usr/src/python ~/.cache# make some useful symlinks that are expected to existRUN cd /usr/local/bin         && ln -s easy_install-3.5 easy_install         && ln -s idle3 idle         && ln -s pydoc3 pydoc         && ln -s python3 python         && ln -s python3-config python-configCMD ["python3"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/python$ docker build -t python:3.5 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/python$ docker images python:3.5 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEpython              3.5              045767ddf24a        9 days ago          684.1 MB

方法二、docker pull python:3.5

查找Docker Hub上的python镜像

51coolma@51coolma:~/python$ docker search pythonNAME                           DESCRIPTION                        STARS     OFFICIAL   AUTOMATEDpython                         Python is an interpreted,...       982       [OK]       kaggle/python                  Docker image for Python...         33                   [OK]azukiapp/python                Docker image to run Python ...     3                    [OK]vimagick/python                mini python                                  2          [OK]tsuru/python                   Image for the Python ...           2                    [OK]pandada8/alpine-python         An alpine based python image                 1          [OK]1science/python                Python Docker images based on ...  1                    [OK]lucidfrontier45/python-uwsgi   Python with uWSGI                  1                    [OK]orbweb/python                  Python image                       1                    [OK]pathwar/python                 Python template for Pathwar levels 1                    [OK]rounds/10m-python              Python, setuptools and pip.        0                    [OK]ruimashita/python              ubuntu 14.04 python                0                    [OK]tnanba/python                  Python on CentOS-7 image.          0                    [OK]

这里我们拉取官方的镜像,标签为3.5

51coolma@51coolma:~/python$ docker pull python:3.5

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像。


使用python镜像

在~/python/myapp目录下创建一个 helloworld.py 文件,代码如下:

#!/usr/bin/pythonprint("Hello, World!");

运行容器

51coolma@51coolma:~/python$ docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py

命令说明:

-v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp

-w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录

python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件

输出结果:

Hello, World!


方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录redis,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/redis ~/redis/data

data目录将映射为redis容器配置的/data目录,作为redis数据持久化的存储目录

进入创建的redis目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r redis && useradd -r -g redis redisRUN apt-get update && apt-get install -y --no-install-recommends                 ca-certificates                 wget         && rm -rf /var/lib/apt/lists/*# grab gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x         && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)"         && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc"         && export GNUPGHOME="$(mktemp -d)"         && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4         && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu         && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc         && chmod +x /usr/local/bin/gosu         && gosu nobody trueENV REDIS_VERSION 3.2.0ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.0.tar.gzENV REDIS_DOWNLOAD_SHA1 0c1820931094369c8cc19fc1be62f598bc5961ca# for redis-sentinel see: http://redis.io/topics/sentinelRUN buildDeps='gcc libc6-dev make'         && set -x         && apt-get update && apt-get install -y $buildDeps --no-install-recommends         && rm -rf /var/lib/apt/lists/*         && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL"         && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c -         && mkdir -p /usr/src/redis         && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1         && rm redis.tar.gz         && make -C /usr/src/redis         && make -C /usr/src/redis install         && rm -r /usr/src/redis         && apt-get purge -y --auto-remove $buildDepsRUN mkdir /data && chown redis:redis /dataVOLUME /dataWORKDIR /dataCOPY docker-entrypoint.sh /usr/local/bin/ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 6379CMD [ "redis-server" ]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/redis$ docker build  -t redis:3.2 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/redis$ docker images redis REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEredis               3.2                 43c923d57784        2 weeks ago         193.9 MB

方法二、docker pull redis:3.2

查找Docker Hub上的redis镜像

51coolma@51coolma:~/redis$ docker search  redisNAME                      DESCRIPTION                   STARS  OFFICIAL  AUTOMATEDredis                     Redis is an open source ...   2321   [OK]       sameersbn/redis                                         32                   [OK]torusware/speedus-redis   Always updated official ...   29		     [OK]bitnami/redis             Bitnami Redis Docker Image    22                   [OK]anapsix/redis             11MB Redis server image ...   6                    [OK]webhippie/redis           Docker images for redis       4                    [OK]clue/redis-benchmark      A minimal docker image t...   3                    [OK]williamyeh/redis          Redis image for Docker        3                    [OK]unblibraries/redis        Leverages phusion/baseim...   2                    [OK]greytip/redis             redis 3.0.3                   1                    [OK]servivum/redis            Redis Docker Image            1                    [OK]...

这里我们拉取官方的镜像,标签为3.2

51coolma@51coolma:~/redis$ docker pull  redis:3.2

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为redis,标签为3.2的镜像。


使用redis镜像

运行容器

51coolma@51coolma:~/redis$ docker run -p 6379:6379 -v $PWD/data:/data  -d redis:3.2 redis-server --appendonly yes43f7a65ec7f8bd64eb1c5d82bc4fb60e5eb31915979c4e7821759aac3b62f33051coolma@51coolma:~/redis$

命令说明:

-p 6379:6379 :将容器的6379端口映射到主机的6379端口

-v $PWD/data:/data :将主机中当前目录下的data挂载到容器的/data

redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置

查看容器启动情况

51coolma@51coolma:~/redis$ docker psCONTAINER ID   IMAGE        COMMAND                 ...   PORTS                      NAMES43f7a65ec7f8   redis:3.2    "docker-entrypoint.sh"  ...   0.0.0.0:6379->6379/tcp     agitated_cray

连接、查看容器

使用redis镜像执行redis-cli命令连接到刚启动的容器,主机IP为172.17.0.1

51coolma@51coolma:~/redis$ docker run -it redis:3.2 redis-cli -h 172.17.0.1172.17.0.1:6379> info# Serverredis_version:3.2.0redis_git_sha1:00000000redis_git_dirty:0redis_build_id:f449541256e7d446redis_mode:standaloneos:Linux 4.2.0-16-generic x86_64arch_bits:64multiplexing_api:epoll...

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录mongo,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/mongo  ~/mongo/db

db目录将映射为mongo容器配置的/data/db目录,作为mongo数据的存储目录

进入创建的mongo目录,创建Dockerfile

FROM debian:wheezy# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mongodb && useradd -r -g mongodb mongodbRUN apt-get update 	&& apt-get install -y --no-install-recommends 		numactl 	&& rm -rf /var/lib/apt/lists/*# grab gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x 	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* 	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" 	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu 	&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc 	&& chmod +x /usr/local/bin/gosu 	&& gosu nobody true 	&& apt-get purge -y --auto-remove ca-certificates wget# gpg: key 7F0CEB10: public key "Richard Kreuter <richard@10gen.com>" importedRUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10ENV MONGO_MAJOR 3.0ENV MONGO_VERSION 3.0.12RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.listRUN set -x 	&& apt-get update 	&& apt-get install -y 		mongodb-org=$MONGO_VERSION 		mongodb-org-server=$MONGO_VERSION 		mongodb-org-shell=$MONGO_VERSION 		mongodb-org-mongos=$MONGO_VERSION 		mongodb-org-tools=$MONGO_VERSION 	&& rm -rf /var/lib/apt/lists/* 	&& rm -rf /var/lib/mongodb 	&& mv /etc/mongod.conf /etc/mongod.conf.origRUN mkdir -p /data/db /data/configdb 	&& chown -R mongodb:mongodb /data/db /data/configdbVOLUME /data/db /data/configdbCOPY docker-entrypoint.sh /entrypoint.shENTRYPOINT ["/entrypoint.sh"]EXPOSE 27017CMD ["mongod"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/mongo$ docker build -t mongo:3.2 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/mongo$ docker images  mongo:3.2REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmongo               3.2                 282fd552add6        9 days ago          336.1 MB

方法二、docker pull mongo:3.2

查找Docker Hub上的mongo镜像

51coolma@51coolma:~/mongo$ docker search mongoNAME                              DESCRIPTION                      STARS     OFFICIAL   AUTOMATEDmongo                             MongoDB document databases ...   1989      [OK]       mongo-express                     Web-based MongoDB admin int...   22        [OK]       mvertes/alpine-mongo              light MongoDB container          19                   [OK]mongooseim/mongooseim-docker      MongooseIM server the lates...   9                    [OK]torusware/speedus-mongo           Always updated official Mon...   9                    [OK]jacksoncage/mongo                 Instant MongoDB sharded cluster  6                    [OK]mongoclient/mongoclient           Official docker image for M...   4                    [OK]jadsonlourenco/mongo-rocks        Percona Mongodb with Rocksd...   4                    [OK]asteris/apache-php-mongo          Apache2.4 + PHP + Mongo + m...   2                    [OK]19hz/mongo-container              Mongodb replicaset for coreos    1                    [OK]nitra/mongo                       Mongo3 centos7                   1                    [OK]ackee/mongo                       MongoDB with fixed Bluemix p...  1                    [OK]kobotoolbox/mongo                 https://github.com/kobotoolb...  1                    [OK]valtlfelipe/mongo                 Docker Image based on the la...  1                    [OK]

这里我们拉取官方的镜像,标签为3.2

51coolma@51coolma:~/mongo$ docker pull mongo:3.2

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mongo,标签为3.2的镜像。


使用mongo镜像

运行容器

51coolma@51coolma:~/mongo$ docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2cda8830cad5fe35e9c4aed037bbd5434b69b19bf2075c8626911e6ebb08cad5151coolma@51coolma:~/mongo$

命令说明:

-p 27017:27017 :将容器的27017 端口映射到主机的27017 端口

-v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录

查看容器启动情况

51coolma@51coolma:~/mongo$ docker ps CONTAINER ID   IMAGE        COMMAND                   ...    PORTS                      NAMEScda8830cad5f   mongo:3.2    "/entrypoint.sh mongo"    ...    0.0.0.0:27017->27017/tcp   suspicious_goodall

使用mongo镜像执行mongo 命令连接到刚启动的容器,主机IP为172.17.0.1

51coolma@51coolma:~/mongo$ docker run -it mongo:3.2 mongo --host 172.17.0.1MongoDB shell version: 3.2.7connecting to: 172.17.0.1:27017/testWelcome to the MongoDB shell.For interactive help, type "help".For more comprehensive documentation, see  http://docs.mongodb.org/Questions? Try the support group  http://groups.google.com/group/mongodb-user>

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录apache,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p  ~/apache/www ~/apache/logs ~/apache/conf 

www目录将映射为apache容器配置的应用程序目录

logs目录将映射为apache容器的日志目录

conf目录里的配置文件将映射为apache容器的配置文件

进入创建的apache目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added#RUN groupadd -r www-data && useradd -r --create-home -g www-data www-dataENV HTTPD_PREFIX /usr/local/apache2ENV PATH $PATH:$HTTPD_PREFIX/binRUN mkdir -p "$HTTPD_PREFIX" 	&& chown www-data:www-data "$HTTPD_PREFIX"WORKDIR $HTTPD_PREFIX# install httpd runtime dependencies# https://httpd.apache.org/docs/2.4/install.html#requirementsRUN apt-get update 	&& apt-get install -y --no-install-recommends 		libapr1 		libaprutil1 		libaprutil1-ldap 		libapr1-dev 		libaprutil1-dev 		libpcre++0 		libssl1.0.0 	&& rm -r /var/lib/apt/lists/*ENV HTTPD_VERSION 2.4.20ENV HTTPD_BZ2_URL https://www.apache.org/dist/httpd/httpd-$HTTPD_VERSION.tar.bz2RUN buildDeps=' 		ca-certificates 		curl 		bzip2 		gcc 		libpcre++-dev 		libssl-dev 		make 	' 	set -x 	&& apt-get update 	&& apt-get install -y --no-install-recommends $buildDeps 	&& rm -r /var/lib/apt/lists/* 		&& curl -fSL "$HTTPD_BZ2_URL" -o httpd.tar.bz2 	&& curl -fSL "$HTTPD_BZ2_URL.asc" -o httpd.tar.bz2.asc # see https://httpd.apache.org/download.cgi#verify	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys A93D62ECC3C8EA12DB220EC934EA76E6791485A8 	&& gpg --batch --verify httpd.tar.bz2.asc httpd.tar.bz2 	&& rm -r "$GNUPGHOME" httpd.tar.bz2.asc 		&& mkdir -p src 	&& tar -xvf httpd.tar.bz2 -C src --strip-components=1 	&& rm httpd.tar.bz2 	&& cd src 		&& ./configure 		--prefix="$HTTPD_PREFIX" 		--enable-mods-shared=reallyall 	&& make -j"$(nproc)" 	&& make install 		&& cd .. 	&& rm -r src 		&& sed -ri 		-e 's!^(s*CustomLog)s+S+!1 /proc/self/fd/1!g' 		-e 's!^(s*ErrorLog)s+S+!1 /proc/self/fd/2!g' 		"$HTTPD_PREFIX/conf/httpd.conf" 		&& apt-get purge -y --auto-remove $buildDepsCOPY httpd-foreground /usr/local/bin/EXPOSE 80CMD ["httpd-foreground"]

Dockerfile文件中 COPY httpd-foreground /usr/local/bin/ 是将当前目录下的httpd-foreground拷贝到镜像里,作为httpd服务的启动脚本,所以我们要在本地创建一个脚本文件httpd-foreground

#!/bin/bashset -e# Apache gets grumpy about PID files pre-existingrm -f /usr/local/apache2/logs/httpd.pidexec httpd -DFOREGROUND

赋予httpd-foreground文件可执行权限

51coolma@51coolma:~/apache$ chmod +x httpd-foreground

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/apache$ docker build -t httpd .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/apache$ docker images httpdREPOSITORY     TAG        IMAGE ID        CREATED           SIZEhttpd          latest     da1536b4ef14    23 seconds ago    195.1 MB

方法二、docker pull httpd

查找Docker Hub上的httpd镜像

51coolma@51coolma:~/apache$ docker search httpdNAME                           DESCRIPTION                  STARS  OFFICIAL AUTOMATEDhttpd                          The Apache HTTP Server ..    524     [OK]       centos/httpd                                                7                [OK]rgielen/httpd-image-php5       Docker image for Apache...   1                [OK]microwebapps/httpd-frontend    Httpd frontend allowing...   1                [OK]lolhens/httpd                  Apache httpd 2 Server        1                [OK]publici/httpd                  httpd:latest                 0                [OK]publicisworldwide/httpd        The Apache httpd webser...   0                [OK]rgielen/httpd-image-simple     Docker image for simple...   0                [OK]solsson/httpd                  Derivatives of the offi...   0                [OK]rgielen/httpd-image-drush      Apache HTTPD + Drupal S...   0                [OK]learninglayers/httpd                                        0                [OK]sohrabkhan/httpd               Docker httpd + php5.6 (...   0                [OK]aintohvri/docker-httpd         Apache HTTPD Docker ext...   0                [OK]alizarion/httpd                httpd on centos with mo...   0                [OK]...

这里我们拉取官方的镜像

51coolma@51coolma:~/apache$ docker pull httpd

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为httpd的镜像。


使用apache镜像

运行容器

docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $PWD/logs/:/usr/local/apache2/logs/ -d httpd

命令说明:

-p 80:80 :将容器的80端口映射到主机的80端口

-v $PWD/www/:/usr/local/apache2/htdocs/ :将主机中当前目录下的www目录挂载到容器的/usr/local/apache2/htdocs/

-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf :将主机中当前目录下的conf/httpd.conf文件挂载到容器的/usr/local/apache2/conf/httpd.conf

-v $PWD/logs/:/usr/local/apache2/logs/ :将主机中当前目录下的logs目录挂载到容器的/usr/local/apache2/logs/

查看容器启动情况

51coolma@51coolma:~/apache$ docker psCONTAINER ID  IMAGE   COMMAND             ... PORTS               NAMES79a97f2aac37  httpd   "httpd-foreground"  ... 0.0.0.0:80->80/tcp  sharp_swanson

通过浏览器访问


docker run

# 运行一个容器docker run -it -p 8088:8088 -p 8089:8089 -p 8090:9090 -v /root/soft/docker:/root/soft/docker -v /root/soft/dockertt:/root/soft/dockertt loen/rc /bin/bash命令的格式:Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]-a, --attach=[] 登录容器(以docker run -d启动的容器)-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU-d, --detach=false 指定容器运行于前台还是后台--device=[] 添加主机设备给容器,相当于设备直通--dns=[] 指定容器的dns服务器--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件-e, --env=[] 指定环境变量,容器中可以使用该环境变量--entrypoint="" 覆盖image的入口点--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口-h, --hostname="" 指定容器的主机名-i, --interactive=false 打开STDIN,用于控制台交互--link=[] 指定容器间的关联,使用其他容器的IP、env等信息--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用-m, --memory="" 指定容器的内存上限--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字--net="bridge" 容器网络设置,待详述-P, --publish-all=false 指定容器暴露的端口,待详述-p, --publish=[] 指定容器暴露的端口,待详述--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities--restart="" 指定容器停止后的重启策略,待详述--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理-t, --tty=false 分配tty设备,该可以支持终端登录-u, --user="" 指定容器的用户-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录-w, --workdir="" 指定容器的工作目录>>>>>> 详细讲解端口暴露-P参数:docker自动映射暴露端口;docker run -d -P training/webapp <span style="color:#009900;">//docker自动在host上打开49000到49900的端口,映射到容器(由镜像指定,或者--expose参数指定)的暴露端口;</span>-p参数:指定端口或IP进行映射;docker run -d -p 5000:80 training/webapp <span style="color:#009900;">//host上5000号端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1:5000:80 training/webapp <span style="color:#009900;">//host上127.0.0.1:5000号端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1::5000 training/webapp <span style="color:#009900;">//host上127.0.0.1:随机端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1:5000:5000/udp training/webapp <span style="color:#009900;">//绑定udp端口;</span>网络配置--net=bridge: <span style="color:#009900;">//使用docker daemon指定的网桥</span>--net=host: <span style="color:#009900;">//容器使用主机的网络</span>--net=container:NAME_or_ID:<span style="color:#009900;">//使用其他容器的网路,共享IP和PORT等网络资源</span>--net=none: <span style="color:#009900;">//容器使用自己的网络(类似--net=bridge),但是不进行配置</span>

docker stop

# 关闭运行中的容器docker stop 容器ID

docker start

# 启动一个已经停止的容器docker start 容器ID# 重启一个容器docker restart 容器ID

docker attach

# 进入一个运行中的容器docker attach 容器ID

docker ps

# 显示全部容器docker ps -a# 显示当前运行的容器docker ps

docker images

# 查看本地镜像docker images

docker rmi

# 删除所有镜像docker rmi $(docker images | grep -v RESPOSITORY | awk '{print $3}')

docker build

# 构建容器docker build -t 镜像名称 .     # 后面的. 指的是当前文件夹 (其实是Dockerfile存放的文件夹)# 建立映像文件。–rm 选项是告诉Docker,在构建完成后删除临时的Container,Dockerfile的每一行指令都会创建一个临时的Container,一般这些临时生成的Container是不需要的docker build --rm=true -t loen/lamp .

docker rm

# 删除容器docker rm 容器ID# 删除所有容器docker rm $(docker ps -a) 

docker history

# 查看历史docker history 镜像ID

docker export

# 导出容器docker export 容器ID > xxx.tar

docker save

# 把 mynewimage 镜像保存成 tar 文件docker save myimage | bzip2 -9 -c> /home/save.tar.bz2

docker load

# 加载 myimage 镜像bzip2 -d -c < /home/save.tar.bz2 | docker load


Docker官方英文资源

docker官网:http://www.docker.com

Docker windows入门:https://docs.docker.com/windows/

Docker Linux 入门:https://docs.docker.com/linux/

Docker mac 入门:https://docs.docker.com/mac/

Docker 用户指引:https://docs.docker.com/engine/userguide/

Docker 官方博客:http://blog.docker.com/

Docker Hub: https://hub.docker.com/

Docker开源: https://www.docker.com/open-source

Docker中文资源

Docker中文网站:http://www.docker.org.cn

Docker安装手册:http://www.docker.org.cn/book/install.html

一小时Docker教程 :https://blog.csphere.cn/archives/22

Docker 从入门到实践:http://dockerpool.com/static/books/docker_practice/index.html

Docker中文指南:http://www.widuu.com/chinese_docker/index.html

其它资源

https://segmentfault.com/t/docker

https://github.com/docker/docker

https://wiki.openstack.org/wiki/Docker

https://wiki.archlinux.org/index.php/Docker

如果有更好的资源,欢迎通过右下角的反馈按钮发邮件给我们……

这是Docker的快速参考备忘单您可以在此处找到最常用的 Docker 命令。

开始

入门

在后台创建和运行容器

$ docker run -d -p 80:80 docker/getting-started

  • -d - 在分离模式下运行容器
  • -p 80:80 - 将端口 80 映射到容器中的端口 80
  • docker/getting-started - 要使用的图像

在前台创建并运行容器

$ docker run -it -p 8001:8080 --name my-nginx nginx

  • -it - 交互式 bash 模式
  • -p 8001:8080 - 将端口 8001 映射到容器中的端口 8080
  • --name my-nginx - 指定名称
  • nginx - 要使用的图像

一般命令

命令描述
docker ps列出正在运行的容器
docker ps -a列出所有容器
docker ps -s列出正在运行的容器
(带 CPU/内存)
docker images列出所有图像
docker exec -it <container> bash连接到容器
docker logs <container>显示容器的控制台日志
docker stop <container>停止一个容器
docker restart <container>重启一个容器
docker rm <container>移除一个容器
docker port <container>显示容器的端口映射
docker top <container>列出进程
docker kill <container>杀死一个容器

参数<container>可以是容器 ID 或名称

Docker 容器

启动和停止

命令描述
docker start nginx-server开始
docker stop nginx-server停止
docker restart nginx-server重启
docker pause nginx-server暂停
docker unpause nginx-server取消暂停
docker wait nginx-server阻塞容器
docker kill nginx-server发送 SIGKILL
docker attach nginx-server连接到现有容器

信息

命令描述
docker ps列出正在运行的容器
docker ps -a列出所有容器
docker logs nginx-server容器日志
docker inspect nginx-server检查容器
docker events nginx-server容器事件
docker port nginx-server公共端口
docker top nginx-server运行进程
docker stats nginx-server容器资源使用
docker diff nginx-server列出对容器所做的更改。

创建

docker create [options] IMAGE  -a, --attach               # attach stdout/err  -i, --interactive          # attach stdin (interactive)  -t, --tty                  # pseudo-tty      --name NAME            # name your image  -p, --publish 5000:5000    # port map (host:container)      --expose 5432          # expose a port to containers  -P, --publish-all          # publish all ports      --link container:alias # linking  -v, --volume `pwd`:/app    # mount (absolute paths needed)  -e, --env NAME=hello       # env vars

例子

$ docker create --name my_redis --expose 6379 redis:3.0.2

操作

重命名容器

docker rename my-nginx nginx-server

移除容器

docker rm nginx-server

更新容器

docker update --cpu-shares 512 -m 300M nginx-server

Docker 镜像

操作

命令 描述 docker images列出图像 docker rmi nginx删除图像 docker load < ubuntu.tar.gz加载 tarred 存储库 docker load --input ubuntu.tar加载 tarred 存储库 docker save busybox > ubuntu.tar将图像保存到 tar 存档 docker history显示图像的历史 docker commit nginx将容器另存为图像。 docker tag nginx eon01/nginx标记图像 docker push eon01/nginx推送图片

构建图像

$ docker build .$ docker build github.com/creack/docker-firefox$ docker build - < Dockerfile$ docker build - < context.tar.gz$ docker build -t eon/nginx-server .$ docker build -f myOtherDockerfile .$ curl example.com/remote/Dockerfile | docker build -f - .

Docker 网络

操作

删除网络

docker network rm MyOverlayNetwork

列出网络

docker network ls

获取有关网络的信息

docker network inspect MyOverlayNetwork

将正在运行的容器连接到网络

docker network connect MyOverlayNetwork nginx

启动时将容器连接到网络

docker run -it -d --network=MyOverlayNetwork nginx

断开容器与网络的连接

docker network disconnect MyOverlayNetwork nginx

创建网络

docker network create -d overlay MyOverlayNetworkdocker network create -d bridge MyBridgeNetworkdocker network create -d overlay   --subnet=192.168.0.0/16   --subnet=192.170.0.0/16   --gateway=192.168.0.100   --gateway=192.170.0.100   --ip-range=192.168.1.0/24   --aux-address="my-router=192.168.1.5"   --aux-address="my-switch=192.168.1.6"   --aux-address="my-printer=192.170.1.5"   --aux-address="my-nas=192.170.1.6"   MyOverlayNetwork

其他

码头工人中心

Docker 语法 描述 docker search search_word在 docker hub 中搜索图像。 docker pull user/image 从 docker hub 下载镜像。 docker login 向 docker hub 进行身份验证 docker push user/image 将图像上传到 docker hub。

注册表命令

登录注册表

$ docker login$ docker login localhost:8080

从注册表注销

$ docker logout$ docker logout localhost:8080

搜索图像

$ docker search nginx$ docker search nginx --stars=3 --no-trunc busybox

拉取镜像

$ docker pull nginx$ docker pull eon01/nginx localhost:5000/myadmin/nginx

推送图像

$ docker push eon01/nginx$ docker push eon01/nginx localhost:5000/myadmin/nginx

批量清理

命令描述
docker stop -f $(docker ps -a -q)停止所有容器
docker rm -f $(docker ps -a -q)删除所有容器
docker rmi -f $(docker images -q)删除所有图像

容量

检查容量

$ docker volume ls

清理未使用的容量

$ docker volume prune


Docker 支持以下的 Ubuntu 版本:

  • Ubuntu Precise 12.04 (LTS)
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Wily 15.10
  • 其他更新的版本……


前提条件

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。

通过 uname -r 命令查看你当前的内核版本

51coolma@51coolma:~$ uname -r



使用脚本安装 Docker

1、获取最新版本的 Docker 安装包

51coolma@51coolma:~$ sudo apt-get update


51coolma@51coolma:~$ sudo apt-get install -y docker.io


2、启动docker 后台服务

51coolma@51coolma:~$ sudo service docker start


Docker支持以下的CentOS版本:

  • CentOS 7 (64-bit)
  • CentOS 6.5 (64-bit) 或更高的版本

前提条件

目前,CentOS 仅发行版本中的内核支持 Docker。

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。


使用 yum 安装(CentOS 7下)

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过 uname -r 命令查看你当前的内核版本
[root@51coolma ~]# uname -r 3.10.0-327.el7.x86_64


安装 Docker

Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

[root@51coolma ~]# yum -y install docker


安装完成。

启动 Docker 后台服务

[root@51coolma ~]# service docker start


测试运行 hello-world

[root@51coolma ~]#docker run hello-world


由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。


使用脚本安装 Docker

1、使用 sudoroot 权限登录 Centos。

2、确保 yum 包更新到最新。

$ sudo yum update

3、执行 Docker 安装脚本。

$ curl -fsSL https://get.docker.com/ | sh

执行这个脚本会添加 docker.repo 源并安装 Docker。

4、启动 Docker 进程。

$ sudo service docker start

5、验证 docker 是否安装成功并在容器中执行一个测试的镜像。

$ sudo docker run hello-world

到此,docker 在 CentOS 系统的安装完成。

Docker 引擎使用的是 Linux 内核特性,所以我们需要在 Windows 上使用一个轻量级的虚拟机 (VM) 来运行 Docker。

我们通过 Boot2Docker 来安装虚拟机和运行 Docker


安装

1、安装Boot2Docker 

最新版 Boot2Docker 下载地址:https://github.com/boot2docker/windows-installer/releases/latest

目前最新版为v1.8.0, 下载地址为:https://github.com/boot2docker/windows-installer/releases/download/v1.8.0/docker-install.exe

2、运行安装文件

运行安装文件,它将会安装 virtualbox、MSYS-git boot2docker Linux 镜像和 Boot2Docker 的管理工具。

接着连续点击"Next",进到如下界面

点击"Install"开始安装。

安装完成。

从桌面上或者 Program Files 中运行 Boot2Docker Start。

Boot2Docker Start 将启动一个 Unix shell 来配置和管理运行在虚拟主机中的 Docker,我们可以通过运行 docker version 来查看它是否正常工作。


运行 Docker

使用boot2docker.exe ssh 连接到虚拟主机上,然后执行docker run hello-world

到此,docker在Windows系统的安装完成。

使用 Homebrew 安装

macOS 我们可以使用 Homebrew 来安装 Docker。

Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:

$ brew install --cask --appdir=/Applications docker==> Creating Caskroom at /usr/local/Caskroom==> We'll set permissions properly so we won't need sudo in the futurePassword:          # 输入 macOS 密码==> Satisfying dependencies==> Downloading https://download.docker.com/mac/stable/21090/Docker.dmg######################################################################## 100.0%==> Verifying checksum for Cask docker==> Installing Cask docker==> Moving App 'Docker.app' to '/Applications/Docker.app'.&#x1f37a;  docker was successfully installed!

在载入 Docker app 后,点击 Next,可能会询问你的 macOS 登陆密码,你输入即可。之后会弹出一个 Docker 运行的提示窗口,状态栏上也有有个小鲸鱼的图标( )。

手动下载安装

如果需要手动下载,请点击以下链接下载 Install Docker Desktop on Mac 。

如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。

从应用中找到 Docker 图标并点击运行。可能会询问 macOS 的登陆密码,输入即可。

点击顶部状态栏中的鲸鱼图标会弹出操作菜单。

第一次点击图标,可能会看到这个安装成功的界面,点击 "Got it!" 可以关闭这个窗口。

启动终端后,通过命令可以检查安装后的 Docker 版本。

$ docker --versionDocker version 17.09.1-ce, build 19e2cf6

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:​http://hub-mirror.c.163.com​。

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

之后我们可以通过 ​docker info​ 来查看是否配置成功。

$ docker info...Registry Mirrors: http://hub-mirror.c.163.comLive Restore Enabled: false


Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

输出Hello world

51coolma@51coolma:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world


各个参数解析:

  • docker: Docker 的二进制执行文件。

  • run:与前面的 docker 组合来运行一个容器。

  • ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  • /bin/echo "Hello world": 在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。


运行交互式的容器

我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力

51coolma@51coolma:~$ docker run -i -t ubuntu:15.10 /bin/bashroot@dc0050c79503:/#

各个参数解析:

  • -t:在新容器内指定一个伪终端或终端。

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10系统的容器

我们尝试在容器中运行命令 cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表


我们可以通过运行exit命令或者使用CTRL+D来退出容器。


启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

51coolma@51coolma:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63


在输出中,我们没有看到期望的"hello world",而是一串长字符

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看

51coolma@51coolma:~$ docker ps


CONTAINER ID:容器ID

NAMES:自动分配的容器名称

在容器内使用docker logs命令,查看容器内的标准输出

51coolma@51coolma:~$ docker logs 2b1b7a428627


51coolma@51coolma:~$ docker logs amazing_cori



停止容器

我们使用 docker stop 命令来停止容器:


通过docker ps查看,容器已经停止工作:

51coolma@51coolma:~$ docker ps


也可以用下面的命令来停止:

51coolma@51coolma:~$ docker stop amazing_cori

Docker 客户端

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

51coolma@51coolma:~# docker


可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:

51coolma@51coolma:~# docker stats --help



运行一个web应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

51coolma@51coolma:~# docker run -d -P training/webapp python app.py


参数说明:

  • -d:让容器在后台运行。

  • -P:将容器内部使用的网络端口映射到我们使用的主机上。


查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器

51coolma@51coolma:~$ docker ps


这里多了端口信息。

PORTS0.0.0.0:32769->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

这时我们可以通过浏览器访问WEB应用

我们也可以指定 -p 标识来绑定指定端口。

51coolma@51coolma:~$ docker run -d -p 5000:5000 training/webapp python app.py

docker ps查看正在运行的容器


容器内部的 5000 端口映射到我们本地主机的 5000 端口上。


网络端口的快捷方式

通过docker ps 命令可以查看到容器的端口映射,docker还提供了另一个快捷方式:docker port,使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。

上面我们创建的web应用容器ID为:7a38a1ad55c6 名字为:determined_swanson

我可以使用docker port 7a38a1ad55c6 或docker port determined_swanson来查看容器端口的映射情况

51coolma@51coolma:~$ docker port 7a38a1ad55c65000/tcp -> 0.0.0.0:5000
51coolma@51coolma:~$ docker port determined_swanson5000/tcp -> 0.0.0.0:5000

查看WEB应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

51coolma@51coolma:~$ docker logs -f 7a38a1ad55c6 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -

-f:dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。


查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

51coolma@51coolma:~$ docker top determined_swanson



检查WEB应用程序

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

51coolma@51coolma:~$ docker inspect determined_swanson[    {        "Id": "7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361",        "Created": "2016-05-09T16:20:45.427996598Z",        "Path": "python",        "Args": [            "app.py"        ],        "State": {            "Status": "running",......

停止WEB应用容器

51coolma@51coolma:~$ docker stop determined_swanson   determined_swanson

重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。

51coolma@51coolma:~$ docker start determined_swansondetermined_swanson

docker ps -l 来查看正在运行的容器


正在运行的容器,我们可以使用 docker restart 命令来重启


移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

51coolma@51coolma:~$ docker rm determined_swanson  determined_swanson

删除容器时,容器必须是停止状态,否则会报如下错误

51coolma@51coolma:~$ docker rm determined_swansonError response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f

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

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。

51coolma@51coolma:~$ docker images           REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEubuntu              14.04               90d5884b1ee0        5 days ago          188 MBphp                 5.6                 f40e9e0f10c8        9 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Btraining/webapp     latest              6fae60ef3446        11 months ago       348.8 MB

各个选项说明:

  • REPOSTITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSTITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

51coolma@51coolma:~$ docker run -t -i ubuntu:15.10 /bin/bash root@d77ccb2e5cca:/#

如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下:

51coolma@51coolma:~$ docker run -t -i ubuntu:14.04 /bin/bash root@39e968165990:/# 

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。


获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

C51coolma@51coolma:~$ docker pull ubuntu:13.1013.10: Pulling from library/ubuntu6599cadaf950: Pull complete 23eda618d451: Pull complete f0be3084efe9: Pull complete 52de432f084b: Pull complete a3ed95caeb02: Pull complete Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3Status: Downloaded newer image for ubuntu:13.10

下载完成后,我们可以直接使用这个镜像来运行容器。


查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

51coolma@51coolma:~$  docker search httpd


NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否docker官方发布


拖取镜像

我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

51coolma@51coolma:~$ docker pull httpdUsing default tag: latestlatest: Pulling from library/httpd8b87079b7a06: Pulling fs layer a3ed95caeb02: Download complete 0d62ec9c6a76: Download complete a329d50397b9: Download complete ea7c1f032b5c: Waiting be44112b72c7: Waiting

下载完成后,我们就可以使用这个镜像了。

51coolma@51coolma:~$ docker run httpd

创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像
  • 2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。
51coolma@51coolma:~$ docker run -t -i ubuntu:15.10 /bin/bashroot@e218edb10161:/# 
在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

51coolma@51coolma:~$ docker commit -m="has update" -a="youj" e218edb10161 51coolma/ubuntu:v2sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:

  • -m:提交的描述信息

  • -a:指定镜像作者

  • e218edb10161:容器ID

  • 51coolma/ubuntu:v2:指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 51coolma/ubuntu:v2

51coolma@51coolma:~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE51coolma/ubuntu       v2                  70bf1840fd7c        15 seconds ago      158.5 MBubuntu              14.04               90d5884b1ee0        5 days ago          188 MBphp                 5.6                 f40e9e0f10c8        9 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Btraining/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

使用我们的新镜像 51coolma/ubuntu 来启动一个容器

51coolma@51coolma:~$ docker run -t -i 51coolma/ubuntu:v2 /bin/bash                            root@1a9fbdeb5da3:/#

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

51coolma@51coolma:~$ cat Dockerfile FROM    centos:6.7MAINTAINER      Fisher "fisher@sudops.com"RUN     /bin/echo 'root:123456' |chpasswdRUN     useradd youjRUN     /bin/echo 'youj:123456' |chpasswdRUN     /bin/echo -e "LANG="en_US.UTF-8"" &gt; /etc/default/localEXPOSE  22EXPOSE  80CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

51coolma@51coolma:~$ docker build -t youj/centos:6.7 .Sending build context to Docker daemon 17.92 kBStep 1 : FROM centos:6.7 ---&gt; d95b5ca17cc3Step 2 : MAINTAINER Fisher "fisher@sudops.com" ---&gt; Using cache ---&gt; 0c92299c6f03Step 3 : RUN /bin/echo 'root:123456' |chpasswd ---&gt; Using cache ---&gt; 0397ce2fbd0aStep 4 : RUN useradd youj......

参数说明:

  • -t :指定要创建的目标镜像名

  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

51coolma@51coolma:~$ docker images REPOSITORY          TAG                 IMAGE ID            CREATED              SIZEyouj/centos       6.7                 860c279d2fec        About a minute ago   190.6 MB51coolma/ubuntu       v2                  70bf1840fd7c        17 hours ago         158.5 MBubuntu              14.04               90d5884b1ee0        6 days ago           188 MBphp                 5.6                 f40e9e0f10c8        10 days ago          444.8 MBnginx               latest              6f8d099c3adc        12 days ago          182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago          324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago          194.4 MBubuntu              15.10               4e3b13c8a266        5 weeks ago          136.3 MBhello-world         latest              690ed74de00f        6 months ago         960 Bcentos              6.7                 d95b5ca17cc3        6 months ago         190.6 MBtraining/webapp     latest              6fae60ef3446        12 months ago        348.8 MB

我们可以使用新的镜像来创建容器

51coolma@51coolma:~$ docker run -t -i youj/centos:6.7  /bin/bash[root@41c28d18b5fb /]# id youjuid=500(youj) gid=500(youj) groups=500(youj)

从上面看到新镜像已经包含我们创建的用户youj


设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

51coolma@51coolma:~$ docker tag 860c279d2fec youj/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

51coolma@51coolma:~$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEyouj/centos       6.7                 860c279d2fec        5 hours ago         190.6 MByouj/centos       dev                 860c279d2fec        5 hours ago         190.6 MB51coolma/ubuntu       v2                  70bf1840fd7c        22 hours ago        158.5 MBubuntu              14.04               90d5884b1ee0        6 days ago          188 MBphp                 5.6                 f40e9e0f10c8        10 days ago         444.8 MBnginx               latest              6f8d099c3adc        13 days ago         182.7 MBmysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MBhttpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MBubuntu              15.10               4e3b13c8a266        5 weeks ago         136.3 MBhello-world         latest              690ed74de00f        6 months ago        960 Bcentos              6.7                 d95b5ca17cc3        6 months ago        190.6 MBtraining/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。

下面我们来实现通过端口连接到一个 docker 容器。


网络端口映射

我们创建了一个 python 应用的容器。

51coolma@51coolma:~$ docker run -d -P training/webapp python app.pyfce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

我们使用 -P 参数创建一个容器,使用 docker ps 来看到端口5000绑定主机端口32768。

51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMESfce072cc88ce        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
51coolma@51coolma:~$ docker run -d -p 5000:5000 training/webapp python app.py33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                     NAMES33e4523d30aa        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp    berserk_bartikfce072cc88ce        training/webapp     "python app.py"     8 minutes ago        Up 8 minutes        0.0.0.0:32768->5000/tcp   grave_hopper

另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。

51coolma@51coolma:~$ docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                NAMES95c6ceef88ca        training/webapp     "python app.py"     6 seconds ago       Up 6 seconds        5000/tcp, 127.0.0.1:5001->5002/tcp   adoring_stonebraker33e4523d30aa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:5000->5000/tcp               berserk_bartikfce072cc88ce        training/webapp     "python app.py"     10 minutes ago      Up 10 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

这样我们就可以通过访问127.0.0.1:5001来访问容器的5002端口。

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UD 端口,可以在端口后面加上 /udp

51coolma@51coolma:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a51coolma@51coolma:~$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                NAMES6779686f06f6        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya95c6ceef88ca        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        5000/tcp, 127.0.0.1:5001->5002/tcp   adoring_stonebraker33e4523d30aa        training/webapp     "python app.py"     5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp               berserk_bartikfce072cc88ce        training/webapp     "python app.py"     12 minutes ago      Up 12 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

docker port 命令可以让我们快捷地查看端口的绑定情况。

51coolma@51coolma:~$ docker port adoring_stonebraker 5002127.0.0.1:5001

Docker容器连接

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。


容器命名

当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:

51coolma@51coolma:~$  docker run -d -P --name youj training/webapp python app.py43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 命令来查看容器名称。

51coolma@51coolma:~$ docker ps -lCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES43780a6eabaa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:32769->5000/tcp   youj

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录nginx,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf

www目录将映射为nginx容器配置的虚拟目录

logs目录将映射为nginx容器的日志目录

conf目录里的配置文件将映射为nginx容器的配置文件

进入创建的nginx目录,创建Dockerfile

FROM debian:jessieMAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"ENV NGINX_VERSION 1.10.1-1~jessieRUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62         && echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list         && apt-get update         && apt-get install --no-install-recommends --no-install-suggests -y                                                 ca-certificates                                                 nginx=${NGINX_VERSION}                                                 nginx-module-xslt                                                 nginx-module-geoip                                                 nginx-module-image-filter                                                 nginx-module-perl                                                 nginx-module-njs                                                 gettext-base         && rm -rf /var/lib/apt/lists/*# forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.log         && ln -sf /dev/stderr /var/log/nginx/error.logEXPOSE 80 443CMD ["nginx", "-g", "daemon off;"]

通过Dockerfile创建一个镜像,替换成你自己的名字

docker build -t nginx .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/nginx$ docker images nginxREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEnginx               latest              555bbd91e13c        3 days ago          182.8 MB

方法二、docker pull nginx

查找Docker Hub上的nginx镜像

51coolma@51coolma:~/nginx$ docker search nginxNAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDnginx                     Official build of Nginx.                        3260      [OK]       jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...   674                  [OK]richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   207                  [OK]million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   67                   [OK]maxexcloo/nginx-php       Docker framework container with Nginx and ...   57                   [OK]webdevops/php-nginx       Nginx with PHP-FPM                              39                   [OK]h3nrik/nginx-ldap         NGINX web server with LDAP/AD, SSL and pro...   27                   [OK]bitnami/nginx             Bitnami nginx Docker Image                      19                   [OK]maxexcloo/nginx           Docker framework container with Nginx inst...   7                    [OK]...

这里我们拉取官方的镜像

51coolma@51coolma:~/nginx$ docker pull nginx

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为nginx的镜像。


使用nginx镜像

运行容器

51coolma@51coolma:~/nginx$ docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx  45c89fab0bf9ad643bc7ab571f3ccd65379b844498f54a7c8a4e7ca1dc3a2c1e51coolma@51coolma:~/nginx$

命令说明:

  • -p 80:80:将容器的80端口映射到主机的80端口

  • --name mynginx:将容器命名为mynginx

  • -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www

  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf

  • -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs

查看容器启动情况

51coolma@51coolma:~/nginx$ docker psCONTAINER ID        IMAGE        COMMAND                      PORTS                         NAMES45c89fab0bf9        nginx        "nginx -g 'daemon off"  ...  0.0.0.0:80->80/tcp, 443/tcp   mynginxf2fa96138d71        tomcat       "catalina.sh run"       ...  0.0.0.0:81->8080/tcp          tomcat

通过浏览器访问

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录php-fpm,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/php-fpm/logs ~/php-fpm/conf

logs目录将映射为php-fpm容器的日志目录

conf目录里的配置文件将映射为php-fpm容器的配置文件

进入创建的php-fpm目录,创建Dockerfile

FROM debian:jessie# persistent / runtime depsENV PHPIZE_DEPS 		autoconf 		file 		g++ 		gcc 		libc-dev 		make 		pkg-config 		re2cRUN apt-get update && apt-get install -y 		$PHPIZE_DEPS 		ca-certificates 		curl 		libedit2 		libsqlite3-0 		libxml2 	--no-install-recommends && rm -r /var/lib/apt/lists/*ENV PHP_INI_DIR /usr/local/etc/phpRUN mkdir -p $PHP_INI_DIR/conf.d##<autogenerated>##ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data##</autogenerated>##ENV GPG_KEYS 0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3ENV PHP_VERSION 5.6.22ENV PHP_FILENAME php-5.6.22.tar.xzENV PHP_SHA256 c96980d7de1d66c821a4ee5809df0076f925b2fe0b8c362d234d92f2f0a178e2RUN set -xe 	&& buildDeps=" 		$PHP_EXTRA_BUILD_DEPS 		libcurl4-openssl-dev 		libedit-dev 		libsqlite3-dev 		libssl-dev 		libxml2-dev 		xz-utils 	" 	&& apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* 	&& curl -fSL "http://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME" 	&& echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - 	&& curl -fSL "http://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& for key in $GPG_KEYS; do 		gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; 	done 	&& gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" 	&& rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" 	&& mkdir -p /usr/src/php 	&& tar -xf "$PHP_FILENAME" -C /usr/src/php --strip-components=1 	&& rm "$PHP_FILENAME" 	&& cd /usr/src/php 	&& ./configure 		--with-config-file-path="$PHP_INI_DIR" 		--with-config-file-scan-dir="$PHP_INI_DIR/conf.d" 		$PHP_EXTRA_CONFIGURE_ARGS 		--disable-cgi # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)		--enable-mysqlnd # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)		--enable-mbstring 		--with-curl 		--with-libedit 		--with-openssl 		--with-zlib 	&& make -j"$(nproc)" 	&& make install 	&& { find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; } 	&& make clean 	&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -o APT::AutoRemove::SuggestsImportant=false $buildDepsCOPY docker-php-ext-* /usr/local/bin/##<autogenerated>##WORKDIR /var/www/htmlRUN set -ex 	&& cd /usr/local/etc 	&& if [ -d php-fpm.d ]; then 		# for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"		sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; 		cp php-fpm.d/www.conf.default php-fpm.d/www.conf; 	else 		# PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency		mkdir php-fpm.d; 		cp php-fpm.conf.default php-fpm.d/www.conf; 		{ 			echo '[global]'; 			echo 'include=etc/php-fpm.d/*.conf'; 		} | tee php-fpm.conf; 	fi 	&& { 		echo '[global]'; 		echo 'error_log = /proc/self/fd/2'; 		echo; 		echo '[www]'; 		echo '; if we send this to /proc/self/fd/1, it never appears'; 		echo 'access.log = /proc/self/fd/2'; 		echo; 		echo 'clear_env = no'; 		echo; 		echo '; Ensure worker stdout and stderr are sent to the main error log.'; 		echo 'catch_workers_output = yes'; 	} | tee php-fpm.d/docker.conf 	&& { 		echo '[global]'; 		echo 'daemonize = no'; 		echo; 		echo '[www]'; 		echo 'listen = [::]:9000'; 	} | tee php-fpm.d/zz-docker.confEXPOSE 9000CMD ["php-fpm"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/php-fpm$ docker build -t php:5.6-fpm .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/php-fpm$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEphp                 5.6-fpm             025041cd3aa5        6 days ago          456.3 MB

方法二、docker pull php

查找Docker Hub上的php镜像

51coolma@51coolma:~/php-fpm$ docker search phpNAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDphp                       While designed for web development, the PH...   1232      [OK]       richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   207                  [OK]phpmyadmin/phpmyadmin     A web interface for MySQL and MariaDB.          123                  [OK]eboraas/apache-php        PHP5 on Apache (with SSL support), built o...   69                   [OK]php-zendserver            Zend Server - the integrated PHP applicati...   69        [OK]       million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   67                   [OK]webdevops/php-nginx       Nginx with PHP-FPM                              39                   [OK]webdevops/php-apache      Apache with PHP-FPM (based on webdevops/php)    14                   [OK]phpunit/phpunit           PHPUnit is a programmer-oriented testing f...   14                   [OK]tetraweb/php              PHP 5.3, 5.4, 5.5, 5.6, 7.0 for CI and run...   12                   [OK]webdevops/php             PHP (FPM and CLI) service container             10                   [OK]...

这里我们拉取官方的镜像,标签为5.6-fpm

51coolma@51coolma:~/php-fpm$ docker pull php:5.6-fpm

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为php,标签为5.6-fpm的镜像。


使用php-fpm镜像

运行容器

51coolma@51coolma:~/php-fpm$ docker run -p 9000:9000 --name  myphp-fpm -v ~/nginx/www:/www -v $PWD/conf:/usr/local/etc/php -v $PWD/logs:/phplogs   -d php:5.6-fpm00c5aa4c2f93ec3486936f45b5f2b450187a9d09acb18f5ac9aa7a5f405dbedf51coolma@51coolma:~/php-fpm$ 

命令说明:

  • -p 9000:9000 :将容器的9000端口映射到主机的9000端口

  • --name myphp-fpm :将容器命名为myphp-fpm

  • -v ~/nginx/www:/www :将主机中项目的目录www挂载到容器的/www

  • -v $PWD/conf:/usr/local/etc/php :将主机中当前目录下的conf目录挂载到容器的/usr/local/etc/php

  • -v $PWD/logs:/phplogs :将主机中当前目录下的logs目录挂载到容器的/phplogs

查看容器启动情况

51coolma@51coolma:~/php-fpm$ docker psCONTAINER ID    IMAGE         COMMAND      ...    PORTS                    NAMES00c5aa4c2f93    php:5.6-fpm   "php-fpm"    ...    0.0.0.0:9000->9000/tcp   myphp-fpm
通过浏览器访问phpinfo()

PS:此处是通过nginx+php实现web服务,nginx配置文件的fastcgi_pass应该配置为myphp-fpm容器的IP。

fastcgi_pass  172.17.0.4:9000;

容器IP的查方法

docker inspect 容器ID或容器名 |grep '"IPAddress"'

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录mysql,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf

data目录将映射为mysql容器配置的数据文件存放路径

logs目录将映射为mysql容器的日志目录

conf目录里的配置文件将映射为mysql容器的配置文件

进入创建的mysql目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mysql && useradd -r -g mysql mysql# add gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x 	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* 	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" 	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu 	&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc 	&& chmod +x /usr/local/bin/gosu 	&& gosu nobody true 	&& apt-get purge -y --auto-remove ca-certificates wgetRUN mkdir /docker-entrypoint-initdb.d# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:# File::Basename# File::Copy# Sys::Hostname# Data::DumperRUN apt-get update && apt-get install -y perl pwgen --no-install-recommends && rm -rf /var/lib/apt/lists/*# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" importedRUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5ENV MYSQL_MAJOR 5.6ENV MYSQL_VERSION 5.6.31-1debian8RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)# also, we set debconf keys to make APT a little quieterRUN { 		echo mysql-community-server mysql-community-server/data-dir select ''; 		echo mysql-community-server mysql-community-server/root-pass password ''; 		echo mysql-community-server mysql-community-server/re-root-pass password ''; 		echo mysql-community-server mysql-community-server/remove-test-db select false; 	} | debconf-set-selections 	&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* 	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld 	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime	&& chmod 777 /var/run/mysqld# comment out a few problematic configuration values# don't reverse lookup hostnames, they are usually another containerRUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf 	&& echo 'skip-host-cache
skip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf 	&& mv /tmp/my.cnf /etc/mysql/my.cnfVOLUME /var/lib/mysqlCOPY docker-entrypoint.sh /usr/local/bin/RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compatENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306CMD ["mysqld"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/mysql$ docker build -t mysql .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/mysql$ docker images |grep mysqlmysql               5.6                 2c0964ec182a        3 weeks ago         329 MB

方法二、docker pull mysql

查找Docker Hub上的mysql镜像

51coolma@51coolma:/mysql$ docker search mysqlNAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDmysql                    MySQL is a widely used, open-source relati...   2529      [OK]       mysql/mysql-server       Optimized MySQL Server Docker images. Crea...   161                  [OK]centurylink/mysql        Image containing mysql. Optimized to be li...   45                   [OK]sameersbn/mysql                                                          36                   [OK]google/mysql             MySQL server for Google Compute Engine          16                   [OK]appcontainers/mysql      Centos/Debian Based Customizable MySQL Con...   8                    [OK]marvambass/mysql         MySQL Server based on Ubuntu 14.04              6                    [OK]drupaldocker/mysql       MySQL for Drupal                                2                    [OK]azukiapp/mysql           Docker image to run MySQL by Azuki - http:...   2                    [OK]...

这里我们拉取官方的镜像,标签为5.6

51coolma@51coolma:~/mysql$ docker pull mysql:5.6

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.6的镜像。


使用mysql镜像

运行容器

51coolma@51coolma:~/mysql$ docker run -p 3306:3306 --name mymysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.621cb89213c93d805c5bacf1028a0da7b5c5852761ba81327e6b99bb3ea89930e51coolma@51coolma:~/mysql$ 

命令说明:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口

  • -v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf

  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs

  • -v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data

  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

查看容器启动情况

51coolma@51coolma:~/mysql$ docker ps CONTAINER ID    IMAGE         COMMAND                  ...  PORTS                    NAMES21cb89213c93    mysql:5.6    "docker-entrypoint.sh"    ...  0.0.0.0:3306->3306/tcp   mymysql

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录tomcat,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/tomcat/webapps ~/tomcat/logs ~/tomcat/conf

webapps目录将映射为tomcat容器配置的应用程序目录

logs目录将映射为tomcat容器的日志目录

conf目录里的配置文件将映射为tomcat容器的配置文件

进入创建的tomcat目录,创建Dockerfile

FROM java:8-jreENV CATALINA_HOME /usr/local/tomcatENV PATH $CATALINA_HOME/bin:$PATHRUN mkdir -p "$CATALINA_HOME"WORKDIR $CATALINA_HOME# runtime dependencies for Tomcat Native Libraries# Tomcat Native 1.2+ requires a newer version of OpenSSL than debian:jessie has available (1.0.2g+)# see http://tomcat.10.x6.nabble.com/VOTE-Release-Apache-Tomcat-8-0-32-tp5046007p5046024.html (and following discussion)ENV OPENSSL_VERSION 1.0.2h-1RUN {                 echo 'deb http://httpredir.debian.org/debian unstable main';         } > /etc/apt/sources.list.d/unstable.list         && { # add a negative "Pin-Priority" so that we never ever get packages from unstable unless we explicitly request them                echo 'Package: *';                 echo 'Pin: release a=unstable';                 echo 'Pin-Priority: -10';                 echo; # except OpenSSL, which is the reason we're here                echo 'Package: openssl libssl*';                 echo "Pin: version $OPENSSL_VERSION";                 echo 'Pin-Priority: 990';         } > /etc/apt/preferences.d/unstable-opensslRUN apt-get update && apt-get install -y --no-install-recommends                 libapr1                 openssl="$OPENSSL_VERSION"         && rm -rf /var/lib/apt/lists/*# see https://www.apache.org/dist/tomcat/tomcat-8/KEYSRUN set -ex         && for key in                 05AB33110949707C93A279E3D3EFE6B686867BA6                 07E48665A34DCAFAE522E5E6266191C37C037D42                 47309207D818FFD8DCD3F83F1931D684307A10A5                 541FBE7D8F78B25E055DDEE13C370389288584E7                 61B832AC2F1C5A90F0F9B00A1C506407564C17A3                 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED                 9BA44C2621385CB966EBA586F72C284D731FABEE                 A27677289986DB50844682F8ACB77FC2E86E29AC                 A9C5DF4D22E99998D9875A5110C01C5A2F6059E7                 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243                 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE                 F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23         ; do                 gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key";         doneENV TOMCAT_MAJOR 8ENV TOMCAT_VERSION 8.0.35ENV TOMCAT_TGZ_URL https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gzRUN set -x                 && curl -fSL "$TOMCAT_TGZ_URL" -o tomcat.tar.gz         && curl -fSL "$TOMCAT_TGZ_URL.asc" -o tomcat.tar.gz.asc         && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz         && tar -xvf tomcat.tar.gz --strip-components=1         && rm bin/*.bat         && rm tomcat.tar.gz*                 && nativeBuildDir="$(mktemp -d)"         && tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1         && nativeBuildDeps="                 gcc                 libapr1-dev                 libssl-dev                 make                 openjdk-${JAVA_VERSION%%[-~bu]*}-jdk=$JAVA_DEBIAN_VERSION         "         && apt-get update && apt-get install -y --no-install-recommends $nativeBuildDeps && rm -rf /var/lib/apt/lists/*         && (                 export CATALINA_HOME="$PWD"                 && cd "$nativeBuildDir/native"                 && ./configure                         --libdir=/usr/lib/jni                         --prefix="$CATALINA_HOME"                         --with-apr=/usr/bin/apr-1-config                         --with-java-home="$(docker-java-home)"                         --with-ssl=yes                 && make -j$(nproc)                 && make install         )         && apt-get purge -y --auto-remove $nativeBuildDeps         && rm -rf "$nativeBuildDir"         && rm bin/tomcat-native.tar.gz# verify Tomcat Native is working properlyRUN set -e         && nativeLines="$(catalina.sh configtest 2>&1)"         && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"         && nativeLines="$(echo "$nativeLines" | sort -u)"         && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then                 echo >&2 "$nativeLines";                 exit 1;         fiEXPOSE 8080CMD ["catalina.sh", "run"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/tomcat$ docker build -t tomcat .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/tomcat$ docker images|grep tomcattomcat              latest              70f819d3d2d9        7 days ago          335.8 MB

方法二、docker pull tomcat

查找Docker Hub上的tomcat镜像

51coolma@51coolma:~/tomcat$ docker search tomcatNAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDtomcat                     Apache Tomcat is an open source implementa...   744       [OK]       dordoka/tomcat             Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   19                   [OK]consol/tomcat-7.0          Tomcat 7.0.57, 8080, "admin/admin"              16                   [OK]consol/tomcat-8.0          Tomcat 8.0.15, 8080, "admin/admin"              14                   [OK]cloudesire/tomcat          Tomcat server, 6/7/8                            8                    [OK]davidcaste/alpine-tomcat   Apache Tomcat 7/8 using Oracle Java 7/8 wi...   6                    [OK]andreptb/tomcat            Debian Jessie based image with Apache Tomc...   4                    [OK]kieker/tomcat                                                              2                    [OK]fbrx/tomcat                Minimal Tomcat image based on Alpine Linux      2                    [OK]jtech/tomcat               Latest Tomcat production distribution on l...   1                    [OK]

这里我们拉取官方的镜像

51coolma@51coolma:~/tomcat$ docker pull tomcat

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为tomcat的镜像。


使用tomcat镜像

运行容器

51coolma@51coolma:~/tomcat$ docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat  acb33fcb4beb8d7f1ebace6f50f5fc204b1dbe9d524881267aa715c61cf7532051coolma@51coolma:~/tomcat$

命令说明:

-p 8080:8080:将容器的8080端口映射到主机的8080端口

-v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test

查看容器启动情况

51coolma@51coolma:~/tomcat$ docker ps CONTAINER ID    IMAGE     COMMAND               ... PORTS                    NAMESacb33fcb4beb    tomcat    "catalina.sh run"     ... 0.0.0.0:8080->8080/tcp   tomcat

通过浏览器访问

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录python,用于存放后面的相关东西。

51coolma@51coolma:~$ mdkir -p ~/python ~/python/myapp

myapp目录将映射为python容器配置的应用目录

进入创建的python目录,创建Dockerfile

FROM buildpack-deps:jessie# remove several traces of debian pythonRUN apt-get purge -y python.*# http://bugs.python.org/issue19846# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.ENV LANG C.UTF-8# gpg: key F73C700D: public key "Larry Hastings <larry@hastings.org>" importedENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700DENV PYTHON_VERSION 3.5.1# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'"ENV PYTHON_PIP_VERSION 8.1.2RUN set -ex         && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz         && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc         && export GNUPGHOME="$(mktemp -d)"         && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY"         && gpg --batch --verify python.tar.xz.asc python.tar.xz         && rm -r "$GNUPGHOME" python.tar.xz.asc         && mkdir -p /usr/src/python         && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz         && rm python.tar.xz                 && cd /usr/src/python         && ./configure --enable-shared --enable-unicode=ucs4         && make -j$(nproc)         && make install         && ldconfig         && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION         && find /usr/local -depth                 (                     ( -type d -a -name test -o -name tests )                     -o                     ( -type f -a -name '*.pyc' -o -name '*.pyo' )                 ) -exec rm -rf '{}' +         && rm -rf /usr/src/python ~/.cache# make some useful symlinks that are expected to existRUN cd /usr/local/bin         && ln -s easy_install-3.5 easy_install         && ln -s idle3 idle         && ln -s pydoc3 pydoc         && ln -s python3 python         && ln -s python3-config python-configCMD ["python3"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/python$ docker build -t python:3.5 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/python$ docker images python:3.5 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEpython              3.5              045767ddf24a        9 days ago          684.1 MB

方法二、docker pull python:3.5

查找Docker Hub上的python镜像

51coolma@51coolma:~/python$ docker search pythonNAME                           DESCRIPTION                        STARS     OFFICIAL   AUTOMATEDpython                         Python is an interpreted,...       982       [OK]       kaggle/python                  Docker image for Python...         33                   [OK]azukiapp/python                Docker image to run Python ...     3                    [OK]vimagick/python                mini python                                  2          [OK]tsuru/python                   Image for the Python ...           2                    [OK]pandada8/alpine-python         An alpine based python image                 1          [OK]1science/python                Python Docker images based on ...  1                    [OK]lucidfrontier45/python-uwsgi   Python with uWSGI                  1                    [OK]orbweb/python                  Python image                       1                    [OK]pathwar/python                 Python template for Pathwar levels 1                    [OK]rounds/10m-python              Python, setuptools and pip.        0                    [OK]ruimashita/python              ubuntu 14.04 python                0                    [OK]tnanba/python                  Python on CentOS-7 image.          0                    [OK]

这里我们拉取官方的镜像,标签为3.5

51coolma@51coolma:~/python$ docker pull python:3.5

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像。


使用python镜像

在~/python/myapp目录下创建一个 helloworld.py 文件,代码如下:

#!/usr/bin/pythonprint("Hello, World!");

运行容器

51coolma@51coolma:~/python$ docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py

命令说明:

-v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp

-w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录

python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件

输出结果:

Hello, World!


方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录redis,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/redis ~/redis/data

data目录将映射为redis容器配置的/data目录,作为redis数据持久化的存储目录

进入创建的redis目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r redis && useradd -r -g redis redisRUN apt-get update && apt-get install -y --no-install-recommends                 ca-certificates                 wget         && rm -rf /var/lib/apt/lists/*# grab gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x         && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)"         && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc"         && export GNUPGHOME="$(mktemp -d)"         && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4         && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu         && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc         && chmod +x /usr/local/bin/gosu         && gosu nobody trueENV REDIS_VERSION 3.2.0ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.0.tar.gzENV REDIS_DOWNLOAD_SHA1 0c1820931094369c8cc19fc1be62f598bc5961ca# for redis-sentinel see: http://redis.io/topics/sentinelRUN buildDeps='gcc libc6-dev make'         && set -x         && apt-get update && apt-get install -y $buildDeps --no-install-recommends         && rm -rf /var/lib/apt/lists/*         && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL"         && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c -         && mkdir -p /usr/src/redis         && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1         && rm redis.tar.gz         && make -C /usr/src/redis         && make -C /usr/src/redis install         && rm -r /usr/src/redis         && apt-get purge -y --auto-remove $buildDepsRUN mkdir /data && chown redis:redis /dataVOLUME /dataWORKDIR /dataCOPY docker-entrypoint.sh /usr/local/bin/ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 6379CMD [ "redis-server" ]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/redis$ docker build  -t redis:3.2 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/redis$ docker images redis REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEredis               3.2                 43c923d57784        2 weeks ago         193.9 MB

方法二、docker pull redis:3.2

查找Docker Hub上的redis镜像

51coolma@51coolma:~/redis$ docker search  redisNAME                      DESCRIPTION                   STARS  OFFICIAL  AUTOMATEDredis                     Redis is an open source ...   2321   [OK]       sameersbn/redis                                         32                   [OK]torusware/speedus-redis   Always updated official ...   29		     [OK]bitnami/redis             Bitnami Redis Docker Image    22                   [OK]anapsix/redis             11MB Redis server image ...   6                    [OK]webhippie/redis           Docker images for redis       4                    [OK]clue/redis-benchmark      A minimal docker image t...   3                    [OK]williamyeh/redis          Redis image for Docker        3                    [OK]unblibraries/redis        Leverages phusion/baseim...   2                    [OK]greytip/redis             redis 3.0.3                   1                    [OK]servivum/redis            Redis Docker Image            1                    [OK]...

这里我们拉取官方的镜像,标签为3.2

51coolma@51coolma:~/redis$ docker pull  redis:3.2

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为redis,标签为3.2的镜像。


使用redis镜像

运行容器

51coolma@51coolma:~/redis$ docker run -p 6379:6379 -v $PWD/data:/data  -d redis:3.2 redis-server --appendonly yes43f7a65ec7f8bd64eb1c5d82bc4fb60e5eb31915979c4e7821759aac3b62f33051coolma@51coolma:~/redis$

命令说明:

-p 6379:6379 :将容器的6379端口映射到主机的6379端口

-v $PWD/data:/data :将主机中当前目录下的data挂载到容器的/data

redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置

查看容器启动情况

51coolma@51coolma:~/redis$ docker psCONTAINER ID   IMAGE        COMMAND                 ...   PORTS                      NAMES43f7a65ec7f8   redis:3.2    "docker-entrypoint.sh"  ...   0.0.0.0:6379->6379/tcp     agitated_cray

连接、查看容器

使用redis镜像执行redis-cli命令连接到刚启动的容器,主机IP为172.17.0.1

51coolma@51coolma:~/redis$ docker run -it redis:3.2 redis-cli -h 172.17.0.1172.17.0.1:6379> info# Serverredis_version:3.2.0redis_git_sha1:00000000redis_git_dirty:0redis_build_id:f449541256e7d446redis_mode:standaloneos:Linux 4.2.0-16-generic x86_64arch_bits:64multiplexing_api:epoll...

方法一、通过 Dockerfile 构建

创建Dockerfile

首先,创建目录mongo,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p ~/mongo  ~/mongo/db

db目录将映射为mongo容器配置的/data/db目录,作为mongo数据的存储目录

进入创建的mongo目录,创建Dockerfile

FROM debian:wheezy# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mongodb && useradd -r -g mongodb mongodbRUN apt-get update 	&& apt-get install -y --no-install-recommends 		numactl 	&& rm -rf /var/lib/apt/lists/*# grab gosu for easy step-down from rootENV GOSU_VERSION 1.7RUN set -x 	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* 	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" 	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" 	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu 	&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc 	&& chmod +x /usr/local/bin/gosu 	&& gosu nobody true 	&& apt-get purge -y --auto-remove ca-certificates wget# gpg: key 7F0CEB10: public key "Richard Kreuter <richard@10gen.com>" importedRUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 492EAFE8CD016A07919F1D2B9ECBEC467F0CEB10ENV MONGO_MAJOR 3.0ENV MONGO_VERSION 3.0.12RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.listRUN set -x 	&& apt-get update 	&& apt-get install -y 		mongodb-org=$MONGO_VERSION 		mongodb-org-server=$MONGO_VERSION 		mongodb-org-shell=$MONGO_VERSION 		mongodb-org-mongos=$MONGO_VERSION 		mongodb-org-tools=$MONGO_VERSION 	&& rm -rf /var/lib/apt/lists/* 	&& rm -rf /var/lib/mongodb 	&& mv /etc/mongod.conf /etc/mongod.conf.origRUN mkdir -p /data/db /data/configdb 	&& chown -R mongodb:mongodb /data/db /data/configdbVOLUME /data/db /data/configdbCOPY docker-entrypoint.sh /entrypoint.shENTRYPOINT ["/entrypoint.sh"]EXPOSE 27017CMD ["mongod"]

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/mongo$ docker build -t mongo:3.2 .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/mongo$ docker images  mongo:3.2REPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmongo               3.2                 282fd552add6        9 days ago          336.1 MB

方法二、docker pull mongo:3.2

查找Docker Hub上的mongo镜像

51coolma@51coolma:~/mongo$ docker search mongoNAME                              DESCRIPTION                      STARS     OFFICIAL   AUTOMATEDmongo                             MongoDB document databases ...   1989      [OK]       mongo-express                     Web-based MongoDB admin int...   22        [OK]       mvertes/alpine-mongo              light MongoDB container          19                   [OK]mongooseim/mongooseim-docker      MongooseIM server the lates...   9                    [OK]torusware/speedus-mongo           Always updated official Mon...   9                    [OK]jacksoncage/mongo                 Instant MongoDB sharded cluster  6                    [OK]mongoclient/mongoclient           Official docker image for M...   4                    [OK]jadsonlourenco/mongo-rocks        Percona Mongodb with Rocksd...   4                    [OK]asteris/apache-php-mongo          Apache2.4 + PHP + Mongo + m...   2                    [OK]19hz/mongo-container              Mongodb replicaset for coreos    1                    [OK]nitra/mongo                       Mongo3 centos7                   1                    [OK]ackee/mongo                       MongoDB with fixed Bluemix p...  1                    [OK]kobotoolbox/mongo                 https://github.com/kobotoolb...  1                    [OK]valtlfelipe/mongo                 Docker Image based on the la...  1                    [OK]

这里我们拉取官方的镜像,标签为3.2

51coolma@51coolma:~/mongo$ docker pull mongo:3.2

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mongo,标签为3.2的镜像。


使用mongo镜像

运行容器

51coolma@51coolma:~/mongo$ docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2cda8830cad5fe35e9c4aed037bbd5434b69b19bf2075c8626911e6ebb08cad5151coolma@51coolma:~/mongo$

命令说明:

-p 27017:27017 :将容器的27017 端口映射到主机的27017 端口

-v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录

查看容器启动情况

51coolma@51coolma:~/mongo$ docker ps CONTAINER ID   IMAGE        COMMAND                   ...    PORTS                      NAMEScda8830cad5f   mongo:3.2    "/entrypoint.sh mongo"    ...    0.0.0.0:27017->27017/tcp   suspicious_goodall

使用mongo镜像执行mongo 命令连接到刚启动的容器,主机IP为172.17.0.1

51coolma@51coolma:~/mongo$ docker run -it mongo:3.2 mongo --host 172.17.0.1MongoDB shell version: 3.2.7connecting to: 172.17.0.1:27017/testWelcome to the MongoDB shell.For interactive help, type "help".For more comprehensive documentation, see  http://docs.mongodb.org/Questions? Try the support group  http://groups.google.com/group/mongodb-user>

方法一、通过 Dockerfile构建

创建Dockerfile

首先,创建目录apache,用于存放后面的相关东西。

51coolma@51coolma:~$ mkdir -p  ~/apache/www ~/apache/logs ~/apache/conf 

www目录将映射为apache容器配置的应用程序目录

logs目录将映射为apache容器的日志目录

conf目录里的配置文件将映射为apache容器的配置文件

进入创建的apache目录,创建Dockerfile

FROM debian:jessie# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added#RUN groupadd -r www-data && useradd -r --create-home -g www-data www-dataENV HTTPD_PREFIX /usr/local/apache2ENV PATH $PATH:$HTTPD_PREFIX/binRUN mkdir -p "$HTTPD_PREFIX" 	&& chown www-data:www-data "$HTTPD_PREFIX"WORKDIR $HTTPD_PREFIX# install httpd runtime dependencies# https://httpd.apache.org/docs/2.4/install.html#requirementsRUN apt-get update 	&& apt-get install -y --no-install-recommends 		libapr1 		libaprutil1 		libaprutil1-ldap 		libapr1-dev 		libaprutil1-dev 		libpcre++0 		libssl1.0.0 	&& rm -r /var/lib/apt/lists/*ENV HTTPD_VERSION 2.4.20ENV HTTPD_BZ2_URL https://www.apache.org/dist/httpd/httpd-$HTTPD_VERSION.tar.bz2RUN buildDeps=' 		ca-certificates 		curl 		bzip2 		gcc 		libpcre++-dev 		libssl-dev 		make 	' 	set -x 	&& apt-get update 	&& apt-get install -y --no-install-recommends $buildDeps 	&& rm -r /var/lib/apt/lists/* 		&& curl -fSL "$HTTPD_BZ2_URL" -o httpd.tar.bz2 	&& curl -fSL "$HTTPD_BZ2_URL.asc" -o httpd.tar.bz2.asc # see https://httpd.apache.org/download.cgi#verify	&& export GNUPGHOME="$(mktemp -d)" 	&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys A93D62ECC3C8EA12DB220EC934EA76E6791485A8 	&& gpg --batch --verify httpd.tar.bz2.asc httpd.tar.bz2 	&& rm -r "$GNUPGHOME" httpd.tar.bz2.asc 		&& mkdir -p src 	&& tar -xvf httpd.tar.bz2 -C src --strip-components=1 	&& rm httpd.tar.bz2 	&& cd src 		&& ./configure 		--prefix="$HTTPD_PREFIX" 		--enable-mods-shared=reallyall 	&& make -j"$(nproc)" 	&& make install 		&& cd .. 	&& rm -r src 		&& sed -ri 		-e 's!^(s*CustomLog)s+S+!1 /proc/self/fd/1!g' 		-e 's!^(s*ErrorLog)s+S+!1 /proc/self/fd/2!g' 		"$HTTPD_PREFIX/conf/httpd.conf" 		&& apt-get purge -y --auto-remove $buildDepsCOPY httpd-foreground /usr/local/bin/EXPOSE 80CMD ["httpd-foreground"]

Dockerfile文件中 COPY httpd-foreground /usr/local/bin/ 是将当前目录下的httpd-foreground拷贝到镜像里,作为httpd服务的启动脚本,所以我们要在本地创建一个脚本文件httpd-foreground

#!/bin/bashset -e# Apache gets grumpy about PID files pre-existingrm -f /usr/local/apache2/logs/httpd.pidexec httpd -DFOREGROUND

赋予httpd-foreground文件可执行权限

51coolma@51coolma:~/apache$ chmod +x httpd-foreground

通过Dockerfile创建一个镜像,替换成你自己的名字

51coolma@51coolma:~/apache$ docker build -t httpd .

创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像

51coolma@51coolma:~/apache$ docker images httpdREPOSITORY     TAG        IMAGE ID        CREATED           SIZEhttpd          latest     da1536b4ef14    23 seconds ago    195.1 MB

方法二、docker pull httpd

查找Docker Hub上的httpd镜像

51coolma@51coolma:~/apache$ docker search httpdNAME                           DESCRIPTION                  STARS  OFFICIAL AUTOMATEDhttpd                          The Apache HTTP Server ..    524     [OK]       centos/httpd                                                7                [OK]rgielen/httpd-image-php5       Docker image for Apache...   1                [OK]microwebapps/httpd-frontend    Httpd frontend allowing...   1                [OK]lolhens/httpd                  Apache httpd 2 Server        1                [OK]publici/httpd                  httpd:latest                 0                [OK]publicisworldwide/httpd        The Apache httpd webser...   0                [OK]rgielen/httpd-image-simple     Docker image for simple...   0                [OK]solsson/httpd                  Derivatives of the offi...   0                [OK]rgielen/httpd-image-drush      Apache HTTPD + Drupal S...   0                [OK]learninglayers/httpd                                        0                [OK]sohrabkhan/httpd               Docker httpd + php5.6 (...   0                [OK]aintohvri/docker-httpd         Apache HTTPD Docker ext...   0                [OK]alizarion/httpd                httpd on centos with mo...   0                [OK]...

这里我们拉取官方的镜像

51coolma@51coolma:~/apache$ docker pull httpd

等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为httpd的镜像。


使用apache镜像

运行容器

docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $PWD/logs/:/usr/local/apache2/logs/ -d httpd

命令说明:

-p 80:80 :将容器的80端口映射到主机的80端口

-v $PWD/www/:/usr/local/apache2/htdocs/ :将主机中当前目录下的www目录挂载到容器的/usr/local/apache2/htdocs/

-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf :将主机中当前目录下的conf/httpd.conf文件挂载到容器的/usr/local/apache2/conf/httpd.conf

-v $PWD/logs/:/usr/local/apache2/logs/ :将主机中当前目录下的logs目录挂载到容器的/usr/local/apache2/logs/

查看容器启动情况

51coolma@51coolma:~/apache$ docker psCONTAINER ID  IMAGE   COMMAND             ... PORTS               NAMES79a97f2aac37  httpd   "httpd-foreground"  ... 0.0.0.0:80->80/tcp  sharp_swanson

通过浏览器访问


docker run

# 运行一个容器docker run -it -p 8088:8088 -p 8089:8089 -p 8090:9090 -v /root/soft/docker:/root/soft/docker -v /root/soft/dockertt:/root/soft/dockertt loen/rc /bin/bash命令的格式:Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]-a, --attach=[] 登录容器(以docker run -d启动的容器)-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU-d, --detach=false 指定容器运行于前台还是后台--device=[] 添加主机设备给容器,相当于设备直通--dns=[] 指定容器的dns服务器--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件-e, --env=[] 指定环境变量,容器中可以使用该环境变量--entrypoint="" 覆盖image的入口点--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口-h, --hostname="" 指定容器的主机名-i, --interactive=false 打开STDIN,用于控制台交互--link=[] 指定容器间的关联,使用其他容器的IP、env等信息--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用-m, --memory="" 指定容器的内存上限--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字--net="bridge" 容器网络设置,待详述-P, --publish-all=false 指定容器暴露的端口,待详述-p, --publish=[] 指定容器暴露的端口,待详述--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities--restart="" 指定容器停止后的重启策略,待详述--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理-t, --tty=false 分配tty设备,该可以支持终端登录-u, --user="" 指定容器的用户-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录-w, --workdir="" 指定容器的工作目录>>>>>> 详细讲解端口暴露-P参数:docker自动映射暴露端口;docker run -d -P training/webapp <span style="color:#009900;">//docker自动在host上打开49000到49900的端口,映射到容器(由镜像指定,或者--expose参数指定)的暴露端口;</span>-p参数:指定端口或IP进行映射;docker run -d -p 5000:80 training/webapp <span style="color:#009900;">//host上5000号端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1:5000:80 training/webapp <span style="color:#009900;">//host上127.0.0.1:5000号端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1::5000 training/webapp <span style="color:#009900;">//host上127.0.0.1:随机端口,映射到容器暴露的80端口;</span>docker run -d -p 127.0.0.1:5000:5000/udp training/webapp <span style="color:#009900;">//绑定udp端口;</span>网络配置--net=bridge: <span style="color:#009900;">//使用docker daemon指定的网桥</span>--net=host: <span style="color:#009900;">//容器使用主机的网络</span>--net=container:NAME_or_ID:<span style="color:#009900;">//使用其他容器的网路,共享IP和PORT等网络资源</span>--net=none: <span style="color:#009900;">//容器使用自己的网络(类似--net=bridge),但是不进行配置</span>

docker stop

# 关闭运行中的容器docker stop 容器ID

docker start

# 启动一个已经停止的容器docker start 容器ID# 重启一个容器docker restart 容器ID

docker attach

# 进入一个运行中的容器docker attach 容器ID

docker ps

# 显示全部容器docker ps -a# 显示当前运行的容器docker ps

docker images

# 查看本地镜像docker images

docker rmi

# 删除所有镜像docker rmi $(docker images | grep -v RESPOSITORY | awk '{print $3}')

docker build

# 构建容器docker build -t 镜像名称 .     # 后面的. 指的是当前文件夹 (其实是Dockerfile存放的文件夹)# 建立映像文件。–rm 选项是告诉Docker,在构建完成后删除临时的Container,Dockerfile的每一行指令都会创建一个临时的Container,一般这些临时生成的Container是不需要的docker build --rm=true -t loen/lamp .

docker rm

# 删除容器docker rm 容器ID# 删除所有容器docker rm $(docker ps -a) 

docker history

# 查看历史docker history 镜像ID

docker export

# 导出容器docker export 容器ID > xxx.tar

docker save

# 把 mynewimage 镜像保存成 tar 文件docker save myimage | bzip2 -9 -c> /home/save.tar.bz2

docker load

# 加载 myimage 镜像bzip2 -d -c < /home/save.tar.bz2 | docker load


Docker官方英文资源

docker官网:http://www.docker.com

Docker windows入门:https://docs.docker.com/windows/

Docker Linux 入门:https://docs.docker.com/linux/

Docker mac 入门:https://docs.docker.com/mac/

Docker 用户指引:https://docs.docker.com/engine/userguide/

Docker 官方博客:http://blog.docker.com/

Docker Hub: https://hub.docker.com/

Docker开源: https://www.docker.com/open-source

Docker中文资源

Docker中文网站:http://www.docker.org.cn

Docker安装手册:http://www.docker.org.cn/book/install.html

一小时Docker教程 :https://blog.csphere.cn/archives/22

Docker 从入门到实践:http://dockerpool.com/static/books/docker_practice/index.html

Docker中文指南:http://www.widuu.com/chinese_docker/index.html

其它资源

https://segmentfault.com/t/docker

https://github.com/docker/docker

https://wiki.openstack.org/wiki/Docker

https://wiki.archlinux.org/index.php/Docker

如果有更好的资源,欢迎通过右下角的反馈按钮发邮件给我们……

这是Docker的快速参考备忘单您可以在此处找到最常用的 Docker 命令。

开始

入门

在后台创建和运行容器

$ docker run -d -p 80:80 docker/getting-started

  • -d - 在分离模式下运行容器
  • -p 80:80 - 将端口 80 映射到容器中的端口 80
  • docker/getting-started - 要使用的图像

在前台创建并运行容器

$ docker run -it -p 8001:8080 --name my-nginx nginx

  • -it - 交互式 bash 模式
  • -p 8001:8080 - 将端口 8001 映射到容器中的端口 8080
  • --name my-nginx - 指定名称
  • nginx - 要使用的图像

一般命令

命令描述
docker ps列出正在运行的容器
docker ps -a列出所有容器
docker ps -s列出正在运行的容器
(带 CPU/内存)
docker images列出所有图像
docker exec -it <container> bash连接到容器
docker logs <container>显示容器的控制台日志
docker stop <container>停止一个容器
docker restart <container>重启一个容器
docker rm <container>移除一个容器
docker port <container>显示容器的端口映射
docker top <container>列出进程
docker kill <container>杀死一个容器

参数<container>可以是容器 ID 或名称

Docker 容器

启动和停止

命令描述
docker start nginx-server开始
docker stop nginx-server停止
docker restart nginx-server重启
docker pause nginx-server暂停
docker unpause nginx-server取消暂停
docker wait nginx-server阻塞容器
docker kill nginx-server发送 SIGKILL
docker attach nginx-server连接到现有容器

信息

命令描述
docker ps列出正在运行的容器
docker ps -a列出所有容器
docker logs nginx-server容器日志
docker inspect nginx-server检查容器
docker events nginx-server容器事件
docker port nginx-server公共端口
docker top nginx-server运行进程
docker stats nginx-server容器资源使用
docker diff nginx-server列出对容器所做的更改。

创建

docker create [options] IMAGE  -a, --attach               # attach stdout/err  -i, --interactive          # attach stdin (interactive)  -t, --tty                  # pseudo-tty      --name NAME            # name your image  -p, --publish 5000:5000    # port map (host:container)      --expose 5432          # expose a port to containers  -P, --publish-all          # publish all ports      --link container:alias # linking  -v, --volume `pwd`:/app    # mount (absolute paths needed)  -e, --env NAME=hello       # env vars

例子

$ docker create --name my_redis --expose 6379 redis:3.0.2

操作

重命名容器

docker rename my-nginx nginx-server

移除容器

docker rm nginx-server

更新容器

docker update --cpu-shares 512 -m 300M nginx-server

Docker 镜像

操作

命令 描述 docker images列出图像 docker rmi nginx删除图像 docker load < ubuntu.tar.gz加载 tarred 存储库 docker load --input ubuntu.tar加载 tarred 存储库 docker save busybox > ubuntu.tar将图像保存到 tar 存档 docker history显示图像的历史 docker commit nginx将容器另存为图像。 docker tag nginx eon01/nginx标记图像 docker push eon01/nginx推送图片

构建图像

$ docker build .$ docker build github.com/creack/docker-firefox$ docker build - < Dockerfile$ docker build - < context.tar.gz$ docker build -t eon/nginx-server .$ docker build -f myOtherDockerfile .$ curl example.com/remote/Dockerfile | docker build -f - .

Docker 网络

操作

删除网络

docker network rm MyOverlayNetwork

列出网络

docker network ls

获取有关网络的信息

docker network inspect MyOverlayNetwork

将正在运行的容器连接到网络

docker network connect MyOverlayNetwork nginx

启动时将容器连接到网络

docker run -it -d --network=MyOverlayNetwork nginx

断开容器与网络的连接

docker network disconnect MyOverlayNetwork nginx

创建网络

docker network create -d overlay MyOverlayNetworkdocker network create -d bridge MyBridgeNetworkdocker network create -d overlay   --subnet=192.168.0.0/16   --subnet=192.170.0.0/16   --gateway=192.168.0.100   --gateway=192.170.0.100   --ip-range=192.168.1.0/24   --aux-address="my-router=192.168.1.5"   --aux-address="my-switch=192.168.1.6"   --aux-address="my-printer=192.170.1.5"   --aux-address="my-nas=192.170.1.6"   MyOverlayNetwork

其他

码头工人中心

Docker 语法 描述 docker search search_word在 docker hub 中搜索图像。 docker pull user/image 从 docker hub 下载镜像。 docker login 向 docker hub 进行身份验证 docker push user/image 将图像上传到 docker hub。

注册表命令

登录注册表

$ docker login$ docker login localhost:8080

从注册表注销

$ docker logout$ docker logout localhost:8080

搜索图像

$ docker search nginx$ docker search nginx --stars=3 --no-trunc busybox

拉取镜像

$ docker pull nginx$ docker pull eon01/nginx localhost:5000/myadmin/nginx

推送图像

$ docker push eon01/nginx$ docker push eon01/nginx localhost:5000/myadmin/nginx

批量清理

命令描述
docker stop -f $(docker ps -a -q)停止所有容器
docker rm -f $(docker ps -a -q)删除所有容器
docker rmi -f $(docker images -q)删除所有图像

容量

检查容量

$ docker volume ls

清理未使用的容量

$ docker volume prune