参阅Runoob教程

什么是Docker?

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

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

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

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

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

快速,一致地交付您的应用程序

Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

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

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

响应式部署和扩展

Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。

Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

在同一硬件上运行更多工作负载

Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

Docker 架构

Docker 包括三个基本概念:

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

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Docker镜像使用

列出本地可用镜像

1
docker images
1
2
3
4
5
6
../files/home # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0c404972e130 2 weeks ago 135MB
ubuntu latest 21735dab04ba 4 weeks ago 69.2MB
hello-world latest 46331d942d63 6 months ago 9.14kB
training/webapp latest 6fae60ef3446 7 years ago 349MB

选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

我们可以通过tag,IMAGE ID对镜像进行管理

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

查找镜像

1
docker search httpd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.../files/home # docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4176 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 44
centos/httpd 35 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 2
solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 2 [OK]
hypoport/httpd-cgi httpd-cgi 2 [OK]
dockerpinata/httpd 1
inanimate/httpd-ssl A play container with httpd, ssl enabled, an… 1 [OK]
publici/httpd httpd:latest 1 [OK]
centos/httpd-24-centos8 1
dariko/httpd-rproxy-ldap Apache httpd reverse proxy with LDAP authent… 1 [OK]
manageiq/httpd Container with httpd, built on CentOS for Ma… 1 [OK]
nnasaki/httpd-ssi SSI enabled Apache 2.4 on Alpine Linux 1
lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK]
patrickha/httpd-err 0
httpdocker/kubia 0
amd64/httpd The Apache HTTP Server Project 0
e2eteam/httpd 0
manageiq/httpd_configmap_generator Httpd Configmap Generator 0 [OK]
paketobuildpacks/httpd 0
httpdss/archerysec ArcherySec repository 0 [OK]
sandeep1988/httpd-new httpd-new 0
19022021/httpd-connection_test This httpd image will test the connectivity … 0
ppc64le/httpd The Apache HTTP Server Project 0
manasip/httpd 0

介绍:

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

获取一个镜像

官网:https://hub.docker.com/

1
docker pull ubuntu:18.04
1
2
3
4
5
6
7
8
9
10
11
12
.../files/home # docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
d30cf2a6a25a: Pull complete
Digest: sha256:6fec50623d6d37b7f3c14c5b6fc36c73fd04aa8173d59d54dba00da0e7ac50ee
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
.../files/home # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0c404972e130 2 weeks ago 135MB
ubuntu 18.04 b280829784a6 3 weeks ago 56.6MB
ubuntu latest 21735dab04ba 4 weeks ago 69.2MB
hello-world latest 46331d942d63 6 months ago 9.14kB

使用某个操作系统镜像

以ubuntu为例

1
docker run -it ubuntu /bin/bash
1
2
.../files/home # docker run -it ubuntu /bin/bash
root@7a2ab5737b1b:/#

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

删除镜像

1
2
docker rmi ubuntu:latest
docker rmi ubuntu:18.04
1
2
3
4
5
6
7
8
.../files/home # docker rmi ubuntu:latest
Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container 904ed1b68b91 is using its referenced image 21735dab04ba

.../files/home # docker rmi ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:6fec50623d6d37b7f3c14c5b6fc36c73fd04aa8173d59d54dba00da0e7ac50ee
Deleted: sha256:b280829784a60d7ccae510022d45a3ee196f8de218e4264f661d305cc64a1b8c
Deleted: sha256:014eb09f08715ce58b2a3fc48ad6d9a9adb4c0c1dab47ea9231dad2310d13abc

我们注意到删除第一个镜像ubuntu:latest报错,原因是有容器正在使用当前镜像,我们需要先将容器删除。

1
2
3
.../files/home # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
904ed1b68b91 ubuntu "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago focused_lamport

创建镜像

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

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

更新镜像并提交

使用现有镜像创建一个容器

1
docker run -it ubuntu:latest /bin/bash

对容器进行一些操作

1
apt-get upgrade

使用docker commit提交镜像副本

1
docker commit -m "This is a new images." -a "lptexas" 1e5da4fe6dee lptexas/ubuntu:v2

参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名

Dockerfile构建镜像

编写Dockerfile文件

1
cat Dockerfile
1
2
3
4
5
6
7
8
9
10
FROM    centos:latest
MAINTAINER lptexas "asucanyh@qq.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd lptexas
RUN /bin/echo 'lptexas:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
  • FROM,指定使用哪个镜像源
  • RUN 指令告诉docker 在镜像内执行命令,安装了什么

使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像

1
docker build -t lptexas/centos:latest .

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用构建的镜像创建容器

1
docker run -it lptexas/centos /bin/bash
1
2
3
.../home/docker # docker run -it lptexas/centos /bin/bash
[root@021a35feda3b /]# id lptexas
uid=1000(lptexas) gid=1000(lptexas) groups=1000(lptexas)

设置镜像标签

1
docker tag 21735dab04ba lptexas/ubuntu:dev
1
2
3
4
5
6
.../files/home # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0c404972e130 2 weeks ago 135MB
ubuntu latest 21735dab04ba 4 weeks ago 69.2MB
lptexas/ubuntu dev 21735dab04ba 4 weeks ago 69.2MB
hello-world latest 46331d942d63 6 months ago 9.14kB

语法是:docker tag IMAGE ID REPOSITORY:NEW_TAG

事实上我们使用这条命令还可以定义REPOSITORY名。