定义

镜像是一种轻量级、可执行的独立软件包

作用

  • 打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  • docker镜像就好比是一个模板,可以通过这个模板来创建容器服务
  • 通过一个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

使用

拉取镜像 例2
删除镜像 例3 例4
查看镜像 例1
构建镜像 构建指令 构建脚本 例5
构建多架构镜像 例7
更改镜像 例6
打包镜像 例8
推送 例9
  • Dockerfile 是一个用来构建镜像的文本文件

构建指令

指令 说明 格式 示例
FROM 以哪个镜像为基础开始构建,必须为第一个命令 FROM
  FROM :
  FROM @
FROM mysql:5.6
MAINTAINER 作者信息
RUN 运行一条命令
CMD docker run IMAGE_ID cmd这里的默认命令
ENTRYPOINT 配置容器启动后执行的命令
EXPOSE 声明会用到的端口
ENV 设置环境变量
ADD 从当前目录复制文件到容器. 会自动处理目录, 压缩包等情况
COPY 从当前目录复制文件到容器. 只是单纯地复制文件
VOLUME 声明一个数据卷, 可用于挂载
WORKDIR 容器启动时,执行的命令会在该目录下执行,相当于设置容器的工作目录
ONBUILD 前缀命令, 放在上面这些命令前面, 表示生成的镜像再次作为"基础镜像"被用于构建时, 要执行的命令.
USER RUN 命令执行时的用户.

构建脚本

powershell 构建脚本

$containerName='dbtool'
$imageName = $containerName
$remogeImageName = ('registry.cn-hangzhou.aliyuncs.com/xxxx/beta:'+$imageName)

# 自定义的dockerfile文件,会复制到上下文目录中去
$dockerfileSource = '.\DbTool.Dockerfile'

# 上下文目录,路径下的所有内容会打包上传给 Docker 引擎
$contextDir = '.\DbTool\'
$dockerfileDesPath = ($contextDir+'Dockerfile')
 
echo "删除容器..."
docker ps --format '{{ .ID }}\t{{.Image}}' |
Select-String -Pattern $containerName -CaseSensitive -SimpleMatch |
ForEach-Object{ 
	$value = $_.Line
    $value = $value.Split("`t")
    if($value[1] -eq $containerName)
    {
        echo "删除容器 $value ..."
        docker rm -f $value[0]
    }
}

echo "删除镜像..."
docker rmi $imageName

echo '复制 Dockerfile...'
Copy-Item -Path $dockerfileSource -Destination $dockerfileDesPath

echo '构建镜像...'
docker buildx build -t  $imageName --platform=linux/arm64 -o type=docker $contextDir

echo '运行容器...'
docker run -it --restart=always --name=$containerName -d  $imageName

echo "删除远程镜像 ..."
docker rmi $remogeImageName

echo '构建远程镜像 ...'
docker tag $imageName  $remogeImageName

echo '推送远程镜像 ...'
docker push $remogeImageName

pause

例1

查看已经下载的镜像

docker images

例2

拉取镜像

docker pull mysql

例3

删除所有镜像

docker rmi -f $(docker images -aq)

例4

指定id删除镜像

docker rmi -f c60d96bd2b77

例5

  1. 编辑Dockerfile

    FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
    WORKDIR /app
    EXPOSE 80
    COPY . .
    ENTRYPOINT ["dotnet", "HunanZondy.Realestate.Register.Host.dll"]
    
  2. 执行构建

    docker build -t hunanzondy.realestate .\HunanZondy.RealEstate\
    
  3. 构建的镜像指定多个 tag

    docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest 
    
–platform linux/arm64,linux/amd64 当指定多个架构时,只能使用 --push 推送到远程仓库,无法 --load,推送成功后再通过 docker pull --platform 来拉取指定架构的镜像
–file -f 指定dockerfile文件,不指定的话,默认会读取上下文路径( . )下的 dockerfile
–tag -t 指定构建的镜像名和 tag

例6

有时镜像拉取太慢,可以换成国内源,这样拉取速度更快。

  1. 编辑daemon.json文件的registry-mirrors项
{
  "registry-mirrors": [
    "https://mirror.baidubce.com",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  }
}
  1. 重启docker,查看更改结果
docker info

说明

例7

前提

  • buildx,要确保 Docker 版本不低于 19.03
  1. 安装buildx

下载地址:https://github.com/docker/buildx/releases/latest
根据操作系统选择对应的二进制文件。

重命名二进制文件并将其复制到操作系统对应的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygVjoFO1-1650261374881)()]

检测安装结果

docker buildx version
  1. 开启 binfmt_misc

开启 binfmt_misc 来运行非本地架构的 Docker 镜像,使用的是 Mac 或者 Windows 版本 Docker 桌面版binfmt_misc 默认开启

其他平台需进行安装

docker run --privileged --rm tonistiigi/binfmt --install all
  1. 切换构建器

Docker 会使用默认构建器,是不支持多架构构建。需要创建新的支持多架构的构建器

docker buildx create --use --name mybuilder
  1. 构建镜像

准备Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "HunanZondy.Realestate.Register.Host.dll"]

执行构建指令

docker buildx build -t <image-name> --platform=linux/arm64 -o type=docker .
  • 这个 . 是在指定上下文的目录,docker build 命令得知这个路径后,会将路径下的所有内容打包上传给 Docker 引擎。Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

例8

将容器做了很多自定义修改后,需要打包成一个镜像方便下次使用

# 将e8acc861cc50容器做成名为fastreport.aspnetcore的镜像
docker commit e8acc861cc50 fastreport.aspnetcore
# 保存为tar归档文件
docker save -o fastreport.aspnetcore.tar fastreport.aspnetcore

使用的时候加载tar文件

docker load -i fastreport.aspnetcore.tar
# 查看是否加载成功
docker images | grep fastreport.aspnetcore

例9

echo "删除镜像 Realestate..."
docker rmi registry.cn-hangzhou.aliyuncs.com/xxx/beta:hunanzondy.realestate

echo '构建镜像 Realestate...'
docker tag hunanzondy.realestate registry.cn-hangzhou.aliyuncs.com/xxx/beta:hunanzondy.realestate

echo '推送镜像 Realestate...'
docker push registry.cn-hangzhou.aliyuncs.com/xxx/beta:hunanzondy.realestate

我用的书:《第一本Docker书》
https://gitee.com/sheng_wei_zhang/auto_upload_video_to_jinritoutiao