Docker入门教程

Docker的前世此生:环境配置的难题->虚拟机->Linux容器->Docker

环境配置的难题

不一样软件和不一样硬件的配合度不一,致使【"它在个人机器能够跑了"(It works on my machine)】困境的存在。java

这就要求【操做系统的设置】和【各类库和组件的安装】都要正确。node

软件是否能够带环境安装?git

虚拟机

环境配置难题的一个解决方案,可是有问题:docker

资源占用多、启动慢、冗余步骤多。npm

Linux容器(Linux Containers,缩写为 LXC)

考虑虚拟机技术的缺点,Linux 发展出了另外一种虚拟化技术:Linux 容器。浏览器

Linux 容器不是模拟一个完整的操做系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。bash

因为容器是进程级别的,相比虚拟机有不少优点:服务器

体积小、启动快、占用资源少。网络

Docker 是什么:0.解决环境配置的难题;1.Linux容器的一种解决方案;2.能够将程序与该程序的依赖打包在一个文件里面(image)

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案架构

Docker 将应用程序与该程序的依赖,打包在一个文件里面运行这个文件,就会生成一个虚拟容器程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了 Docker,就不用担忧环境问题。

整体来讲,Docker 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。

Docker能够组建微服务架构。经过多个容器,一台机器能够跑多个服务,所以在本机就能够模拟出微服务架构

Docker 的安装

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,我的开发者通常用不到。

具体安装请参考官网和文档《★2.Docker实践-安装》。

安装完成后,运行下面的命令,验证是否安装成功。【Win7下】

执行

docker version

命令

Docker 是服务器----客户端架构。命令行运行docker命令的时候,须要本机有 Docker 服务。若是这项服务没有启动,能够用下面的命令启动

镜像文件(image)、hello world、容器文件(container)

镜像文件(image):容器(container)的模板,能够生成多个同时运行的Docker容器实例

image的理解

Docker 把应用程序及其依赖,打包在 image 文件里面。

image文件能够生成Docker容器,能够看作是容器的模板。image是静态的,容器的动态的。

同一个image文件能够生成多个同时运行的容器。

image的套路

image 是二进制文件。实际开发中,一个 image 文件每每经过继承另外一个 image 文件,加上一些个性化设置而生成。举例来讲,你能够在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,造成你的 image。

image 文件是通用的(相似于java中的.class文件)

image 文件是通用的,一台机器的 image 文件拷贝到另外一台机器,照样可使用。

为了节省时间应该尽可能使用别人制做好的 image 文件,而不是本身制做。即便要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制做。

image现实中的使用

为方便共享,image 文件制做完成后,能够上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最经常使用的 image 仓库。此外,出售本身制做的 image 文件也是能够的。

image相关的命令

我本身系统中运行的实例

hello world实例

双击Docker Quickstart Terminal进入Docker Toolbox进行操做

将 image 文件从仓库抓取到本地

$ docker image pull library/hello-world

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字

library组是Docker 官方提供的 image 文件的默认组,能够省略。所以,上面的命令能够写成下面这样。

$ docker image pull hello-world

抓取成功之后,就能够在本机看到这个 image 文件了。

$ docker image ls

运行 image 文件

$ docker container run hello-world

docker container run命令会从 image 文件,生成一个正在运行的容器实例。

注意,docker container run命令具备自动抓取 image 文件的功能。若是发现本地没有指定的 image 文件,就会从仓库自动抓取。所以,前面的docker image pull命令并非必需的步骤。

运行成功后,hello world就会中止运行,容器自动终止。

对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止

对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。

$ docker container kill [containID]

容器文件(container)

容器文件说明

image 文件生成的容器实例,自己也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。并且关闭容器并不会删除容器文件,只是容器中止运行而已。

列出本机正在运行的容器 $ docker container ls  & 列出本机全部容器,包括终止运行的容器 $ docker container ls --all

上面命令的输出结果之中,包括容器的 ID。不少地方都须要提供这个 ID,好比终止容器运行的docker container kill命令。

容器文件进一步的说明

终止运行的容器文件,依然会占据硬盘空间,可使用docker container rm命令删除。

$ docker container rm [containerID]

运行上面的命令以后,再使用docker container ls --all命令,就会发现被删除的容器文件已经消失了。

★image命令总结

★★格式:docker image action [imageName] [other param]

列出本机的全部 image 文件:docker image ls

$ docker image ls

将 image 文件从仓库抓取到本地:docker image pull hello-world

$ docker image pull library/hello-world

删除 image 文件:docker image rm [imageName]

$ docker image rm [imageName]

为本地的 image 标注用户名和版本(打tag):docker image tag [imageName] [username]/[repository]:[tag]

$ docker image tag [imageName] [username]/[repository]:[tag]

# 实例

$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

构建 image 文件:docker image build -t [username]/[repository]:[tag]

$ docker image build -t [username]/[repository]:[tag] .

发布 image 文件:docker image push [username]/[repository]:[tag]

$ docker image push [username]/[repository]:[tag]

★container命令总结

★★格式:docker container action [imageName]/[containerID]

列出本机正在运行的容器:docker container ls

$ docker container ls  

列出本机全部容器,包括终止运行的容器:docker container ls --all

$ docker container ls --all

运行 image 文件:docker container run [imageName]

$ docker container run [imageName]

终止容器:docker container kill [containerID]

$ docker container kill [containerID]

删除容器文件:docker container rm [containerID]

$ docker container rm [containerID]

Dockerfile 文件:帮助生成/制做image 文件

一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。

实例:制做本身的 Docker 容器

以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。

  1. 编写 Dockerfile 文件

排除不须要的路径

在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容。

.git

node_modules

npm-debug.log

上面代码表示,这三个路径要排除,不要打包进入 image 文件。若是没有路径要排除,这个文件能够不新建。

新建一个文本文件 Dockerfile

在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容:

FROM node:8.4

COPY . /app

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org

EXPOSE 3000

上面代码一共五行,含义以下

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。

COPY . /app:将当前目录下的全部文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。

WORKDIR /app:指定接下来的工做路径为/app。

RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后全部的依赖,都将打包进入 image 文件。

EXPOSE 3000:将容器 3000 端口暴露出来,容许外部链接这个端口。

  1. 建立 image 文件

有了 Dockerfile 文件之后,就可使用docker image build命令建立 image 文件了。

$ docker image build -t koa-demo .

# 或者

$ docker image build -t koa-demo:0.0.1 .

上面代码中,-t参数用来指定 image 文件的名字,后面还能够用冒号指定标签。若是不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,因此是一个点

若是运行成功,就能够看到新生成的 image 文件koa-demo了。

$ docker image ls

  1. 生成容器

docker container run命令会从 image 文件生成容器。

$ docker container run -p 8000:3000 -it koa-demo /bin/bash

# 或者

$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

上面命令的各个参数含义以下

-p参数:容器的 3000 端口映射到本机的 8000 端口。

-it参数:容器的 Shell 映射到当前的 Shell,而后你在本机窗口输入的命令,就会传入容器。

koa-demo:0.0.1:image 文件的名字(若是有标签,还须要提供标签,默认是 latest 标签)。

/bin/bash:容器启动之后,内部第一个执行的命令。这里是启动 Bash,保证用户可使用 Shell。

若是一切正常,运行上面的命令之后,就会返回一个命令行提示符。

root@66d80f4aaf1e:/app#

这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行下面的命令。

root@66d80f4aaf1e:/app# node demos/01.js

这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000,网页显示"Not Found",这是由于这个 demo 没有写路由。

这个例子中,Node 进程运行在 Docker 容器的虚拟环境里面,进程接触到的文件系统和网络接口都是虚拟的,与本机的文件系统和网络接口是隔离的,所以须要定义容器与物理机的端口映射(map)

如今,在容器的命令行,按下 Ctrl + c 中止 Node 进程,而后按下 Ctrl + d (或者输入 exit)退出容器。此外,也能够用docker container kill终止容器运行。

    # 在本机的另外一个终端窗口,查出容器的 ID

    $ docker container ls

    # 中止指定的容器运行

    $ docker container kill [containerID]

容器中止运行以后,并不会消失,用下面的命令删除容器文件。

    # 查出容器的 ID

    $ docker container ls --all

    # 删除指定的容器文件

    $ docker container rm [containerID]

也可使用docker container run命令的--rm参数,在容器终止运行后自动删除容器文件。

$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash

  1. CMD 命令

容器启动之后,须要手动输入命令node demos/01.js。咱们能够把这个命令写在 Dockerfile 里面,这样容器启动之后,这个命令就已经执行了,不用再手动输入了。

FROM node:8.4

COPY . /app

WORKDIR /app

RUN npm install --registry=https://registry.npm.taobao.org

EXPOSE 3000

CMD node demos/01.js

上面的 Dockerfile 里面,多了最后一行CMD node demos/01.js,它表示容器启动后自动执行node demos/01.js。

RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件CMD命令则是在容器启动后执行。另外,一个 Dockerfile 能够包含多个RUN命令,可是只能有一个CMD命令

注意,指定了CMD命令之后,docker container run命令就不能附加命令了(好比前面的/bin/bash),不然它会覆盖CMD命令。如今,启动容器可使用下面的命令。

$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1

五、发布 image 文件:【打tag】和【发布】

容器运行成功后,就确认了 image 文件的有效性。能够考虑把 image 文件分享到网上,让其余人使用。

注册docker hub并登陆

首先,去 hub.docker.com 或 cloud.docker.com 注册一个帐户。而后,用下面的命令登陆。

$ docker login

为本地的 image 标注用户名和版本

$ docker image tag [imageName] [username]/[repository]:[tag]

# 实例

$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

也能够不标注用户名,从新构建一下 image 文件

$ docker image build -t [username]/[repository]:[tag] .

发布 image 文件

$ docker image push [username]/[repository]:[tag]

发布成功之后,登陆 hub.docker.com,就能够看到已经发布的 image 文件。

★命令总结

登陆hub.docker.com:docker login(必须有注册帐号和密码)

相关文章
相关标签/搜索