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 .
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。