docker 实践:如何构建自己的镜像


文章目录



创建自己的项目

我们用简单的 node.js web项目输出 helloworld 为例.
项目目录:

npm start app.js 启动项目;
app.js 代码

const Koa = require('koa');
const app = new Koa();

const main = ctx => {
  ctx.response.body = 'Hello World';
};

app.use(main);
app.listen(3000);


编写dockerfile

FROM node:8.4
COPY . /app
WORKDIR /app
RUN ["npm", "install"]
CMD [ "npm", "start" ]
EXPOSE 3000/tcp

FROM node:8.4 从docker镜像仓库拉取官方 node 镜像

COPY ./app 把项目从宿主机拷贝到容器 ./app 目录内

WORKDIR /app 指定程序这容器内的工作目录

RUN ["npm", "install"] 在容器中安装node依赖包

CMD [ "npm", "start" ] 在容器中运行指定命令

EXPOSE 3000/tcp 通知 Docker 该容器在运行时监听的端口 3000


忽略不需要的内容

创建 .dockerignore 文件
声明拷贝项目时,容器忽略的内容


.git
node_modules
npm-debug.log


构建镜像

docker build --tag helloworld:1.0 .
指定镜像名称 helloworld
指定镜像版本 1.0
命令最后的 . 不要丢掉;
.实际上是在指定上下文的目录, docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像.

结果:

+] Building 52.1s (9/9) FINISHED                                                             
 => [internal] load build definition from Dockerfile                                        0.1s
 => => transferring dockerfile: 212B                                                             0.0s
 => [internal] load .dockerignore                                                                   0.1s
 => => transferring context: 71B                                                                   0.0s
 => [internal] load metadata for docker.io/library/node:8.4                           14.6s
 => [internal] load build context                                                                     0.0s
 => => transferring context: 27.43kB                                                            0.0s
 => CACHED [1/4] FROM docker.io/library/node:8.4@sha256:080488acfe59bae32331ce28373b752  0.0s
 => [2/4] COPY . /app                                                                                    0.1s
 => [3/4] WORKDIR /app                                                                               0.1s
 => [4/4] RUN ["npm", "install"]                                                                     36.5s
 => exporting to image                                                                                  0.4s 
 => => exporting layers                                                                                  0.3s 
 => => writing image sha256:9ad8d21f44f52b2244e8a1faf732d9901987c0ee7b7005041747b65e026  0.0s 
 => => naming to docker.io/library/helloworld:1.0                                        0.0s 

从镜像构建容器

# zhangzhi @ ZhangZhi-MacBook-Pro in ~/code/study/HelloWorld [23:24:45] 
$ docker run --publish 3000:3000 --detach --name helloworld helloworld:1.0
-- publish 3000:3000  将主机3000端口绑定到容器3000端口
-- name    helloworld   给容器指定一个别名
-- detach   在后台运行容器并打印出容器ID

输出结果:

# zhangzhi @ ZhangZhi-MacBook-Pro in ~/code/study/HelloWorld [23:24:45] 
$ docker run --publish 3000:3000 --detach --name helloworld helloworld:1.0
bf1856c96b68d0a87adbdf94767e8901bc8129dbd60227dc5973e01403797d15

运行成功并且打印出了容器ID


查看容器是否运行成功

我们宿主机上的3000 端口绑定了 容器的 3000端口,
而容器上运行的 helloword 程序监听 3000端口,
所以我们这宿主机浏览器看下本机 3000端口是否有服务.
localhost:3000

没有问题,确实打印出来 helloworld;
然后我们看下当前运行的 容器;

当前运行2个容器实例,一个是mongodb服务,一个是刚才我们构建的helloworld镜像实例.
大家可以确认上面的 CONTAINER ID ,确实是我们运行起来的实例.

出自:docker 实践:如何构建自己的镜像

回到顶部