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
之后再次指定 ARG
EXPOSE命令
声明端口。格式为
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 完成。