Docker容器基础

Docker 对象

  • 镜像
    镜像可以看做是一个根文件系统,包含了操作系统,应用程序所需要的库资源等
  • 容器,
    在镜像的基础上,加入可读可写层。在容器的所有操作都会写入到最上层的可读可写层,每次删除容器最上层的读写层就会被删掉,所以这期间写入得数据也一并删掉了。如果想深入了解容器的分层原理可以学习下联合文件系统。

docker event state

1_vca4e-SjpzSL5H401p4LCg.png

Dockerfile 用法

Dockerfile 是构建镜像的源代码
docker可以自动化的生成镜像通过dockerfile,dockerfile是一个文本文件包含了用户创建镜像需要的所有指令。

常用指令

FROM
  • FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。
COPY 复制

格式:

  • COPY [--chown=<user>:<group>] <源路径>... <目标路径>
  • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY a* /mydir/
COPY a?.txt /mydir/

目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。

ADD 复制
  • ADD相比于COPY支持tar文件和url路径。
  • tar 是本地文件,将自动展开为目录,类似于解压,如果是url的tar文件则不自动解压
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
  • ADD 将文件从路径 <src> 复制添加到容器内部路径 <dest>,dest必须写成dest/。
小结

COPY和ADD 复制目录时有些特殊,对于目录而言:只复制目录中的内容而不包含目录自身

ADD go /usr/local/      仅仅复制了go目录里的内容没有复制目录
ADD go /usr/local/go/    复制go目录

官方建议:如果需要解压则用ADD,否则用COPY

WORKDIR

可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。

ENV

定义容器的环境变量
格式有两种:

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>...
ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

在dockerfile 可以通过$变量 调用

RUN

docker build创建镜像时执行一些指令
RUN <command> 由shell启动,Linux默认为/bin/sh -c, id为1的进程为bin shell,子进程为command

RUN yum install -y wget &&\
         mkdir /app

RUN 会增加中间层镜像,考虑到镜像的大小尽量把所以有命令写入到一个RUN命令下

CMD

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]

Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

CMD /tools/start.sh

命令会自动解释成

CMD [ "sh", "-c", "/tools/start.sh" ]

ENTRYPOINT

  • ENTRYPOINT的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
  • 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
  • ENTRYPOINT指令和CMD指令虽然是在Dockerfile中定义,但是在构建镜像的时候并不会被执行,只有在执行docker run命令启动容器时才会起作用。

  • ENTRYPOINT 使用场景:
    docker run 启动容器时可以指定参数,指定的参数会作为entrypoint命令的参数,而不会覆盖启动命令。

docker 常见命令

  • 从当前目录的dockerfile创建容器
    docker build -t tagName .

  • 指定dockerfile 创建容器
    docker build -f path .

  • 删除全部容器
    docker rm $(docker ps -aq)

  • 删除所有镜像
    docker rmi $(docker images -q)

  • 停止运行中的容器
    docker stop $(docker ps -q)

  • 启动一个bash终端,退出自动删除容器
    docker run --rm -it imageID /bin/bash

  • 当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
    检查本地是否存在指定的镜像,不存在就从公有仓库下载
    利用镜像创建并启动一个容器,分配一个文件系统,并在只读的镜像层外面挂载一层可读写层从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    从地址池配置一个 ip 地址给容器,执行用户指定的应用程序
    执行完毕后容器被终止

  • 更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现

  • 启动已终止的容器
    docker container start

  • 进入容器
    docker exec -it containerID bash
    如果从这个 stdin 中 exit,不会导致容器的停止。这就是为什么推荐大家使用 docker exec 的原因. 而不是attach

docker-compose 编排容器

docker compose 用于在单机上编排容器,便于管理多个容器。

version: '3'
services:
   web:
    image: "ubuntu"
  debian:
    image: "debian"

上面例子是一个简单的compose.yml文件,web和debian代表了连个容器,image代表镜像。
-docker-compose up -d 会在后台创建容器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容

  • 观其大纲 第一篇 容器技术与Docker概念1认识容器技术2 Docker基本概念3 安装和测试Docker第二...
    周少言阅读 5,441评论 2 87
  • 个人专题目录[https://www.jianshu.com/p/140e2a59db2c] Docker简介 1...
    Java及SpringBoot阅读 724评论 0 9
  • (一) 神说,应该给聪明的人讲道理,因为他们懂得思辨;给愚钝的人讲故事,因为他们能受启发;还有一类人,既不能讲道理...
    萧淮江阅读 437评论 0 0
  • 早课收获:今天学习困卦第二讲。 1,泽水困卦,上卦为泽,下卦为水,表示不干枯了,困难的象。有困才能施展才华,所以困...
    梦中醒来_df30阅读 410评论 0 0
  • 简瑶又一次睡醒了过来,睡眼惺惺地她微微睁开眼入眼的还是这栋古色古香的屋子,她起了身。 一只毛发雪白的猫从软塌上跳了...
    凡大仙阅读 2,770评论 43 61