Theme NexT works best with JavaScript enabled

Hexo-ytliangc

愿有岁月可回首,且以深情共白头

0%

Docker镜像Dockerfile学习总结

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

镜像的常用操作

  • 将本机的docker已有镜像导出成tar包
1
docker save -o ubuntu.tar ubuntu:18.04
  • 将本地的tar包镜像导入到本机的docker中
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

#### 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"]
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
ytlaingc 微信支付

微信支付

ytlaingc 支付宝

支付宝