本文作者:念宗

利用dockerfile构建自己的镜像

念宗 6年前 ( 2019-01-03 ) 4862 抢沙发
摘要: 通过写Dockerfile自动构建镜像,代替手动命令。首先文件就叫Dockerfile,第一个字母必须大写。介绍Dockerfile常见的一些指令:FROM centos...

通过写Dockerfile自动构建镜像,代替手动命令。

首先文件就叫Dockerfile,第一个字母必须大写。

介绍Dockerfile常见的一些指令:

FROM centos    父镜像/基础镜像是谁
MAINTAINER nianzong unixchina@126.com 维护者信息
# COMMANDS

# RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y iputils iproute wget vim procps-ng htop sysstat nfs-utils lrzsz rsync net-tools traceroute curl dstat openssh-clients openssh-server

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" -q
RUN yum install -y nginx
ADD 从宿主机拷贝文件到镜像[支持tgz自动解压拷贝]
COPY 仅支持拷贝文件,不支持解压
EXPOSE 22 80 443 暴露的端口
CMD 启动容器执行的指令.支持shell和exec两种格式,SHELL格式:CMD "nginx"    EXEC格式:CMD ["nginx"]  推荐EXEC格式
ENTRYPOINT    真正用来指定容器运行的指令和参数,也可以是指令内容的全部;docker run 中命令部分的内容都会作为一个字符串传给ENTRYPOINT
ENV MYDIR /mydir 构建镜像过程中可以使用临时变量
WORKDIR /root/appdir 相当于cd


这里要单独提一下CMD指令,它表示容器默认执行的指令,就是docker run的时候不指定要执行的指令就会执行CMD定义的内容,如果docker run命令指定了执行的指令,则会覆盖CMD的内容。

The main purpose of a CMD is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an ENTRYPOINT instruction as well.


注意:
    1. CMD 如果要以EXEC前台方式启动带参数的命令,参数与命令都独立作为列表中的元素;["/usr/sbin/sshd", "-D"]
    2. 通过Dockerfile构建好的镜像,创建的容器默认要启动CMD后面的命令,docker run后面不要带命令内容,即[COMMAND]留空即可
docker build -t mynginx:v1 /path/to/Dockfile_Dir   Dockfile的目录

以构建一个默认开启sshd服务的基础镜像为例:

# install yum repo: epel 
# install rpm packages: 
# enable sshd service
# 默认使用的基础镜像为centos:latest,不建议使用这么新的版本.可以使用上一个稳定版本如7.4,亦或是centos6.8
FROM centos:7.4.1708
MAINTAINER nianzong unixchina@126.com
RUN yum install -y wget && wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
        wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN sed -i '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y openssh-clients openssh-server ssh-keygen iproute iputils wget vim procps-ng htop sysstat nfs-utils lrzsz rsync net-tools traceroute curl dstat
#RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN mkdir -p /root/.ssh/ && chmod 700 /root/.ssh/ && echo 'abcd1234' | passwd root --stdin
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" -q && \
    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" -q && \
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" -q
ADD authorized_keys /root/.ssh/authorized_keys
#RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#RUN yum clean all && yum makecache  # Dockerfile使用yum真的好卡...
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

构建镜像:

[root@node2 sshd-base]# docker build -t sshd-base:latest .

查看镜像和运行:

[root@node2 sshd-base]# docker images | grep sshd-base
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd-base           latest              4729bcdfafc6        28 minutes ago      479MB
[root@node2 sshd-base]# docker run -d --name sshd-base -P sshd-base
6b9395397d308364d1935f786f3bff0dea81c3c3abd522a9d66de821f5484b46
[root@node2 sshd-base]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS                                         NAMES
6b9395397d30        sshd-base           "/usr/sbin/sshd -D"     3 seconds ago       Up 2 seconds        0.0.0.0:32770->22/tcp                         sshd-base

CMD与 ENTRYPOINT的详细区别和用法会在另外一篇文章单独介绍


=========关于环境变量

在构建时如果将相关环境变量添加到/etc/profile,那么通过docker run进去默认是拿不到这个文件里的变量的,也就是没有加载/etc/profile.
可以在Dockerfile中通过ENV添加环境变量,但这是临时性的变量,非永久性的,所以基于此的子镜像都会覆盖这些变量.


文章版权及转载声明:

作者:念宗本文地址:http://pyops.net/?id=47发布于 6年前 ( 2019-01-03 )
文章转载或复制请以超链接形式并注明出处运维之道

分享到: 网站分享代码

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

验证码

评论列表 (暂无评论,4862人围观)参与讨论

还没有评论,来说两句吧...