Hello World Docker

示例

  1. 准备hello.cpp
#include<stdio.h>

int main(){
printf("Hello World Docker\n");
return 0;
}
  1. 新建Dockerfile文件(不区分大小写,默认指令全大写)
FROM gcc:9.3
# this is in docker filesystem, not host
WORKDIR /usr/src/app
COPY hello.cpp .
RUN g++ hello.cpp -o test
CMD [ "./test" ]

Dockerfile里的指令是按序且相互独立执行的,但第一个指令必须是FROM指令,该指令用于指定基础image(比如示例基于gcc9.3 image)。

WORKDIR指定的是docker daemon处程序运行的位置,非客户端处。

COPY将文件拷贝到WORKDIR中。

RUN在daemon上运行指令。

CMD在daemon上运行cmd命令。

  1. 对docker的操作都是以docker命令开头,在当前目录构建docker并tag为hello:1.0
docker build -t hello:1.0 .

docker会在本目录下搜寻Dockerfile文件,用户也可以通过-f选项指定Dockerfile文件。

显示的构建信息:

Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM gcc:9.3
---> e2a33649a4fc
Step 2/5 : WORKDIR /usr/src/app
---> Using cache
---> 6e517536c8a4
Step 3/5 : COPY hello.cpp .
---> Using cache
---> 94a4f0ecfe1b
Step 4/5 : RUN g++ hello.cpp -o test
---> Using cache
---> 92e3862f7e1e
Step 5/5 : CMD [ "./test" ]
---> Running in 1e7ffb943e31
Removing intermediate container 1e7ffb943e31
---> c0cef7d15884
Successfully built c0cef7d15884
Successfully tagged hello:1.0

构建完成。

  1. 以交互式方式(-i)运行hello:1.0 并别名(--name)为hello
docker run -it --name hello hello:1.0

docker开始运行./test程序,打印:

Hello World Docker
  1. 查看docker当前状态
docker ps -all

显示:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
03fb0b671849 hello:1.0 "./test" 8 seconds ago Exited (0) 7 seconds ago hello

Exited的原因是hello程序运行太快,在ps前就已经退出。

  1. 停止docker运行
docker stop hello
  1. 最后删除docker
docker rm --force hello

此时再ps会发现名为hello的docker已经消失不见。

docker build过程中发生的事

build命令

docker build [OPTIONS] PATH | URL | -
  1. docker build命令是由daemon而非客户端运行的。

  2. docker会首先将PATH(本地目录)下的所有目录和文件,或URL(git仓库)下的所有模块递归的发送到daemon中。

  3. 接着docker会在本目录下搜寻·文件,用户也可以通过-f选项指定Dockerfile文件。

  4. 在运行Dockerfile文件里的指令之前,docker会先验证Dockerfile文件是否有语法问题并报错。

  5. 验证正确后,docker将一个个执行Dockerfile里的指令,每条指令相互独立(也就是说上一条指令的结果不会影响下一条指令,比如cd /tmp并不会让下一条指令在/tmp目录下运行)。若指令执行成功,则将结果提交到一个新的image中(每条指令都将生成一个新的image)。

  6. 当然,docker会将可能重复利用中间生成的临时image(cache)来加速build速度,是否用了cache可以通过(---> Using cache)信息判断。

  7. 在得到最终的imgae时,docker还会自动清理掉最初发过来的文件。

  8. -t选项可以给构建成功后的image指定库或tag(可以有多个)。

在docker中写个Hello World的更多相关文章

  1. 无忧之道:Docker中容器的备份、恢复和迁移

    原创:LCTT https://linux.cn/article-5967-1.html译者: GOLinux本文地址:https://linux.cn/article-5967-1.html 201 ...

  2. 把ABP框架部署到Docker中

    本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像.启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile. ...

  3. 滚动 docker 中的 nginx 日志

    Nginx 自己没有处理日志的滚动问题,它把这个球踢给了使用者.一般情况下,你可以使用 logrotate 工具来完成这个任务,或者如果你愿意,你可以写各式各样的脚本完成同样的任务.本文笔者介绍如何滚 ...

  4. 详解docker中容器devicemapper设备的挂载流程

    事故起因 版本说明:本文中docker版本主要基于1.10版本,操作系统为centos7.devicemapper在文中缩写为dm. 某个用户的容器启动不起来,启动时候一直报错.通过docker lo ...

  5. C#.Net Core 操作Docker中的redis数据库

    做软件开发的人,会在本机安装很多开发时要用到的软件,比如数据库,有MS SQL Server,MySQL,等,如果每种数据库都按照在本机确实有点乱,这个时候我们就想用虚拟机来隔离,这样就不会扰乱本机一 ...

  6. 在 Docker 中使用 mysql 的一些技巧

    启动到后台:  docker-compose start docker-composer 执行命令: entrypoint: pwd app: build: ./app working_dir: /a ...

  7. [转]Docker中的镜像

    引言 这篇文章中我们主要来探讨下Docker镜像,它是用来启动容器的构建基石,本文的所用到的Dcoker版本是17.1,API版本是1.33,Go的版本是1.9.2,OS是基于Arch Linux的M ...

  8. 让docker中的mysql启动时自动执行sql文件

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  9. 记一个在docker中运行多线程event_loop.run_forever()的bug

    问题简介 我写爬虫,用到了asyncio相关的事件循环,新建了一个线程去run_forever(),在docker中运行.后来程序有异常,主线程挂了,但是竟然不报错.查了很久,才找出来. 如果你新建一 ...

随机推荐

  1. Spring Boot 2 实战:利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  2. TXT文件的写入及读出

    一.文件的读出: file = open('url/data.txt','r',encoding='utf-8')#打开模式r w a,当文件在当前工作区域直接写文件名:如果不在当前工作区域要写绝对地 ...

  3. 多语言工作者の十日冲刺<3/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第三天(05.02) 作业正文 ...

  4. 多语言工作者の十日冲刺<10/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第十天(05.09) 作业正文 ...

  5. EJB JMS javax.naming.NameNotFoundException: XXX not bound

    练习EJB MessageDrivenBean时部署不成功,一直报错 09:57:29,017 WARN [JmsActivation] Failure in jms activation org.j ...

  6. JavaWeb网上图书商城完整项目-数据库操作工具类2-MapHandle的高级用法

    1.现在在上面一章的基础上,我们引入一个address表,该表记录person类的地址,address表的格式如下所示 现在person类要和address表想关联,得到当前联系人的住宅地址,我们应该 ...

  7. RabbitMQ:三、进阶

    保证消息的安全 持久化 交换器持久化:声明交换器时指定持久化 队列持久化:声明队列时指定持久化 消息持久化:发送消息时指定持久化 一般队列和消息持久化要同时声明,此外消息假如进了交换器却找不到队列,也 ...

  8. Python3-设计模式-装饰器模式

    装饰器模式 动态的给原有对象添加一些额外的职责,面向切面编程(AOP),多用于和主业务无关,但又必须的业务,如:登录认证.加锁.权限检查等 Python代码实现示例 需求点: 1.在old_func( ...

  9. 并发06--JAVA中的并发工具类

    1.等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作. 使用join也可以完成这个操作,代码示例如下: package com.exam ...

  10. LQR算法如何跟随变化的期望状态

    开门见山,通过LQR的能量函数可以看出,LQR算法是将状态量控制到零(关于能量函数请看我的随笔:LQR要点),但实际控制中我们希望状态量能够跟随期望值 下面将会解决如何用LQR算法跟随变化的期望值: ...