通常我们构建一个 application
的 image
需要进行基础镜像选择、目录创建、软件的安装、服务的部署、卷挂载、端口暴露、定义环境变量等一系列的操作才能完成。为了解决这个问题,Dockerfile
出现了,它是一个镜像的具体描述,或者说是镜像的具体构建步骤模板。
Dockerfile 的主要组成部分
FROM alpine:latest ---指定基础镜像的信息 RUN apt-get install golang-go ---定义镜像构建的步骤 CMD ["/bin/sh"] ---指定容器启动时命令 复制代码
Dockerfile 的常用指令
FROM ---指定基础镜像 MAINTAINER ---指定维护者信息,可以没有 RUN ---容器内执行shell命令 ADD ---COPY文件,会自动解压 COPY ---COPY文件 WORKDIR ---设置当前工作目录 VOLUME ---设置卷,挂载主机目录 EXPOSE ---指定对外的端口 CMD ---指定容器启动后的要执行的命令 ENV ---定义环境变量 ENTRYPOINT ---容器启动后执行额的命令 复制代码
Dockerfile 的 CMD 和 ENTRYPOINT 的区别
当只有 CMD
的时候,即执行 CMD
的命令;如果启动容器的时候加了命令,则会替代 CMD
的命令。
当只有 ENTRYPOINT
的时候,可以执行 ENTRYPOINT
的命令,如果启动容器的时候加了参数(在命令的位置),则启动的参数会作为 ENTRYPOINT
的参数。
当 ENTRYPOINT
和 CMD
都存在的时候,CMD
的内容会作为 ENTRYPOINT
的参数,如果启动容器的时候加了参数 X
,则 X
会替代 CMD
的内容作为 ENTRYPOINT
的参数。
举个例子
给 alpine
镜像安装 ssh
软件并且实现 ssh
远程连接。
当前路径下的文件 location:/home/phyger/dockerfile
网络异常,图片无法展示
|
Dockerfile 内容
FROM alpine:latest MAINTAINER phyger # 复制时区文件 COPY Shanghai /etc/localtime # 更新镜像源,安装openssh,生成秘钥,修改root用户密码 RUN echo "http://mirrors.ustc.edu.cn/alpine/v3.5/main" > /etc/apk/repositories && \ echo "http://mirrors.ustc.edu.cn/alpine/v3.5/community" >> /etc/apk/repositories && \ apk --update add --no-cache && \ apk add --no-cache openssh && \ sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \ ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \ ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \ ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key && \ ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key && \ echo "root:admin" | chpasswd # 暴露22端口 EXPOSE 22 # 命令参数 CMD ["-D"] # 指定容器启动的命令 ENTRYPOINT ["/usr/sbin/sshd"] 复制代码
构建镜像
网络异常,图片无法展示
|
镜像使用
启动容器:
网络异常,图片无法展示
|
查询 IP
:
网络异常,图片无法展示
|
SSH
连接测试:
网络异常,图片无法展示
|
查看容器中 SSH
进程:
网络异常,图片无法展示
|
到此,成功!