type
status
password
date
slug
summary
category
URL
tags
icon
docker命令
docker ps -a:命令用于列出所有的Docker容器
docker ps -s:命令用于列出Docker容器占用的空间,有些容器不包括
docker system df: 查看内存
docker system prune -a:清理内存
docker logs --since 30m CONTAINER_ID:查看最近30分钟的日志
docker inspect --format '{{.LogPath}}' 97069f94437b:查看容器日志地址
docker run -itd --name test -p 6080:6080 arm64v8/ubuntu:22.04:运行docker
docker exec -it openwrt bash:docker交互
docker login:登录docker
docker commit vser vs:v1:dockers commit 容器名 镜像名:版本名
docker tag vs:v1 cccc/vserver:v1:docker的用户名/dockerhub上创建的仓库名:版本号
docker push cccc/vserver:v1:push本地镜像到仓库
docker build --network host:使用宿主机构建镜像
--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统。
添加镜像源
创建或打开/etc/docker/daemon.json
运行docker
设置代理
- 创建并编辑
/etc/systemd/system/docker.service.d/proxy.conf
运行docker
拉取指定架构镜像
镜像导入导出
docker Compose 模板文件
注意每个服务都必须通过
image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。DockerFile使用教程
配置文件
- FROM 指定基础镜像
- 命令一般有两种。
- exec 格式:
RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式
shell 格式
RUN命令
RUN指令是用来执行命令行,每一个RUN的行为都会新建立一层。但是曾是有最大限制,不能创建太多层
COPY命令
COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。ADD命令
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整。CMD 容器启动命令
CMD 指令就是用于指定默认的容器主进程的启动命令的。CMD 指令的格式和 RUN 相似,也是两种格式:shell格式:CMD <命令>
exec格式:CMD ["可执行文件", "参数1", "参数2"...]
在运行时可以指定新的命令来替代镜像设置中的这个默认命令,比如,
ubuntu 镜像默认的 CMD 是 /bin/bash,如果我们直接 docker run -it ubuntu 的话,会直接进入 bash。我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。而使用 service nginx start 命令,则是希望 init 系统以后台守护进程的形式启动 nginx 服务。而刚才说了 CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:ENTRYPOINT 命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。但与CMD不一样的是,当存在 ENTRYPOINT 后,CMD 的内容将会作为参数传给 ENTRYPOINT。CMD命令
ENTRYPOINT命令
ENV命令
设置环境变量,格式有两种:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG 命令
格式:
ARG <参数名>[=<默认值>]和
ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。ARG 指令有生效范围,如果在
FROM 指令之前指定,那么只能用于 FROM 指令中。使用上述 Dockerfile 会发现无法输出
${DOCKER_USERNAME} 变量的值,要想正常输出,你必须在 FROM 之后再次指定 ARGEXPOSE命令
声明端口。格式为
EXPOSE <端口1> [<端口2>...]WORKDIR 命令
指定工作目录。格式为
WORKDIR <工作目录路径>。USER 命令
指定当前用户,格式:
USER <用户名>[:<用户组>]HEALTHCHECK 命令
健康检查,
HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。有以下两种格式HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
在没有
HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。-interval=<间隔> | 两次健康检查的间隔,默认为 30 秒 |
-timeout=<时长> | 健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒 |
-retries=<次数> | 当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次 |
HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效ONBUILD 命令
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。LABEL 命令
LABEL 指令用来给镜像以键值对的形式添加一些元数据(metadata)。SHELL 命令
SHELL ["executable", "parameters"]。SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shell,Linux 中默认为 ["/bin/sh", "-c"]多阶段构建镜像
COPY --from httpd:latest /usr/local/apache2/conf/httpd.conf ./httpd.conf:使用外部镜像名。
创建镜像
docker build -t myubuntu:v1 .
- docker:docker命令。
- build:编译。
- t:镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag,参考docker build命令详解。
- myubuntu:生成镜像的名称。
- v1:生成镜像的版本号。
- .:点符号“.”表示的意思是,指定镜像构建过程中的上下文环境的目录,可以参考docker build 命令后 . 号的意思这篇文章。
- docker images:查看镜像
- docker run -it -p 8111:80 --name myubuntu_test myubuntu:v8 /bin/bash:运行容器
- docker ps -a:查看容器
Docker迁移镜像存储位置
windows版本
Docker Desktop默认安装在C盘,存储位置在
C:\用户\Administrator\AppData\Local\Docker\wsl\。长期使用会占满C盘空间,所以我们需要修改Docker Desktop镜像的存储空间。Docker Desktop子系统
Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。可以命令行执行
wsl --list -v 看到子系统 | 内容 | 文件 |
docker-desktop | 程序 | \AppData\Local\Docker\wsl\distro\ext4.vhdx |
docker-desktop-data | 镜像 | \AppData\Local\Docker\wsl\data\ext4.vhdx |
迁移步骤
- 在Docker Desktop图标上,右键选择[Quit Docker Desktop],退出Docker。
- 命令行执行 wsl --shutdown ,关闭WSL。命令行执行 wsl --list -v 查看状态STATE,是否已停止Stopped。

- 从 wsl 把镜像
\data\ext4.vhdx导出到压缩文件docker-desktop-data.tar,导出路径应提前创建好,否则导出到不存在的路径会报错。命令行执行

- 同理,导出把程序
\distro\ext4.vhdx导出到压缩文件docker-desktop.tar,命令行执行
- 命令行执行
wsl --unregister docker-desktop-data,注销原来的 Docker 镜像。同理,执行wsl --unregister docker-desktop

- 从tar 文件,将导出的 Docker 镜像再导入回wsl,并设置挂载目录,命令行导入格式:
wsl --import <Distribution Name> <InstallLocation> <FileName>如:
- 重新启动 Docker Desktop 完成。
