「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」。
通常我们构建一个 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 进程:
到此,成功!