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 .