Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
镜像的常用操作
1 docker save -o ubuntu.tar ubuntu:18.04
1 docker load -i ubuntu.tar
使用commit构建镜像 不推荐使用:效率低,可重复性差,不清楚镜像如何创建出来的,无法审计,存在安全风险
1 2 3 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] $ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
-a 提交的镜像作者;
-c 使用Dockerfile指令来创建镜像;
-m 提交时的说明文字;
-p 在commit时,将容器暂停。
Dockerfile指令说明
指令
说明
ARG
定义镜像创建过程中的变量
FROM
指定创建镜像的基础镜像
LABEL
为生产的镜像添加元数据标签信息
EXPOSE
镜像内服务监听的端口
ENV
指定环境变量
ENTRYPOINT
指定镜像默认的入口命令
VOLUME
创建一个数据卷挂载点
USER
指定运行容器的用户名和UID
WORKDIR
切换工作目录
RUN
运行指定命令,如安装一些软件
CMD
启动容器时指定默认执行的命令
ADD
添加压缩文件到镜像,常用于将压缩包添并解压至指定目录
COPY
复制内容到镜像,目标路径不存在时会自动创建
注意 :expose
指令是声明运行时容器提供服务端口, 这只是一个声明, 在运行时并不会因为这个声明应用就会开启这个端口的服务
FROM用法
1 2 3 4 ARG VERSION=9.3 FROM debian:$VERSION FROM scratch #从空白镜像开始
RUN用法
1 2 3 RUN apt-get update \ && apt-get install -y net-tools unzip vim zip curl git wget apt-utils \ && rm -rf /var/lib/apt/lists/*
COPY用法
1 2 3 4 5 # 格式 COPY <源路径>... <目标路径> COPY ["<源路径1>",... "<目标路径>"] COPY package.json /usr/src/app/ #可以匹配通配符
CMD用法
1 CMD ["executable","param1","param2"]
使用Alpine更换阿里云源下载软件
1 2 RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main" >/etc/apk/repositories RUN apk add --no-cache add <PackageName>
多阶段构建 对于一些需要编译的应用,需要编译环境镜像和运行环境镜像,以Go语言为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 1、创建相关目录 $ mkdir dockerfile-go && cd dockerfile-go/ 2、编写go程序 $ cat main.go package main import ( "fmt" ) func main() { fmt.Println("Hello,Docker") } 3、编写Dcoekrfile $ cat Dockerfile # define stage name as builder FROM golang:alpine as builder RUN mkdir -p /go/src/test WORKDIR /go/src/test COPY main.go . RUN CGO_ENABLED=0 GOOS=linux go build -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ # copy file from the builder stage COPY --from=builder /go/src/test/app . CMD ["./app"] 4、构建镜像 $ docker build -t test -multistage:latest . $ docker images | grep test -multistage test-multistage latest 60410880baa0 56 seconds ago 8.15MB
给Ubuntu镜像添加ssh服务 提前准备authorized_keys
,若不需要无密码登录,需设置密码使用密码登录
1 cat ~/.ssh/id_rsa.pub > authorized_keys
以下是Dockerfile内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 FROM ubuntu:18.04 ENV APT_CONFIG_PATH=/etc/apt/sources.list # RUN mv "${APT_CONFIG_PATH}" "${APT_CONFIG_PATH}".bak \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted" > "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic universe" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates universe" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic multiverse" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates multiverse" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security universe" >> "${APT_CONFIG_PATH}" \ && echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security multiverse" >> "${APT_CONFIG_PATH}" # 安装ssh服务 RUN apt-get update \ && apt-get install -y openssh-server \ && mkdir -p /var/run/sshd \ && mkdir -p /root/.ssh \ && rm -rf /var/lib/apt/lists/* # 取消pam限制 RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd # 复制配置文件到对应的位置,并赋予脚本可执行权限 ADD authorized_keys /root/.ssh/authorized_keys # 开放端口 EXPOSE 22 # 设置自启动命令 CMD ["/usr/sbin/sshd","-D"]