定义
镜像是一种轻量级、可执行的独立软件包
作用
- 打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
- 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
-
编辑Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime WORKDIR /app EXPOSE 80 COPY . . ENTRYPOINT ["dotnet", "HunanZondy.Realestate.Register.Host.dll"]
-
执行构建
docker build -t hunanzondy.realestate .\HunanZondy.RealEstate\
-
构建的镜像指定多个 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
有时镜像拉取太慢,可以换成国内源,这样拉取速度更快。
- 编辑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"
}
}
}
- 重启docker,查看更改结果
docker info
说明
- centos7中daemon.json位置:/etc/docker/daemon.json
- 网易云 https://hub-mirror.c.163.com
- 百度云 https://mirror.baidubce.com
- DaoCloud http://f1361db2.m.daocloud.io
- 阿里云 https://ustc-edu-cn.mirror.aliyuncs.com
- Github https://ghcr.io
例7
前提
- 用
buildx
,要确保 Docker 版本不低于19.03
下载地址:https://github.com/docker/buildx/releases/latest
根据操作系统选择对应的二进制文件。
重命名二进制文件并将其复制到操作系统对应的目录
检测安装结果
docker buildx version
开启 binfmt_misc 来运行非本地架构的 Docker 镜像,使用的是 Mac 或者 Windows 版本 Docker 桌面版binfmt_misc 默认开启
其他平台需进行安装
docker run --privileged --rm tonistiigi/binfmt --install all
Docker 会使用默认构建器,是不支持多架构构建。需要创建新的支持多架构的构建器
docker buildx create --use --name mybuilder
准备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