• 150455

    文章

  • 1009

    评论

  • 13

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

Docker入门教程


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

环境配置的难题

不同软件和不同硬件的配合度不一,导致【"它在我的机器可以跑了"(It works on my machine)】困境的存在。

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

软件是否可以带环境安装?

虚拟机

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

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

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

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

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

由于容器是进程级别的,相比虚拟机有很多优势:

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

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

5、发布 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(必须有注册账号和密码)


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客