摘要:
通过写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添加环境变量,但这是临时性的变量,非永久性的,所以基于此的子镜像都会覆盖这些变量.
还没有评论,来说两句吧...