制作自己的 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 .

        构建过程截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 序列之列表

系列文章目录 Python序列之元组 Python序列之列表 系列文章目录[TOC](Python序列之列表) 前言一、序列是什么?二、列表1.列表简介2.列表创建(1)[]创建(2)list创建(3)range()创建整数列表&#…

VS2010推荐字体设置

fixedsys excelsior是VS2010推荐字体。下载地址为 链接:https://pan.baidu.com/s/16OFbjBEF35zRfQe04Jfuag 提取码:wzjj下载成功后将ttf文件复制粘贴到C盘Windows中的font文件夹中自动安装指定字体,此时就可以在VS2010的工具,选…

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | …

下定决心了,从字节跳动离职

今天在脉脉上看到这么一条内容: 看完感触很深,想起了我在帝都上班的那几年时光。 我记得我去帝都上班的时候,第一次坐帝都的地铁,那时候是找工作面试,在地铁里第一次感受到了大城市的上班速度,每个人都急匆…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码: 4.RS-232 receiver…

Dijkstra(迪杰斯特拉)算法总结

知识概览 Dijkstra算法适用于解决所有边权都是正数的最短路问题。Dijkstra算法分为朴素的Dijkstra算法和堆优化版的Dijkstra算法。朴素的Dijkstra算法时间复杂度为,适用于稠密图。堆优化版的Dijkstra算法时间复杂度为,适用于稀疏图。稠密图的边数m和是一…

tensorboard可视化——No dashboards are active for the current data set.

No dashboards are active for the current data set. 出现问题的原因是事件的路径未用绝对路径,tensorboard --logdir./runs --port6007 改为tensorboard --logdirD:\Code\Python\Study\CL\hat-master\hat-master\run s\one --port6007就好了

浅谈Dubbo核心概念及架构流程

浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言,我们学习Dubbo应该学的是什么? 笔者是一名业务开发,认为一切目的都要为我们的目标服务,即日常工作有帮…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义,这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的,以及如何关联起来的。(我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S 2023/12/23 14:14 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件: PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

大一C语言查缺补漏 12.24

遗留问题&#xff1a; 6-1 1 在C语言中&#xff0c;如果要保留小数的话&#xff0c;一定要除以2.0&#xff0c;而不是2。 设整型变量m,n,a,b的值均为1&#xff0c;执行表达式&#xff08;m a>b&#xff09;||(n a<b)后&#xff0c;表达式的值以及变量m和n的值是&#…

redis怎么查看bigkey

通过docker-compose启动一个redis服务器 docker-compose.yml文件的内容如下&#xff1a; version: 3 services:redis:image: redisports:- 6379:6379docker-compose up -d 启动redis容器 在服务器上安装redis-cli工具 这里我是ubuntu服务器&#xff0c;centos用yum代替apt安…

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试&#xff08;非常重要&#xff09; 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计&#xff0c;第一个摆在我们面前的就说四肢的朝向问题&#xff0c;如下图&#xff0c;我们是…

C++类的继承

目录 什么是继承&#xff1f; 父类与子类对象的赋值转换 继承中的作用域问题 子类的默认成员函数问题 如何使一个类不能被继承&#xff1f; 父类的友元和静态成员变量 多重继承与菱形继承 继承和组合 什么是继承&#xff1f; 继承 (inheritance) 机制是面向对象程序设…

继承易错总结

1.继承会将所有的成员继承下来&#xff0c;但是继承方式限定的是继承下来成员的可见类型(如果是private继承&#xff0c;那么他不论哪里都是不可见的&#xff1b;如果是protected继承在类中是可见的&#xff0c;在类外是不可见的&#xff1b;如果是public继承&#xff0c;在任何…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过&#xff0c;如果没有&#xff0c;推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》&#xff0c;课程目录如下&#xff1a; Ubuntu22安装Vscode 下载&#xff1a;https://code.visualstudio.com/Download 安装命令&#…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…