镜像(image):包含项目运行程序和所需环境的全部文件,为只读文件。
容器(container):在只读的镜像文件之外添加一个写入层,让原本只读的镜像可以与宿主机之间进行数据交互,实现可读可写。
仓库(depository):储存镜像文件的仓库,有官方镜像仓库、腾讯云或阿里云镜像仓库、或自己搭建的仓库。
标签(tag):在 docker 语境下,tag 用来标记镜像文件的版本号或发行标记,tag 的值可以是纯版本号,也可以是其他字符串。
标签(label):在 docker 语境下,label 用来给镜像文件添加一些描述性信息,在构建 镜像文件时 通过 LABEL 来定义。
镜像ID:安装某镜像时,给该镜像添加的唯一标识符 ID,是一个 12 位的哈希码。
镜像名:镜像默认的名字
镜像别名:为某镜像文件添加一个新的引用名称,所以称为镜像别名。注意只是新增一个引用名,并不是真实复制拷贝一份。
一个已安装的镜像 只有一个镜像ID,但是可以有多个镜像别名
查看 docker 支持的命令:docker
查看 docker 信息:docker info
查看 docker 当前版本:docker version
启动 docker :systemctl start docker
docker 启动项目:docker run xxx
查看帮助:docker --help
查看 某操作 的帮助:docker xxx -help 例如查看 run 相关帮助 docker run --help、docker logs --help、docker ps --help
查看 logs 帮助:docker logs --help
查看容器日志:docker logs containerxxx
注意:此时能够打印出截至当前的 logs,若执行该命令后又新产生的 logs 是不会打印出来的 为了能够实时打印出 logs,需要添加参数 -f,即:docker logs -f containerxxx
Linux系统,docker 配置文件路径为:/etc/docker/daemon.json
Windows10,docker 桌面版配置文件路径为:c:\users\your-username\.docker\daemon.json
也可以通过点击系统右下角 docker 图标,右键 > settings > docker engine > 右侧内容里修改
每次修改配置文件,一定要重启 docker 才会生效
使用腾讯云或阿里云的 DockerHub 加速器,可以快速拉取 DockerHub 平台上的容器镜像。
Linux系统内,配置步骤如下:
第1步:创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
# 腾讯云的 DockerHub加速 只针对在腾讯云服务器上使用,外网无法使用
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
# 阿里云的 DockerHub加速 可以针对外网使用
# 阿里云的 DockerHub 需要使用自己的阿里云账户登录,待系统给你分配专属的加速地址
# 本示例中使用到的 https://e3je0x5v.mirror.aliyuncs.com 是阿里云分配给我的
{
"registry-mirrors": ["https://e3je0x5v.mirror.aliyuncs.com"]
}
默认安装 docker 之后,/etc/docker/daemon.json 文件并不存在,需要自己创建
第2步:重新加载 守护进程 配置文件
systemctl daemon-reload
第3步:重启 docker 服务
systemctl restart docker
第4步:验证是否配置生效
docker info
若在打印输出的信息中,找到以下信息即表明配置已生效。
Registry Mirrors:
https://mirror.ccs.tencentyun.com
Windows10 Docker 桌面版配置方式:
第1步:windows 系统右下角 docker 图标,点击右键,在出现的菜单中点击 Settings。
第2步:在设置面板左侧中,点击 Docker Engine,在右侧文本内容中,将加速地址 "https://e3je0x5v.mirror.aliyuncs.com" 填入到 registry-mirrors 中。
由于腾讯云 DockerHub 不支持外网,所以只能使用 阿里云 DockerHub 加速器
第3步:点击 Apply & Restart,应用并重启 Docker 服务。
第4步:验证是否配置生效
docker info
若在打印输出的信息中,找到以下信息即表明配置已生效。
Registry Mirrors:
https://e3je0x5v.mirror.aliyuncs.com
创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
{
"dns" : ["118.118.118.118","8.8.8.8"]
}
dns 的值为一个数组,可以设置多条 IP地址 修改 daemon.json 文件后,需要重启 dokcer 才可生效。
某个容器若想不使用全局DNS,而是指定DNS,可在启动容器时,增加 --dns=118.118.118.118 来实现。
创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
{
"data-root": "/docker"
}
修改 daemon.json 文件后,需要重启 dokcer 才可生效。
特别提醒:以下操作仅仅是修改了 Window10 Docker 虚拟机(WSL 2 ) 里静态文件的存放位置,并不是真正 Win10 本地文件系统中的位置。
第1步:windows 系统右下角 docker 图标,点击右键,在出现的菜单中点击 Settings。
第2步:在设置面板左侧中,点击 Docker Engine,在右侧文本内容中,添加参数:
{
"data-root": "/docker"
}
第3步:点击 Apply & Restart,应用并重启 Docker 服务。
以下才是真正 win10下 配置迁移虚拟目录的方法
补充说明:Win10 中虚拟机采用 WSL 2版本,虚拟机文件系统由 WSL 2 管理,因此想更换 docker 的默认镜像文件存放目录,应该通过 WSL 命令来操作。
默认 docker 虚拟机文件存放位置为:C:\Users\your-user-name\AppData\Local\Docker\wsl\data\ext4.vhdx
假设现在我们希望将 docker 默认在 c盘 的虚拟文件存放目录修改到 d:\docker-data\
,操作步骤如下:
第1步:在终端执行以下命令,查看并确认 本机 docker 使用的是 WSL 2
wsl -l -v
在终端会打印出:
C:\WINDOWS\system32>wsl -l -v
NAME STATE VERSION
* docker-desktop Running 2
docker-desktop-data Running 2
在输出信息中,STATE显示 docker 当前运行状态、LVERSION 为 2 (即 WSL 2)。
docker-desktop 为我们安装的 docker 桌面版软件,由于软件文件体积并不大,因此无需移动 docker-desktop。 我们此次重点,只需要移动 docker-desktop-data,这个才是 win10 下 docker 的虚拟文件目录,docker pull 下载的镜像文件都存放在这个虚拟目录里,为了避免以后 C盘空间被占满,所以才需要将该虚拟目录移动到其他盘。
第2步:关闭 docker 桌面版,或者通过 wsl 关闭
wsl --shutdown
第3步:通过 wsl --export 将原有虚拟目录中的数据,压缩并导出到目标目录中
wsl --export docker-desktop-data d:\docker-data\docker-data.tar
d:\docker-data:本次迁移到的目录,实际操作中,你可以将该目录命名成你喜欢的名字,但是切记目录名不要出现中文 docker-data.tar:该压缩文件名字你也可以使用其他名字,该文件在后面导入过程中会使用到
第4步:注销原有虚拟文件目录
wsl --unregister docker-desktop-data
终端会打印出:正在注销...,并执行完成
第5步:创建新的虚拟文件目录,并导入原有虚拟目录中的数据(第3步中创建的那个压缩文件),并设定 WSL 的版本
wsl --import docker-desktop-data d:\docker-data d:\docker-data\docker-data.tar ---version 2
docker-desktop-data:虚拟目录名字 d:\docker-data:虚拟目录在 Windows 文件中真实路径 d:\docker-data\docker-data.tar:原有虚拟目录中的数据 --version 2:使用 WSL 2版本
上述命令执行完毕后,本机打开 d:\doker-data,查看是否存在 ext4.vhdx,若存在即证明迁移成功 。
至此,虚拟目录迁移完成,以后 docker 下载的镜像文件都将存放在这个目录中的 ext4.vhdx 中。
默认的虚拟目录对应的文件 C:\Users\your-user-name\AppData\Local\Docker\wsl\data\ext4.vhdx
将不存在。
第6步:将之前创建的 d:\docker-data\docker-data.tar 文件删除 (直接用文件夹形式打开目录,找到 .tar 删除即可)
事实上,如果觉得有必要,以后也可以通过 wsl --export docker-desktop-data 来导出并备份 docker 虚拟文件系统
第7步:重启 docker
Dockerfile 是一个文本文档,用来存放构建镜像文件过程的全部指令。
Dockerfile 中定义的 “上下文” 指:本地文件路径(file path) 或 Git仓库路径(git url)
dockerfile 是用来描述如何去构建镜像文件。
dockerfile 文件遵循以下原则:
- dockerfile 通常存放在项目输出根目录下
- dockerfile 文件名建议命名为:dockerfile,因为 windows 下文件名是不区分大小写,但是 Linux 下是区分大小写的,为了兼容所以文件名建议都用小写字母
- dockerfile 不需要文件后缀名,内容遵循 yml 格式
- dockerfile 虽然内容格式不区分大小写,但是通常建议将 命令 使用全大写,以方便和参数进行区分
- dockerfile 每一行开头无论有多少个空格都会被忽略,都不影响该行的命令效果
- dockerfile 结尾处可以换行,但不会忽略换行前面的空格
- dockerfile 必须以 FROM 参数为开端,FROM 参数之前只允许出现 注释 或者 ARG(声明给 FROM 使用的变量)
通过 # 来定义注释。dockerfile 内容中,使用 # 开头表示该行为注释,注释不允许换行,注释里的内容不会出现在构建过程中
通过 特殊注释形式,即 使用 # 来定义解析器指令。
解析器指令(可选项),用来告知 Docker 在使用(解析) dockerfile 文件时 一些解析规则。
以特殊注释形式出现,遵循以下原则:
- 格式为 # keywordxxx=valuexxx ,Docker 会尝试解析 # 开头的注释,看是否符合 解析器格式,如果符合则把该行 注释内容当做解析器来执行
- 分析器指令只能出现在 dockerfile 的第1行中
- 只能出现1次(遵循 dockerfile 中 # 注释原则)
- 如果把注释写在 FROM 之后,则会忽略该分析器指令
- 一旦一个注释、空行、构建指令已开始执行,解析器指令就会失效,仅当做普通注释
- 不允许换行,允许开头、中间、结尾出现空格,这些空格都会被忽略掉
在 dockerfile 中默认转义符为反斜杠 \,若想修改转义符为反引号 ` ,可通过解析器指令修改:
# escape=`
由于默认的 \ 表示可以转义,如果用在命令行尾部,表示 换行连接符,实际构建过程中,会将下一行内容合并到本行。
什么情况下需要将 默认的 转义符 \ 修改为 ` ?
由于 \ 会转义,那么如果在 windows 系统上写路径时需要格外小心,因为路径中的 \ 很可能与预期执行的不一致。如果把 转义符修改为 `,那么此时 \ 就被解释为普通的字符,\ 不在具有转义功能,更加利于 windows 系统路径上的使用。
通过 ENV 来设置环境变量,内容采用 键值对 形式,其他命令行中可以使用
定义形式有2种:
形式 | 示例 | 说明 |
---|---|---|
ENV <key> <value> | ENV key value1 value2 | key为变量名,key 空格之后 所有的其他值都将成为 key 的值, 因此后面的值可以有空格、反斜杠等其他字符 |
ENV <key>=<value> ... | ENV key1=“value1” key2=value2 | 允许设置多个变量,采用值键对形式(有2种形式 加引号或不加引号),以空格进行间隔。 value1采用了双引号包裹字符串,value2没有使用双引号, value2中可以使用 反斜杠来进行字符串转义 |
在 ${xxx} 形式中,还可以通过 :- 和 :+ 修改返回(使用)值,遵循以下方式:
- ${xxx:-newxxx} 对应的含义为:如果 xxx 有值,则使用 xxx,如果没有值则使用 newxxx
- ${xxx:+newxxx} 对应的含义为:如果 xxx 有值,则使用 空字符串,如果没有值则使用 newxxx
- 上面示例中的 newxxx 不仅可以是字符串,还可以是其他环境变量,例如:${xxx:+${newxxx}}
ENV 定义环境变量遵循以下原则:
- 一行 ENV 可以定义多个环境变量
- 可以有多行 ENV
- 当前行内修改环境变量的值,本行内不会生效,只有到下一行后才会生效
- 由于 \ 具有转义作用(默认转义符是 \,也可以修改为 ` ),因此 \$xxx 将会被解释为 字符串 $xxx,而不是变量值
环境变量可以用于以下指令中:
环境变量 | 定义的变量可用于下列指令中 |
---|---|
EVN keyxxx valuexxx | ADD、COPY、ENV、EXPOSE、FROM、LABEL、 STOPSIGNAL、USER、VOLUME、WORKDIR、ONBUILD |
通过 ARG 来定义指令变量,内容采用 键值对 形式,仅在构建过程的 FROM 中可以调用。
与环境变量的区别在于:
- 指令变量必须出现在 FROM 指令之前
- 指令变量只能用于 FROM 指令中、而环境变量则可以用在绝大多数指令和容器中
通过 FROM 来定义基础镜像,也就是运行程序所需要的基础环境,有以下几种形式:
形式 | 示例 |
---|---|
FROM <image> | FROM nodejs |
FROM <image> [AS <name>] | FROM nodejs as mynode |
FROM <image>[:<tag>] [AS <name>] | FROM nodejs:latest as mynode |
FROM <image>[@<digest>] [AS <name>] | FROM nodejs@xxx as mynode |
通过 RUN 在构建过程中执行 shell 语句。形式有以下2种:
形式 | 示例 |
---|---|
RUN <command> | RUN npm init |
RUN ["executable", "param1", "param2"] | RUN npm init -y |
n下原则:
- 可以在 RUN 指令结尾处添加 \ ,相当于换行延续符,将下一行代码 合并到本行中
- RUN 指令中若使用引号,必须是双引号,不能是单引号
通过 CMD 提供运行容器的默认方法。可以是执行脚本,或者是 指令参数,若不设置 CMD,则必须指定一个 ENTRYPOINT 指令。
CMD 形式有以下3种:
形式 | 示例 |
---|---|
CMD ["executable","param1","param2"],推荐形式 | CMD node app |
CMD ["param1","param2"],作为ENTRYPOINT的默认参数 | |
CMD command param1 param2,会以 /bin/sh -c 来执行该条命令 | CMD echo "hello world",最终执行 /bin/sh -c "echo "hello world"" |
CMD 中执行的 shell 命令是针对 容器,而不是针对 docker。 如果设置了多条 CMD,那么只有最后一条才会起作用。 示例中 -c 的含义是:读取该字符串(而非文件),并作为命令执行
通过 ENTRYPOINT 设置容器运行启动时执行的命令,类似 CMD,CMD 还可以为 ENTRYPOINT 定义变量作为参数。
若 docker run 创建容器时,添加有参数 --entrypoint,则 ENTRYPOINT 的设置将会被覆盖
设置多条 ENTRYPOINT,仅仅只有最后一条会生效
ENTRYPOINT 形式为:
形式 | 示例 |
---|---|
ENTRYPOINT ["<executeable>","<param1>","<param2>",...] | ENTRYPOINT nginx -c |
"<executeable>"为可执行命令或函数,"<param1>" 为参数
通过 MAINTAINER 设置镜像文件的作者或维护者名称。在实际使用中,更加推荐使用 LABEL 标签,因为 LABEL 除了设置作者标签外还可以添加更多其他你需要添加的标签。
MAINTAINER 形式为:
形式 | 示例 |
---|---|
MAINTAINER <name> | MAINTAINER puxiao |
通过 LABEL 设置镜像文件的 label 标签。遵循以下原则:
- 以键值对形式来设置
- 为了可以出现空格,允许使用引号或反斜杠来进行转义
- 允许有多条 LABEL 设置
- 若一条 LBEL 结尾处 出现 \ ,则会将下一行代码 合并到本行中,相当于 跨行符
若要查看镜像文件的 label 标签(同时也是容器的 label 标签),使用命令:docker inspect imagenamexxx
通过 EXPOSE 对外通知容器监听的网络端口和使用协议(TCP或UDP),默认使用TCP协议 。
特别强调:对于端口而言 EXPOSE 仅仅是告知,并不是真正设置端口,真正容器所使用的端口是在 docker run 中 -p 参数来设置端口的。
可以同时添加多条 EXPOSE 设置。
通过 ADD 添加(复制)文件到镜像文件中,被添加(复制)的文件来源是本机资源或远程文件文件或目录,被接收的远程文件拥有600权限(rw-,可读、可写、不可执行)。
ADD 形式有以下2种:
形式 | 示例 |
---|---|
ADD [--chown=<user>:<group>] <src>... <dest> | 添加文件到某位置,路径不需要双引号包裹 src为文件源URL、dest为镜像文件中的路径 |
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] | 路径被双引号包裹,如果路径中有空格只能用这种形式 |
补充说明:
- 若需要拷贝多个文件,则设置多个src路径,以空格为间隔,最后一项必须为 目标目录(即目标路径必须以 / 结尾)
- 若目标路径 是 WORKDIR 目录,可以使用 ./ 代替
- 可以包含通配符 * ?!
- [--chown=<user>:<group>] 为可选参数,且只在 Linux 系统下起作用,目的是改变文件属主(拥有者)
- 如果远程文件有身份验证保护,那么 ADD 将无法顺序执行,只能使用 RUN wget 或 RUN curl
- 如果路径中包含空格,那么需要加上 引号 ""
ADD 添加文件遵循以下原则:
src路径类型 | 对应含义 |
---|---|
本地文件路径 | 复制该文件到镜像文件中 |
本地压缩文件路径(文件格式identidy、gzip、bzip2、xz) | 解压成一个目录,并将该目录复制到镜像文件中 |
本地目录路径 | |
URL文件地址(非 / 结尾) | 下载和复制该文件到镜像文件中 |
URL压缩文件地址 | 下载,但不会被解压,效果与其他URL文件相同 |
URL目录地址(以 / 结尾) | 在镜像文件中创建URL中最后的目录,并将URL目录中的文件下载和赋值到镜像文件中 URL目录地址必须包含一个目录,例如http://example.com 并没有包含目录,这是无效的URL路径 |
dest路径要求 | 补充 |
---|---|
dest 是文件路径还是目录,必须和 src 执行结果对应 | src 为本地压缩文件时,dest 对应解压后的文件内容 |
如果 src 为目录,则dest 也必须为目录 | |
若 dest 本身不存在,则会自动被创建 |
通过 COPY 从上下文目录(本地文件资源或远程URL)中复制文件或目录到容器指定路径里。
形式和 ADD 一样,但是 COPY 仅执行文件复制 即使需要拷贝文件的是压缩文件,也不会尝试进行解压
如果是本地文件,优先考虑使用 COPY 而不是 ADD
COPY 形式为:
形式 | 示例 |
---|---|
COPY [--chown=<user>:<group>] <src>... <dest> | COPY ./dist ./ 将项目中的 ./dist 目录下的内容拷贝到 虚拟镜像中的 ./ 中, 而 虚拟镜像中的 ./ 其实是指 WORKDIR 设置的项目主目录, 当然也可以不使用 ./ 而是 填写具体的目录,例如 /app |
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] | 路径被双引号包裹,如果路径中有空格只能用这种形式 |
同时拷贝多个文件的示例:
WORKDIR /app
#如果拷贝的目标路径是 WORKDIR ,则可以使用 ./ 代替
COPY ./dist ./package.json ./package-lock.json ./.npmrc ./
#为了阅读美观,可以使用 \ 作为换行连接符
COPY ./dist \
./package.json \
./package-lock.json \
./.npmrc \
./
通过 VOLUME 设置匿名数据卷,若启动容器时忘记挂载数据卷,则会自动挂载到匿名数据卷中。这样做的目的有:
- 避免重要数据因为容器重启而丢失
- 避免容器不断变大
VOLUME 形式为:
形式 | 示例 |
---|---|
VOLUME <path> | |
VOLUME ["<path1>", "<path2>"...] |
容器启动时,可通过 -v 参数来修改挂载数据点
通过 WORKDIR 来指定本镜像虚拟环境下的项目主目录。将来启动该镜像的容器,默认会从该目录下找执行文件。
注意:为避免冲突,请勿将 WORKDIR 的路径 设置为 常见 Linux 系统默认的目录
WORKDIR 形式:
形式 | 示例 |
---|---|
WORKDIR <path> |
- 指定的项目主目录无论是否最终使用,都会自动被创建
- 每一个 RUN 命令都新建一层,只有 WORKDIR 创建的目录会一直存在
- 一个 dockerfile 中允许出现多个 WORKDIR,若为相对路径,则每一个 WORKDIR 对应的路径 都将是上一个 WORKDIR 路径累加之后的绝对路径
通过 USER 指定执行后续命令的用户和用户组。
USER 形式为:
形式 | 示例 |
---|---|
USER [:] |
确保用户和用户组本身已存在
如果不指定,则默认使用 root 用户
通过 HEALTHCHECK 指定某个程序或命令来监控 docker 容器服务的运行状态。
HEALTHCHECK 形式为:
形式 | 说明 |
---|---|
HEALTHCHECK [选项] CMD <命令> | 设置检查容器健康状况的命令 |
HEALTHCHECK NONE | 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 |
HEALTHCHECK [选项] CMD <命令> |
通过 ONBUILD 延迟构建命令的执行。简单来说就是本次构建时不会执行,但是当其他构建若使用到了本次镜像文件(其他 dockerfile 中 FROM 本镜像) ,则会执行。
ONBUILD 形式为:
形式 | 示例 |
---|---|
ONBUILD <其它指令> |
通过 STOPSIGNAL 来指定当 Docker 要关闭容器前,发送的关闭信号。
默认关闭信号为 “SIGTERM”,通过 STOPSIGNAL 可以修改该值。
STOPSIGNAL 形式为:
形式 | 示例 |
---|---|
STOPSIGNAL signal |
当 Docker 要关闭容器前 发送关闭信号给 容器,目的是让容器可以先做一些处理,平滑退出。如果容器不做任何处理,则容器将在 10秒 后强制关闭退出。
通过 SHELL 来执行 指定的 shell 命令。
SHELL 形式为:
形式 | 示例 |
---|---|
SHELL ["executable", "parameters", "parameters2"] |
.dockerignore 用来配置不构建到镜像文件中的内容,遵循以下原则:
- 可以使用 # 开头来作为注释,但必须处于 第1行
- 可以使用 *、?、! 来作为 正则表达式修饰作用,匹配相关路径
- .dockerignore 文件必须和 dockerfile 文件在同一目录中
Docker build . 构建镜像文件是通过 Docker daemon (守护进程) 运行的,而不是 Docker 客户端。
默认 应该把 dockerfile 存放在要构建的项目根目录,如果不在要构建的项目根目录,则需要在构建时,通过添加 -f /xx/xxx/dockerfile 参数,来指定 dockerfile 文件位置。
创建、构建镜像文件:docker build xxxxpath 这里的 xxxxpath 为项目根目录
dockerfile 文件通常都保存在 项目根目录 若是当前目录,则可以使用 . 代替,即:docker build .
可以添加的参数有:
参数 | 对应含义 |
---|---|
-t xxx/xx 或 --tag xxx/xx | 设置镜像文件保存到哪个镜像仓库和标签 可以同时设置多条 -t xxx/xx,即同时发布到多个镜像仓库中 |
-f xxx 或 --file xxx | 声明 dockerfile 所在的路径 如果不加该参数则从当前目录中查找 dockerfile |
--catch-from | 允许使用非父链上的构建缓存,以加快构建过程 默认只能使用父链上的构建缓存 |
--no-cache | 不使用上次构建的缓存 (个人不建议添加此参数) |
当本机第2次构建同一项目镜像时,默认会使用上次构建时的一些缓冲,仅仅把修改部分进行重新构建,这样会提高构建速度。
特别提醒:
假设第二次重新构建镜像时,若 -t 的值 和第一次构建时相同,那么本次构建的镜像名称将使用 -t 的值,而之前的镜像会依然保留,只是 tag 名字自动改为 none,若想删除之前镜像,只能靠 删除镜像ID 的方式。
特别提醒:在 Linux 下 文件是区分大小写的,因此只能将文件名设置为 dockerfile 或 Dockerfile
错误命名:例如 DOCKERFILE,则会报错,提示找不到文件
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /mykoa/test-git/Dockerfile: no such file or directory
搜索镜像:docker search xxx
一定要从返回列表中,认真看清楚镜像的描述信息,最终选定安装哪个镜像文件
下载镜像:docker pull xxx ,其中 xxx 为 docker search xxx 中选定的结果名称
下载腾讯云镜像:
- 需要先执行 docker login --username=[QQ号] ccr.ccs.tencentyun.com
- 输入 腾讯云容器管理密码(并不是QQ密码)
- 登录成功后,即可执行下载:docker push ccr.ccs.tencentyun.com/[命名空间]/[镜像名]:[镜像版本号]
查看已安装的镜像:docker images 或 docker image ls
查看某镜像的底层配置:docker inspect xxx
为本地某镜像添加一个新的别名,并使用新的 tag:docker tag xxx:oldtag xxx:newtag
注意并不是将原来镜像的 tag 进行修改,而是创建一个副本(镜像别名),副本(镜像别名)使用新的 tag,但是这两个镜像 Image ID 是一样的,也就意味着实际上本地只储存了一份镜像,所谓新创建的副本(镜像别名)只是新增的一个镜像引用而已。
导出镜像文件:docker save xxx > /xx/xxx.tar.gz
将镜像导出成压缩文件(相当于本地备份镜像),
/xx/xxx.tar.gz
为导出镜像文件的保存位置和文件名。 注意:导出命令执行完毕后并不会打印任何信息
导入镜像文件:docker load < /xx/xxx.tar.gz
注意:导出镜像文件使用 > ,导入镜像文件使用 <
特别注意:如果使用的是 Docker Desktop 桌面版,则导入镜像命令为:docker load --input /xx/xxx.tar.gz
删除镜像:docker image rm xxx 或者 docker rmi xxx
这里的 xxx 既可以是镜像名,也可以是镜像ID
若 xxx 是镜像别名,该镜像只有一个镜像名,那么删除 xxx 也就相当于同时删除了该镜像 若 xxx 是镜像别名,该镜像本地创建了多个镜像别名,那么删除 xxx 仅仅删除该镜像别名而已,并不会删除镜像 若 xxx 是镜像ID,那么删除 xxx 就会删除该镜像以及所有的镜像别名
删除镜像时若报错误:unable to remove repository reference... container xxxxxxx is using its referenced image xxxx,这表示该镜像正在被 某容器 占用,即使该容器已经停止。
解决办法:若容器正在运行,则先停止该容器(docker stop containerxxxxxx),然后删除该容器(docker rm containerxxxxxx),再进行删除镜像(docker image rm imagexxxxxx)
强制删除镜像:docker image rm -f xxx 或 docker rmi -f xxx
删除所有<none>的镜像:docker image prune
同一个项目,每次构建时,若 -t 值相同,之前构建的镜像文件并不会被删除,而是会被 修改为 <none> 但是有一个前提:当前并没有任何容器使用该镜像文件,只有满足这个条件下,该镜像才会被删除
登录镜像仓库:docker login [镜像仓库平台]
若不填写镜像仓库平台,那么默认登录的是 docker 官网镜像仓库(hub.docker.com)
登出镜像仓库:docker logout [镜像仓库平台]
若不填写镜像仓库平台,那么默认登出的是 docker 官网镜像仓库(hub.docker.com)
发布镜像:docker push username/xxx:xx.x
更新镜像:docker commit imagesxxx-id xxx-name:vx.x
上述更新镜像中代码中,imagesxxx-id 为镜像ID,xxx-name 为镜像名,vx.x 为镜像版本(TAG),若不填写vx.x则默认值为 latest
更新镜像中可以添加的参数:
参数 | 对应含义 |
---|---|
-m | 更新描述信息 |
-a | 更新作者 |
从容器中导出镜像:docker commit containerxxx xxx-name:vx.x
注意,这里 commit 后面紧跟着的参数是 容器ID
第1步:登录自己的腾讯云
docker login --username=[QQ号] ccr.ccs.tencentyun.com
或者是:
docker login -u [QQ号] ccr.ccs.tencentyun.com
注意,输入密码时,并不是自己QQ号的密码,而是自己在腾讯云容器服务中设置的容器账户密码
第2步:在自己的腾讯云 > 容器服务 > 我的镜像 > 创建 命名空间
第3步:在自己的腾讯云 > 容器服务 > 我的镜像 > 新建我的镜像
如果我的镜像仓库已存在则忽略 第2 和 第3 步骤。
第4步:在终端,先构建好本地项目对应的镜像
docker build -t mynode:0.1 .
第5步:在终端,执行:
#假设命名空间为 puxiao、镜像仓库为 mynode
docker tag mynode:0.1 ccr.ccs.tencentyun.com/puxiao/mynode:0.1
第6步:在终端,执行:
docker push ccr.ccs.tencentyun.com/puxiao/mynode:0.1
等待上传过程结束后,若看到打印类似以下信息,即表示发布镜像成功:
0.1: digest: sha256:01a8d2cd07a0661c4a47cbe3890563208b141c65bfc1456e442d7ae67987d125 size: 3050
镜像发布成功后,查看本地镜像列表 docker images,除了 mynode,还会新增一个 ccr.ccs.tencentyun.com/puxiao/mynode 的镜像别名,两者的镜像ID是相同的,两者是本地同一个镜像文件的不同引用。
查看容器:docker container ls -a
查看容器另外一种写法:docker ps -x “-x” 仅仅是示意,具体对应的参数请参加下表
上述命令中 -x 为参数:
-x的值 | 对应含义 |
---|---|
不使用参数 | docker ps 显示当前活动中的容器 |
-a | 显示所有容器,包括未运行的(已停止的) |
-f | 根据条件过滤显示的内容 |
--format | 指定返回值的模板文件 |
-l (小写的L) | 显示最近创建的容器 |
-n | 列出最近创建出的 n 个容器 |
--no-trunc | 不截断输出 |
-q | 静默模式,只显示容器编号 |
-s | 显示总的文件大小 |
暂停容器:docker pause xxx
恢复容器:docker unpause xxx
停止容器:docker stop xxx
会向进程发送 stop 信号,内容内程序处理后(停止后),再停止容器
杀死(停止)容器:docker kill xxx
不会像进程发送 stop 信号,直接停止
重新开启容器:docker start xxx
删除容器:docker rm xxx 需要先 stop 容器,否则会删除失败
强制删除容器:docker rm -f xxx 即使容器正在运行,也会先 stop 然后再删除掉
删除所有已停止的容器:docker container prune
在命令操作界面,询问是否删除所有 已停止 的容器时,输入 y ,即可全部删除
查看容器底层信息(配置):docker inspect xxx
查看容器运行状态:docker stats xxx
进入某容器:docker exec -it xxx bash
添加参数 -it 和 bash 后,可以通过 命令方式 针对容器内容进行交互操作
导出容器快照:docker export xxx > /xx/xxx.tar.gz
导入容器快照:docker import /xx/xxx.tar.gz (本地文件资源) 或 docker import https://xxx.com/xxx (网络资源)
查看容器端口:docker port xxx
查看容器内部运行程序(进程):docker top xxx
修改容器名字:docker container rename xxx newname
注意是容器名称不是容器ID
查看镜像的创建历史信息:docker history xxx
查看容器内部文件结构更改:docker diff xxx
容器与宿主机之间拷贝文件:docker cp from-path-xxx to-path-xxx
from-path-xxx 是需要拷贝的文件或目录路径、to-path-xxx 是复制到的路径 宿主机文件系统直接使用常规路径,但是容器路径需要添加容器ID, 举例:docker cp /root/xxx containidxxx:/root/xxx,将 宿主机中的 /root/xxx 拷贝到 容器ID 为 containidxxx 的/root/xxx中。
注意:源文件(或目录)路径 和 目标文件(或目录)路径 结尾处,是否包含 / 会直接影响拷贝结果 如果双方结尾处 都不包含 / ,则对应的含义是:直接对等拷贝 如果 一方结尾处有 /,而另外一方结尾处没有 /,则对应的含义是:拷贝到 xx/目录下面
阻塞运行直到容器停止:docker wait xxx
创建容器但不启动它:docker create imagexxx
语法同 docker run 相同,区别就在于只创建不启动 启动创建的容器:docker start imagexxx
创建容器:docker run imagexxx
注意这里的 imagexxx 为镜像,启动镜像会创建一个运行状态的容器 其他的 xxx 为容器
启动镜像时,可添加的参数:
参数 | 对应含义 |
---|---|
-it | 启动成功后,显示容器命令操作界面 若不添加该参数,容器启动成功后则停留在主机操作界面、若添加则进入容器命令界面 退出容器命令操作界面,执行:exit ,由于未使用参数 -d,因此退出命令操作界面会让容器停止 |
-itd | 启动成功后,不显示容器命令操作界面,以后台形式运行 若想进入容器操作界面,执行:docker exec -it xxx(容器名) bash 退出容器命令操作界面,执行:exit ,由于使用参数 -d,因此退出命令操作界面并不会让容器停止 |
--name xxx | 给该容器起一个名字(ID),若不添加该参数,则 docker 会随机产生一个字符串作为该容器名字(ID) |
-p 9000:8080/tcp | 指定映射端口,9000为宿主机端口,8080为容器内部端口, 默认(不填时)使用协议为tcp,可修改为udp 可以有多组 -p xxxx:xxxx,设置多组端口映射关系 也可以添加上宿主机IP,-p 127.0.0.1:9000:8080 |
-P | 随机映射到宿主机某个端口(不推荐) |
-v /aa/bb:/cc | 映射目录,/aa/bb为宿主机目录,/cc为容器内部目录 通常情况下数据库文件一定是存放在宿主机目录里的,同 -p 一样,也可以设置多组目录映射关系 |
--privileged | 允许容器拥有操作宿主机中映射的目录最高权限(读/写执行) |
--net=xxx | 其中 xxx 为网络模式 1、none:无网络 2、host:直接使用宿主机的网络配置 3、bridge:默认设置,会为每一个容器分配IP,通过虚拟网桥与宿主机通信 4、container:Name_or_ID,容器自己不配置网络,而是和指定容器共享同一个网络配置 |
-d 或 --detach | 在容器中,以后台模式运行 |
默认会先查找并启动本地资源中的镜像文件,如果本地找不到,则会尝试 从 DockerHub 下载该名称的镜像 若想直接从 仓库中下载,则使用 docker pull xxx:xx
启动容器的命令格式为:docker run 参数1 imagename 参数2
其中 参数1
的参数是给 docker 使用的、参数2
的参数是给 镜像文件中应用程序使用的
docker 有一个连接系统,可以将多个容器进项相互连接。
具体操作步骤如下:
第1步:新建一个 docker 网络
docker network create -d bridge test-net
上面代码中将新建的网络命名为 test-net
网络类型 -d 参数,可以设置值有:bridge、overlay
第2步:新建一个容器,并连接到 创建的网络中
docker run -itd --name test1 --network test-net image-name-xxx1
上面代码中,将容器名字命名为 test1,连接到 test-net 网络中,image-name-xxx1 为镜像文件名
第一个连接到该网络的容器,称为 父容器
第3步:再新建其他容器,并连接到 创建的网络中
docker run -itd --name test2 --network test-net image-name-xxx2
容器之间测试连接:可以在容器中使用 ping 命令 去连接另外一个容器,例如在 test1 中执行 ping test2。
如果容器过多,还是推荐使用 Docker Compose 来管理这些容器。