docker学习笔记-制作镜像的方式之一-dockerfile (十一)

docker 镜像:包括完整的操作系统和文件目录,只要在沙盒(使用Cgroups和Namespace机制创建出来的隔离环境)中解压镜像文件,就可以很方便的在开发和测试环境运行程序。

制作镜像的方式之一-dockerfile

1.1、镜像文件:

FROM指令:指定继承哪个镜像
ADD:将工作目录下的某个目录或者文件copy到镜像的某个路径下
RUN:执行shell命令
ENTRYPOINT:指定容器启动脚本
ENV:指定容器启动时的环境变量(注意,只有在容器启动时,启动脚本才能读到,如果希望其他用户登录到容器也生效的话,需要写入.bashrc)
USER:容器启动时使用的用户
WORKDIR:容器启动时的工作目录

1.2、制作镜像步骤:

1、通过FROM指令使用基础镜像启动一个临时容器                       FROM
2、在临时容器中根据dockerfile中的指令安装软件或者其它变更    RUN,ADD,ENV
3、使用docker commit 命令将临时容器commit成一个新的镜像     COMMIT
4、删除临时容器,给新镜像用docker tag命令进行命名                 收尾

1.3、制作镜像命令:

docker bulid -t 镜像名称:tag [工作目录]

1.4、run.sh文件

#! /bin/bash
env
while true
do
  sleep 10
done

使用场景:
跑批任务,不需要加死循环
在线服务,需要加死循环
原因:
进程id是1的进程是所有进程的父进程,是不能退出的,否则,运行完,会退出容器。

[root@06849e042623 ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  11688  1352 ?        Ss   07:16   0:00 /bin/bash /root/run.sh
root         8  0.0  0.0  11828  1896 ?        Ss   07:16   0:00 bash
root        32  0.0  0.0   4364   356 ?        S    07:17   0:00 sleep 10
root        34  0.0  0.0  51752  1700 ?        R+   07:17   0:00 ps aux

1.5、dockerfile文件
1.5.1、新建一个Dockerfile
Dockerfile文件

FROM  centos:7
USER root
ADD run.sh  /root/
RUN echo "helloworld" >> /root/hello.log
ENTRYPOINT ["/root/run.sh"]

1.5.2、 如果当前目录下没有run.sh文件,将run.sh复制到当前目录下

cp ../run.sh  .     

制作镜像

docker bulid -t lzcentos:1.1  

查看镜像制作的步骤

[root@k8s-master dockerfile]# chmod 777 run.sh
[root@k8s-master dockerfile]# docker build -t lzcentos:1.1  .
Sending build context to Docker daemon 3.072 kB
Step 1/5 : FROM centos:7
##指定继承centos镜像
 ---> 5e35e350aded
Step 2/5 : USER root
##启动容器时使用root用户
 ---> Using cache
 ---> cfff0f0928b0
Step 3/5 : ADD run.sh /root/
 ---> 2ffe5aa32be9
Removing intermediate container 9ef91b8aebd7
##将工作目录下的某个路径或者文件copy到镜像的某个路径下
Step 4/5 : RUN echo "helloworld" >> /root/hello.log
 ---> Running in afd22bb65494
 ---> 853d09748f3c
Removing intermediate container afd22bb65494
##执行shell命令
Step 5/5 : ENTRYPOINT /root/run.sh
##指定启动容器时的脚本
 ---> Running in 65d2cf03a0a5
 ---> 6aefc7ff9d6b
Removing intermediate container 65d2cf03a0a5
Successfully built 6aefc7ff9d6b

进入容器对应目录下,查看日志

[root@k8s-master ~]# docker exec -it lzcentos bash
[root@2142484c37f6 /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@2142484c37f6 /]# cd  ~
[root@2142484c37f6 ~]# ls
anaconda-ks.cfg  hello.log  run.sh
[root@2142484c37f6 ~]# 
[root@2142484c37f6 ~]# cat hello.log
helloworld

1.5.3、启动脚本中增加env,可打印日志查看环境变量
Dockerfile

FROM  centos:7
USER root
ADD run.sh  /root/
ENV DOCKER_HOME=/var/lib/docker
RUN echo "helloworld" >> /root/hello.log
ENTRYPOINT ["/root/run.sh"]
~                                     

run.sh

#! /bin/bash
env
while true
do
  sleep 10
done
~    

构建镜像

docker build -t lzcentos:1.2 .

启动容器

docker run -d  --name lzcentos lzcentos:1.2

查看日志-容器id

[root@k8s-master dockerfile]# docker logs -f b361030be614
HOSTNAME=b361030be614
DOCKER_HOME=/var/lib/docker
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
_=/usr/bin/env

1.5.4、通过ssh协议登录容器,环境变量生效-需要增加.bashrc

FROM  centos:7

USER root

ADD run.sh  /root/

ENV DOCKER_HOME=/var/lib/docker

RUN echo "helloworld" >> /root/hello.log\
    && echo "export DOCKER_HOME=/var/lib/docker" >> /root/.bashrc

ENTRYPOINT ["/root/run.sh"]

查看宿主机的.bashrc

[root@k8s-master dockerfile]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

1.5.5、修改工作目录

FROM  centos:7

USER root

ADD run.sh  /root/

ENV DOCKER_HOME=/var/lib/docker

RUN echo "helloworld" >> /root/hello.log\
    && echo "export DOCKER_HOME=/var/lib/docker" >> /root/.bashrc
RUN mkdir -p /root/workdir
WORKDIR /root/workdir

ENTRYPOINT ["/root/run.sh"]

查看工作目录

[root@k8s-master dockerfile]# docker exec -it lzcentos bash
[root@73f7dcc14804 workdir]# pwd
/root/workdir

1.6、dockerfile编写风格
1个run指令 拼接
多个run指令 并行执行
1.7、docker bulid -t -f 指定dockerfile的路径 如果不指定 会找工作目录下的文件

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