Ⅰ. 帮助启动类命令
启动 docker
systemctl start docker
停止 docker
systemctl stop docker
重启 docker
systemctl restart docker
查看 docker 状态
systemctl status docker
开机启动
systemctl enable docker
查看 docker 信息
docker info
查看 docker 帮助文档
docker --help
查看 docker 命令帮助文档
docker 具体命令 --help
Ⅱ. 镜像类命令
docker images
列出本地主机上的镜像

- REPOSITORY: 仓库镜像的仓库源
- TAG: 镜像的标签版本号(同一仓库源可以有多个 TAG 版本,使用 REPOSITORY:TAG 来定义不同的镜像)
- IMAGE ID: 镜像 ID
- CREATED: 镜像创建时间
- SIZE: 镜像大小
选项:
- -a: 列出本地所有的镜像
- -q: 只显示镜像 ID
docker search
在 hup 服务器上寻找镜像,如果没有配置国内镜像默认就是在 hup.docker.com 上查找。

- NAME: 镜像名称
- DESCRIPTION: 镜像说明
- STARS: STAR 数
- OFFICIAL: 是否是官方的
- AUTOMATED: 是否是自动构建的
选项:
- –limit: 只列出 N 个镜像,默认 25 个

docker pull
拉取指定镜像

如果没有指定 TAG,默认就是最新版,即 docker pull ubuntu:latest

docker system df
查看镜像/容器/数据卷所占用的空间

docker rmi
删除某个镜像

删除单个:docker rmi -f 镜像ID
删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部:docker rmi -f $(docker images -qa)

Ⅲ. 容器类命令
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
选项
- –name=“容器的名字”
- -d 后台运行容器并返回容器 ID,也即启动守护式容器
- -i 以交互模式运行容器,通常跟 -t 同时使用
- -t 为容器重新分配一个伪 tty(终端),通常与 -i 同时使用
- -P(大写)随机端口映射
- -p(小写)指定端口映射

列出当前所有正在运行的容器
docker ps


选项
- -a 列出所有容器,不加 -a 只会显示正在运行的容器
- -l 显示最近创建的容器
- -n 显示最近 n 个创建的容器
- -q 只显示容器 ID
退出容器
两种退出方式
- exit 退出,容器停止
- ctrl + p ctrl + q 退出,容器不停止
启动已经停止的容器
docker start 容器ID或者容器名

停止容器
docker stop 容器ID或者容器名

强制停止容器
docker kill 容器ID或者容器名
删除已停止的容器
docker rm 容器ID或者容器名

没有停止的容器加上选项 -f
既可以删除。
一次性删除多个容器实列 docker rm -f $(docker ps -aq)
或者 docker ps -a -q | xargs docker rm

启动守护式容器(后台服务器)
docker run -d 镜像名
请注意,虽然是叫做守护容器,但是如果你的容器内部没有一个前台进程,即使是使用 docker run -d
运行的容器也会马上结束。

因此,需要将我们要运行的程序以前台进程的形式进行,如下图所示:

查看容器日志
docker logs 容器ID或者容器名

查看容器内运行的进程
docker top 容器ID或者容器名

查看容器内部细节
docker inspect 容器ID或者容器名

进入正在运行的容器
docker exec -it 容器ID或容器名 shell


docker attach 容器ID或容器名

attach
直接进入容器启动命令的终端,不会启动新的进程,用 exit 退出,会导致容器的停止。
exec
是在容器中打开新的终端,并且可以启动新的进程,用 exit 退出,不会导致容器的停止。
推荐用 docket exec
进入正在运行的容器。
从容器内拷贝文件到主机上
容器->主机
docker cp 容器ID或容器名:容器内路径 目的主机路径

主机->容器
docker cp 文件名 容器名:容器内路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wObynC2F-1660483281740)(https://incipe.oss-cn-shenzhen.aliyuncs.com/image-20220813165403516.png)]
导入和导出容器
export 导出容器的内容流作为一个 tar 归档文件[对应 import 命令]
import 从 tar 包中的内容创建一个新的文件系统再导入为镜像[对应 export 命令]
docker export 容器ID或容器名 >> 文件名.tar
cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号



Ⅳ. 构建并发布自己的镜像(非Dockerfile方式)

当在创建的容器内搭建好了一系列的环境后,怎么发布出去给别人用呢?这时就需要 docker commit
命令。
比如新创建的环境是没有 vim 编辑器的,当我们在自己的容器中装好 vim,就可以发布成新的镜像。

然后我们执行 apt-get update
apt-get install vim
安装 vim。注意:刚刚运行的容器需要先运行 apt-get update
如此一来我们的容器里面就有了一个 vim 编辑器,现在把其发布成一个镜像。
docker commit -m="提交的描述信息" -a="作者" 容器名或容器ID 要创建的镜像名:[标签]


把自己制作的镜像发布到阿里云容器服务器或者Docker官网(首先要在容器服务器网站创建命名空间和仓库)。
docker login --username=XXXXXX registry.cn-shenzhen.aliyuncs.com
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/incipe/test:[镜像版本号]
docker push registry.cn-shenzhen.aliyuncs.com/incipe/test:[镜像版本号]
Ⅴ. 容器数据卷
数据卷是一个可供一个或者多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)
简而言之,就是把容器内的重要数据备份长期保存到本地主机目录。
docker run -it --privileged=true -v /主机绝对路径目录:/容器内目录:[ro(read only, default is read write)] 镜像名

然后在 docker 指定的目录下生成的文件就会被实时的同步到主机相应的目录了。
执行 docker inspect 容器名或容器ID
即可查看挂载的位置。

注意:可以指定多个数据卷~
数据同步规则如下:
- docker修改,主机同步修改
- 主机修改,docker修改
- docker stop,主机修改,docker 启动同步数据
数据卷之间的继承
docker run -it --privileged=true --volumes-from 父类 --name=容器名字 镜像

只要某个容器继承了数据卷,那么就会共享数据卷,即无论哪一方修改共享目录,都会同步,即使 docker stop。
Ⅵ. Dockerfile
前文提到了,我们可以通过 docker commit
定制每一层所添加的配置,文件,但是每次我们添加一层时,都需要 commit 命令,会显的很麻烦,这时就需要 Dockerfile ,把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。
Dockerfile基础知识
- 每个保留字都必须为大写字母,并且后面至少要跟一个参数
- 指令从上到下,顺序执行
- # 表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程
- docker 从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- docker 再基于刚刚提交的镜像运行一个新容器
- 执行 dockerfile 中的下一条指令,直到所有指令都执行完成
Dockerfile保留字
- FROM 表示当前新镜像基于哪个镜像,指定一个已经存在的镜像作为模板,第一条必须是 FROM
- LABEL 维护镜像的作者信息
- RUN 容器构建的时候需要运行的命令
- 两种格式
- RUN 实在 docker build 时运行
- EXPOSE 当前容器对外暴露出的端口
- WORKDIR 指定在创建容器后,终端默认登录进来的工作目录
- USER 指定该镜像以什么样的用户去执行,如果不指定,默认是 root
- ENV 用来构建镜像过程中设置环境变量
- ADD 将宿主机目录下的文件拷贝进镜像且会自动处理 URL 和解 tar 包
- COPY 类似 ADD,拷贝主机文件和目录到镜像中
- VOLUME 上文说的数据卷
- CMD 指定容器启动后要干的事情
- Dockerfile 可以有多个 CMD 指令,但是只有最后一个生效,CMD 会被 docker run 之后的指令替换
- 跟 RUN 的区别
- RUN 是在 docker build 后执行
- CMD 实在 docker run 后执行
- ENTRYPOINT 容器启动时要运行的命令,类似于 CMD 命令,但是 ENTRYPOINT 不会被 docker run 后面的指令覆盖,而且这些指令会被当作参数送给 ENTRYPOINT 指令指定的程序
更多的参考 Dockerfile reference