如何使用 Dockerfile 创建一个简单容器

目录
  • Dockerfile
  • 写一个 Dockerfile
  • 优化 Dockerfile
  • container shell

Dockerfile

Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令,是用于创建 image 的蓝图。

现在有一个简单的 node 项目( 其中Dockerfile 是后面加的,初始项目没有此文件):

要运行此代码,一般的做法是,先在本机安装 node,然后在项目文件夹中先后运行:

npm install

以及:

node server.js,

然后在浏览器 localhost 地址就可以看到app运行界面。

写一个 Dockerfile

如果要改为在 container 中运行此程序,那么首先需要有此 node appimage,要创建 image, 则需要写一个Dockerfile:

# 将在 node image 基础上创建此自定义的 image
FROM node

# Docker container 工作目录
# 此指令告诉 Docker,余下的指令将在容器内的 /app 文件夹内执行。
WORKDIR /app

# 将当前项目文件夹内的所有文件及子文件全部copy 到 /app 文件夹中
# 因为有上一条指令,这里改为  COPY . . 也可以
COPY . /app

# 安装 package.json 中的package,生成 node_modules 文件夹
RUN npm install

# 容器内的进程将发布端口 80
# 可选,这条指令什么也不做,只起文档作用,best practice
EXPOSE 80

# 当基于此 image 的容器启动后,命令  node server.js 将会执行
CMD ["node", "server.js"]

上述Dockerfile总共6条指令,起作用的只有5条。

然后在终端执行命令,此命令将生成此 node app 的 image:

docker build .    

. 号是Dockerfile 文件所在的路径,这里刚好是当前路径。

docker 容器是与外界独立的进程,具有自己的内部网络,当容器内的 node 应用程序在容器的端口 80 监听时,容器不会将该端口发布到我们的本地机器。此外 Dockerfile 里的端口不起作用,因此必须在命令中使用 --publish 或者 -p 实现本机端口和运行的容器端口的映射。

运行基于此image的容器:

docker run --publish 3000:80 previously_generated_image_id

打开浏览器 localhost:3000 就可以查看运行界面。

优化 Dockerfile

image 只读,如果修改了 source code,需要重新 build 一遍,其中的 npm install 特别费时间,但此指令通常是不需要执行的,因为新增第三方包的可能性远低于修改代码的可能性。

每次build image 时,Docker 都会缓存每条指令执行的结果。所以当重新 build image 时,如果不需要再次运行指令,它将使用这些缓存的结果。 这被称为基于层的架构。

每条指令都代表 Dockerfile 中的一个层, image 是根据这些不同的指令简单地从多个层构建的。

将 RUN npm install 指令提前将能优化image 的构建:

FROM node

WORKDIR /app

COPY package.json /app 

# 将此指令提前,通常都能利用前一次build 的结果,
# 因此能极大节省重新 build image 所需要的时间。
RUN npm install

COPY . /app

# optional
# 这条指令什么也不做,只起文档作用,best practice
EXPOSE 80

CMD ["node", "server.js"]

container shell

使用 -it 能获得容器的 shell, i: interactive, t: tty :

docker run -it 46613ce05eae bash

然后就可以查看安装到容器内的 node 版本,以及 /app 内的文件等等,使用 exit 命令退出。

root@ca432bda02aa:/app# node -v
v18.0.0   
root@ca432bda02aa:/app# ls  
Dockerfile  node_modules  package-lock.json  package.json  public  server.js
root@ca432bda02aa:/app#

到此这篇关于如何使用 Dockerfile 创建一个简单容器的文章就介绍到这了,更多相关 Dockerfile 创建容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker容器上用DockerFile部署多个tomcat服务的步骤

    1. [admin@JD ~]$ cd opt #进入根目录下的opt 里 2. [admin@JD opt]$ mkdir web #创建Web 文件夹 3. [admin@JD web]$ cd web/ #进入web文件夹 4. [admin@JD web]$ touch Dockerfile #创建一个Dockerfile文件夹 名字不能错必须是这个名字否者检测不到 5. 利用三方工具将 tomcat 和 jdk的 上传到Web文件夹 6. [admin@JD web]$ vim Doc

  • Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    本文实例为大家分享了Dockerfile创建支持ssh服务自启动的容器镜像,供大家参考,具体内容如下 1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "kongxx@hotmail.com" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh

  • Docker中Dockerfile之容器中运行MyEclipse搭建的JavaWeb项目

    这篇文章将讲述如何将上一篇文章中的Javaweb项目制作成Docker的镜像.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 应用程序在Docker容器中运行和在物理机运行的原理是一样的,所以我们部署这个Javaweb项目到Docker中的步骤应该如下: 服务器支持(这里选择Centos7) 安装Java环境 安装Tomcat环境 将Tomcat根目录下的webapps/ROOT目录下的所有文件(夹)删除 将自己开发的web项目的WebRoot目录下的所有文件(夹)复

  • docker容器内要启动两个进程时Dockerfile的实现代码

    近期想做一个cron定时任务的docker,在Dockerfile中做如下定义 FROM library/alpine:latest RUN apk --update add rsync openssh bash VOLUME ["/data"] ADD start.sh / CMD ["/bin/bash","/start.sh"] 在start.sh中用crontab 加载定时任务run.cron,然后启动crond: /usr/bin/cr

  • 如何使用 Dockerfile 创建一个简单容器

    目录 Dockerfile 写一个 Dockerfile 优化 Dockerfile container shell Dockerfile Dockerfile 是用于指导 docker 创建自定义 image 的一系列指令,是用于创建 image 的蓝图. 现在有一个简单的 node 项目( 其中Dockerfile 是后面加的,初始项目没有此文件): 要运行此代码,一般的做法是,先在本机安装 node,然后在项目文件夹中先后运行: npm install 以及: node server.js

  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    介绍 Docker Swarm是用于部署Docker主机集群的Docker本地解决方案.您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群. 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcd或Consul)来进行服务发现.但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用. 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器

  • java swing 创建一个简单的QQ界面教程

    记录自己用java swing做的第一个简易界面. LoginAction.java package com.QQUI0819; import javax.swing.*; import java.awt.event.*; //首先,编写按钮癿监听器实现类 public class LoginAction implements ActionListener { private int count=0; //当前为null,创建后指向界面输入框 private JTextField ulName;

  • HTML+CSS+JavaScript创建一个简单的井字游戏

    目录 实现 HTML 添加 CSS 实现 Javascript 部分 演示地址 实现 HTML 首先在 head 部分,我将包含我们稍后创建的 css 和 javascript 文件.我还添加了名为 Itim 的 Google 字体. <link rel="stylesheet" href="style.css" rel="external nofollow" > <link rel="preconnect"

  • nodejs入门教程二:创建一个简单应用示例

    本文实例讲述了nodejs创建一个简单应用的方法.分享给大家供大家参考,具体如下: 1.创建 test.js // require 来载入 http 模块 var http = require('http'); /** * 使用 http.createServer() 方法创建服务器,返回 一个对象 * 对象有一个叫做 listen 的方法,并使用 listen 方法绑定 8000 端口. * 函数通过 request, response 参数来接收和响应数据. */ http.createSe

  • 用Eclipse 创建一个简单的web项目(图文教程)

    Eclipse neon 汉化版 ; 1.右击新建 --> 选择 动态Web项目 2. 填写 项目名 项目位置 ; 选择 Dynamic web module version 和 tomcat version ; 点击完成 即可创建 项目; 2.1:项目名称: 2.2:项目位置: 2.3: Dynamic Web Module Version 和 Tomacat Version 之间有版本上的匹配关系: 匹配关系如下图 3. 创建成功后的项目结构: 4. 在创建好项目结构之后 先查看一下 项目的

  • 从vue基础开始创建一个简单的增删改查的实例代码(推荐)

    1.安装vue-cli    cnpm install vue-cli -g  --执行全局安装 2.创建一个webpack的基础项目:命令:vue init webpack myproject; 以下是项目的目录结构及说明 build是webpack配置 build.js       // 生产环境构建代码 check-versions.js // 检查node&npm等版本 utils.js          // 构建配置公用工具 vue-loader.conf.js // vue加载器

  • Django REST框架创建一个简单的Api实例讲解

    Create a Simple API Using Django REST Framework in Python WHAT IS AN API API stands for application programming interface. API basically helps one web application to communicate with another application. Let's assume you are developing an android app

  • Python 如何创建一个简单的REST接口

    问题 你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架. 解决方案 构建一个REST风格的接口最简单的方法是创建一个基于WSGI标准(PEP 3333)的很小的库,下面是一个例子: # resty.py import cgi def notfound_404(environ, start_response): start_response('404 Not Found', [ ('Content-type', 'text/plain')

  • MyBatis入门实例教程之创建一个简单的程序

    准备: (1) IDEA 2021 (2)Java 1.8 (3)数据库 MySQL 5.7 (SQLyog 或 Navicat) 在 MySQL 中创建数据库 mybatisdemo,编码为 utf8 新建表: USE mybatisdemo CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, uname VARCHAR(20) NOT NULL, uage INT NOT NULL ); INSERT INTO users(uid,

随机推荐