Docker-11-Dockerfile

427 阅读2分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」。

通常我们构建一个 applicationimage 需要进行基础镜像选择、目录创建、软件的安装、服务的部署、卷挂载、端口暴露、定义环境变量等一系列的操作才能完成。为了解决这个问题,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 的参数。
ENTRYPOINTCMD 都存在的时候,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

查询IP

SSH 连接测试:

SSH连接测试

查看容器中 SSH 进程:

查看容器中SSH进程

到此,成功!