当前位置: 首页 > news >正文

制作自己的 Docker 容器

        软件开发最大的麻烦事之一,就是环境配置。用户必须保证操作系统的设置,各种库和组件的安装,只有它们都正确,软件才能运行。docker从根本上解决问题,软件安装的时候,把原始环境一模一样地复制过来。

        以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。准备工作,下载源码:git clone https://github.com/ruanyf/koa-demos.git cd koa-demos

1、编写 Dockerfile 文件

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

.git node_modules npm-debug.log

        上面代码表示,这三个路径要排除,不要打包进入image文件。如果你没有路径要排除,这个文件可以不新建。

        然后,在项目的根目录下,新建一个文本文件 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 端口暴露出来, 允许外部连接这个端口。

2、创建 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

3、生成容器

        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

        如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。

root@66d80f4aaf1e:/app#

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

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

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

4、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 # 容器启动后执行命令,一个容器只能有一个CMD命令.

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

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

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

5、测试demo

        在ubuntu 21.04最小系统上,运行hello.sh文件,运行方式./hello.sh,文件内容:

#hello.sh 
echo "hello docker"        

        Dockerfile基本结构:

FROM ubuntu:21.04 
ADD hello.sh / 
CMD ["./hello.sh"]

        镜像的构建,-t:tag指定镜像名称和版本:

docker image build -t hello.sh:1.0 .

        构建过程截图:

相关文章:

  • 家校互通小程序实战开发02首页搭建
  • ARM GIC(四) gicv3架构基础
  • ModuleNotFoundError: No module named ‘tensorflow‘
  • 【华为OD题库-107】编码能力提升计划-java
  • 出现 Error:Unable to access jarfile xxxx\target\nacos-server.jar 解决方法
  • 芯科科技以卓越的企业发展和杰出的产品创新获得多项殊荣
  • Apache Flink 进阶教程(七):网络流控及反压剖析
  • SpringSecurity6 | 登录失败后的JSON处理
  • vue3项目 - 使用 pnpm 包管理器来创建项目
  • Power BI 学习
  • 直接插入排序【从0-1学数据结构】
  • Django 简单图书管理系统
  • 漏洞复现-泛微OA xmlrpcServlet接口任意文件读取漏洞(附漏洞检测脚本)
  • [足式机器人]Part2 Dr. CAN学习笔记-Ch00 - 数学知识基础
  • Flink系列之:深入理解ttl和checkpoint,Flink SQL应用ttl案例
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • AWS实战 - 利用IAM对S3做访问控制
  • Babel配置的不完全指南
  • HashMap ConcurrentHashMap
  • Mac转Windows的拯救指南
  • python学习笔记-类对象的信息
  • windows下如何用phpstorm同步测试服务器
  • 从零开始的无人驾驶 1
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 讲清楚之javascript作用域
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 什么是Javascript函数节流?
  • 使用Gradle第一次构建Java程序
  • 最近的计划
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (LeetCode) T14. Longest Common Prefix
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (一)认识微服务
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET建议使用的大小写命名原则
  • .NET学习全景图
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Autowired自动装配
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [] 与 [[]], -gt 与 > 的比较
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [bzoj1912]异象石(set)
  • [bzoj2957]楼房重建
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [CSS]CSS 字体属性