资讯专栏INFORMATION COLUMN

[afterCode] docker 速成班 4: 自建 Image

Charles / 385人阅读

摘要:通过能获得很多别人定制好的但是如果自己想制作一个自己容器该怎么弄呢用就像一个脚本文件告诉如何创建一个新的下面举例来用来制作一个服务器的指令刚才提到了社区已经有很多很好用的那我们要构建自己的的话就可以在这些的基础上来做我们要做一个基于的服务器

通过 docker hub 能获得很多别人定制好的image, 但是如果自己想制作一个自己容器该怎么弄呢?

用 Dockerfile

Dockerfile 就像一个脚本文件, 告诉 docker 如何创建一个新的 Image.
下面举例来用 node.js 来制作一个 http 服务器的 image.

FROM 指令

刚才提到了社区已经有很多很好用的 docker images, 那我们要构建自己的 iamge 的话就可以在这些 image 的基础上来做. 我们要做一个基于 node.js 的 http 服务器, 那首先就是找一个已经安装好 node.js 的 image, docker hub 已经有了 node.js 官方 images 了, 直接利用这些资源就可以了. 利用的方式就是使用 FROM 指令.

// Dockerfile
FROM node:8.5

通过 FROM 来指定 node.js 的版本和拉取 image 的格式一样. 如果你需要依赖的 image 是社区版本的话,要写上对应的 namespace 名字.

COPY 指令

有了 node.js 之后我们要写一个 http 服务器. 直接新建一个 index.js 文件, 使用 node.js 官方 hello world 的例子.

// index.js
// ref https://nodejs.org/en/about/
const http = require("http");
const hostname = "127.0.0.1";
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello World
");
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

有了这个服务器代码之后, 就要将这个 index.js 文件从我们的主机上用 COPY 指令拷贝到容器中.这个语法和我们平时使用cp的格式非常类似,要注意的是容器中的地址采用绝对地址.

// Dockerfile
FROM node:8.5
COPY  index.js /root/index.js
CMD 指令

为了让我们的http 服务器启动起来就用 CMD 在容器中执行的命令.

// Dockerfile
FROM node:8.5
COPY  index.js /root/index.js
CMD node /root/index.js

在容易中执行 node /root/index.js 这样我们的 http 服务就在容器中启动了

EXPOSE 指令

虽然启动了服务, 也只是在容器内部自 high; 为了能让服务能在容易意外被使用,就要将服务端口暴露出去.

// Dockerfile
FROM node:8.5
COPY  index.js /root/index.js
EXPOSE 3000
CMD node /root/index.js

这里需要注意的是, 要把 EXPOSE 放在服务启动之前. 不然端口的暴露就会有问题. 别问我为什么会知道,说多了都是泪.

最后一步构建

到这里我们的 Dockefile 就完成了,但是我们 image 文件在哪里啊.当让是要通过 docker 的 build 命令构建出来咯.这里的-t 选项告诉 docker 这生成出来的 image 的 tag 是什么. 我们自己的做的 image 属于是社区的 image 记得在 image 名字前面加上自己的 namespace.

docker build . -t pshu/helloWorld:1.0.0

docker 就会先去 docker hub 拉取 node.js 的镜像, 然后按照 Dockerfile 中的

Step 1/4 : FROM node:8.5
8.5: Pulling from library/node
aa18ad1a0d33: Pull complete
15a33158a136: Pull complete
f67323742a64: Pull complete
c4b45e832c38: Pull complete
f83e14495c19: Pull complete
41fea39113bf: Pull complete
f28b27a3711e: Pull complete
2079c2e3f89a: Pull complete
Digest: sha256:27e459456c552642c520a36f934b0e1646043d43877a5e018e9bb3f251d2ef76
Status: Downloaded newer image for node:8.5
 ---> de1099630c13
Step 2/4 : COPY index.js /root/index.js
 ---> 947429cca879
Removing intermediate container 1f813f1cbf71
Step 3/4 : CMD node index.js
 ---> Running in 17425d436856
 ---> c720248bb068
Removing intermediate container 17425d436856
Step 4/4 : EXPOSE 3000
 ---> Running in d1b924412684
 ---> 969f16cac45d
Removing intermediate container d1b924412684
Successfully built 969f16cac45d
Successfully tagged pshu/helloworld:1.0.0

docker build 完成就能看见自己的 image 了.

$docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
pshu/helloworld        1.0.0               969f16cac45d        31 seconds ago      673MB

接着我们之只要用 docker run 命令就能把这个 image 跑起来了.

docker run --rm -i -p 3000:3000 pshu/helloworld:1.0.0

本地的3000端口就能访问到这个 hello world 的 http 服务了.

希望大家喜欢.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27081.html

相关文章

  • [afterCode] docker 成班 1: image

    摘要:在程序员英语娱乐主题节目的直播中介绍了下在网站学习的视频由于时间仓促只学习了一部分最近因为的公司的原因也没有时间继续搞直播所以想写一篇分享下自己的的学习经验想学习简短有效的风格所以就将文章题目定为速成班准备本地已经安装好了现在各个操作系统上 在程序员英语娱乐主题节目http://www.douyu.com/aftercode的直播中介绍了下在 egghead 网站学习 docker 的...

    waltr 评论0 收藏0
  • [afterCode] docker 成班 2: container

    摘要:本来想在一篇里面就写完所有的内容的但是考虑考虑到文章太长会和风格相背离所以就按连载的形式来容器是物质基础有了这个才能让能运行起来运行起来的称之为容器它使用中的一等公民直接启动使用启动一个容器如果你没有下载过的话会自动下载一个的指定方法和删除 本来想在一篇 blog 里面就写完所有的内容的,但是考虑考虑到文章太长会和 egghead 风格相背离,所以就按连载的形式来. 容器 contai...

    stormjun 评论0 收藏0
  • [afterCode] docker 成班 6: docker-compose

    摘要:通过的我们可以将多个有机的组合起来构建出自己需要的服务但是这里有几个小问题就是不利于分享步骤麻烦需要自己创建指定使用那如何解决上面的两个问题呢第节例子中的服务可以通过创建一个这样的文件来解决通过下面的命令就能将所有需要的启动起来 通过docker 的 network我们可以将多个 container 有机的组合起来构建出自己需要的服务. 但是这里有几个小问题就是 不利于分享. 步骤麻...

    Integ 评论0 收藏0
  • [afterCode] docker 成班 5: 组合 container

    摘要:到现在为止我们会从拉取自己需要的文件并执行起来还会基于已有的来制作自己特殊需要的但是如果我们完成一个功能需要多个组合起来使用该怎么办呢虽然可以通过来制作一个这样的但是如果所有的功能都做在一个中如果有一个模块需呀改变的话就需要重新构建整个作为 到现在为止,我们会从 docker hub 拉取自己需要的 image 文件并执行起来. 还会基于已有的 image 来制作自己特殊需要的 ima...

    neuSnail 评论0 收藏0
  • [afterCode] docker 成班 7: 实战 构建基于graphtie/grafana监

    摘要:由于公司没有运维又需要监控服务器的一些数据信息想尽快的启动一个数值监控系统技术评估了下打算的方式来建设是一个时间数列数据库并且自带一些简单图形展示功能虽然展示方面不是很完美但是在收集时间数据上非常的方便和简单根据官网的例子只需要一个连接就能 由于公司没有运维, 又需要监控服务器的一些数据信息, 想尽快的启动一个数值监控系统. 技术评估了下打算 graphite + grafana 的...

    jhhfft 评论0 收藏0

发表评论

0条评论

Charles

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<