Docker镜像Dockerfile学习总结

一、镜像的常用操作

  • 将本机的docker已有镜像导出成tar包
docker save -o ubuntu.tar ubuntu:18.04
  • 将本地的tar包镜像导入到本机的docker中
docker load -i ubuntu.tar

二、使用commit构建镜像

不推荐使用:效率低,可重复性差,不清楚镜像如何创建出来的,无法审计,存在安全风险

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 复制内容到镜像,目标路径不存在时会自动创建

FROM用法

ARG VERSION=buster-slim
FROM debian:$VERSION

RUN用法

RUN apt-get update \
    && apt-get install -y net-tools unzip vim zip curl git wget apt-utils \
    && rm -rf /var/lib/apt/lists/*

CMD用法

CMD ["executable","param1","param2"]

使用Alpine更换阿里云源下载软件

RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main" >/etc/apk/repositories
RUN apk add --no-cache add <PackageName>

四、多阶段构建

对于一些需要编译的应用,需要编译环境镜像和运行环境镜像,以Go语言为例

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,若不需要无密码登录,需设置密码使用密码登录

cat ~/.ssh/id_rsa.pub > authorized_keys

以下是Dockerfile内容

FROM ubuntu:18.04

ENV APT_CONFIG_PATH=/etc/apt/sources.list

#### add labuser change apt-get source to aliyun
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"]

你可能感兴趣的:(docker)