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. 从零开始手把手教你使用原生JS+CSS3实现幸运水果机游戏

    项目体验地址 免费视频教程 游戏介绍 幸运水果机是一款街机游戏,游戏界面由24个方格拼接成一个正方形,每个方格中都有一个不同的水果图形,方格下都有一个小灯.玩家使用游戏币选择希望押注的目标,按下开始后 ...

  2. Ubuntu搭建Java开发环境-刘志敏-专题视频课程

    Ubuntu搭建Java开发环境-3人已学习 课程介绍        主要介绍在Ubuntu环境如何安装Java开发的基本环境课程收益    学会Ubuntu中安装jdk.mysql.maven和id ...

  3. 虹软人脸识别——官方 Qt Demo 移植到 Linux

    一.前言 最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK.之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果.打开 Li ...

  4. 505. The Maze II

    原题链接:https://leetcode.com/articles/the-maze-ii/ 我的思路 在做完了第一道迷宫问题 http://www.cnblogs.com/optor/p/8533 ...

  5. JavaWeb网上图书商城完整项目--验证码

    1.首先需要集成下面的jar 2.在web.xml配置验证码的servlet <?xml version="1.0" encoding="UTF-8"?& ...

  6. 【面试篇】寒冬求职之你必须要懂的Web安全

    https://segmentfault.com/a/1190000019158228 随着互联网的发展,各种Web应用变得越来越复杂,满足了用户的各种需求的同时,各种网络安全问题也接踵而至.作为前端 ...

  7. ECSHOP后台左侧添加菜单栏

    比如我们在后台中增加 “活动管理”功能,方法如下 在ECSHOP 管理中心共用语言文件 language\zh_cn\admin\commn.php ,添加我们的自定义菜单: $_LANG['17_a ...

  8. mac Pycharm 导入jieba报错解决

    背景 新买的mac 用的还不是太熟,在用jieba做分词的时候,pycharm import说是没有安装,那我就直接点击安装呗,结果失败,说是当前渠道不能识别,ok,那我就开始一步一步来解决了. 正文 ...

  9. List<List<Object>> list = new ArrayList<List<Object>>(); 求回答补充问题 list.get(position).add(Object);为什么会报错啊我想在对应的list里面添加对象

    public static void main(String[] args){ List<List<Object>> list = new ArrayList<List& ...

  10. Java多线程可重入锁例子解析

    “可重入锁”的概念是:自己可以再次获得自己的内部锁.比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁. cla ...