文章目录
一、帮助启动类命令
# 启动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:镜像的标签版本号
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
知识拓展:
- 镜像下载后存放在
/var/lib/docker
- Docker 相关的本地资源存放在
/var/lib/docker/
目录下,其中containers
目录存放容器信息,image
目录存放镜像信息,overlay2
目录下存放具体的镜像底层文件。- 查看下载的镜像文件信息:
cat /var/lib/docker/image/overlay2/repositories.json
OPTIONS说明:
- a:列出本地所有的镜像(含历史映像层)
- q:只显示镜像ID
(二)docker search 某个XXX镜像名字
1. 网站
2. 命令
docker search [OPTIONS] 镜像名字
结果解析
NAME
:镜像名称- 镜像名称中的前缀(
sameersbn/redis
、grokzen/redis-cluster
)类似于Java中的包名(Package),表示不同的作者或组织提交的
- 镜像名称中的前缀(
DESCRIPTION
:镜像说明STARS
:点赞数量- 默认按照点赞数量倒序排列
OFFICIAL
:是否是官方的。- 建议选择官方认证过的,最靠谱!最好用!
AUTOMATED
:是否是自动构建的
OPTIONS说明:
- -f:过滤
- ‐‐limit:只列出N个镜像,默认25个
注意区分单-和双-!!!
3. 报错解析
报错信息:Error response from daemon: Get "https://index.docker.io/v1/search?q=hello-world&n=25": dial tcp 128.242.240.253:443: connect: connection refused
docker search
的工作机制:docker search
命令默认总是查询 Docker Hub (index.docker.io),它不会自动使用 daemon.json
中配置的镜像加速器。这是 Docker 的一个设计行为。
为什么 docker search
不遵循 mirror 配置?
这是 Docker 的已知行为设计:
registry-mirrors
只影响镜像的拉取(pull)和推送(push)- 搜索(search)操作总是直接访问 Docker Hub
- 这是出于安全和一致性的考虑
目前博主没有找到处理这个问题的可行性方案,各位如果有好的方案欢迎留言交流,我会第一时间验证并更新文章,感谢大家!
(三)docker pull 某个XXX镜像名字
下载镜像
docker pull 镜像名字[:TAG]
- 这里的
TAG
释义和docker images
章节中的TAG
一致
- 这里的
docker pull 镜像名字
- 没有
TAG
就是最新版(即:TAG为latest) - 等价于
docker pull 镜像名字:latest
docker pull ubuntu
- 没有
(四)docker system df 查看镜像/容器/数据卷所占的空间
- 行
TYPE
:类型TOTAL
:总数ACTIVE
:活动中的SIZE
:大小RECLAIMABLE
:可伸缩性
- 列
Images
:镜像Containers
:容器Local Volumes
:本地卷Build Cache
:构建的缓存
(五)docker rmi 某个XXX镜像名字ID
删除镜像
# 删除单个
docker rmi -f 镜像ID
# 删除多个(使用空格分隔)
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 删除全部(命令嵌套,类似于sql中的子查询),生产环境中慎用!!!
docker rmi -f $(docker images -qa)
知识拓展:
- rmi:remove images的简称
- -f:forced的简称
(六)面试题:谈谈docker虚悬镜像是什么?
1. 是什么
仓库名、标签都是<none>
的镜像,俗称虚悬镜像
(dangling image)。
有时Docker在构建过程中会出现问题,就导致了虚悬镜像的产生,建议删除,没什么用
2. 后续Dockerfile章节再介绍
(七)思考
结合我们Git的学习心得,大家猜猜是否会有docker commit /docker push? ?
三、命令自动补全
docker支持命令自动补全功能,当输入镜像名前几位时,可以按tab
键自动补全镜像名称、tag等。
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub
如果按下tab
时没有自动补全,可以按以下步骤操作:
- 检查是否安装了
bash-completion
(命令补全增强包)# 检查有 /usr/share/bash-completion/bash_completion 这个文件 ls /usr/share/bash-completion/bash_completion
- 如果有
/usr/share/bash-completion
目录,但是没有/usr/share/bash-completion/bash_completion
文件(centos6为/etc/bash_completion
文件),则需要安装bash-completion
yum -y install bash-completion
- 检查是否安装了docker的自动补全
# 检查/usr/share/bash-completion/completions文件夹下是否有docker开头的自动补全 # docker安装完后会在该文件夹下生成自动补全文件docker # 如果安装了docker-compose,则该文件夹下还会有 docker-compose文件 ll /usr/share/bash-completion/completions/docker*
- 如果已经安装了docker自动补全,使用
source
命令使其生效source /usr/share/bash-completion/completions/docker
- 再次使用
tab
查看是否可以自动补全# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全 docker run ub
- 如果有报错,且报错中提示
_get_comp_words_by_ref: command not found
。说明bash-completion
的配置文件没有生效,需要source
一下# 对于centos7,bash-completion安装的是2.x版本,配置文件为/usr/share/bash-completion/bash_completion source /usr/share/bash-completion/bash_completion # 如果是centos6,自动安装的bash-completion最新版为1.x版本,配置文件为/etc/bash_completion # bash /etc/bash_completion
- 再次使用
tab
查看是否可以自动补全# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全 docker run ub
四、Docker后台启动一个纯Linux镜像
Docker启动镜像后,如果镜像中的程序不是一直运行的,那么在程序运行完成后容器就会自动退出。而单纯的Linux镜像中是没有一直运行的程序的,如果需要后台启动一个不停止的Linux镜像,可以手动指定一个不停止的程序,例如采用以下方式:
# 使用tail -f 不停的打印一个日志,例如打印日志黑洞/dev/null
docker run -d --name kylin hxsoong/kylin:v10-sp1 tail -f /dev/null
五、yum只下载依赖不进行安装
有些时候,内网需要安装某个RPM包,而内网服务器不连接互联网,无法直接下载缺失的依赖。可以在Docker中启动一个相同版本的Linux,然后下载相关依赖:
# yum只下载依赖不进行安装:(尝试安装aaaa.rpm,将需要的rpm依赖下载到aaaa_packages文件夹中)
yum install --downloadonly --downloaddir=aaaa_packages aaaa.rpm
六、容器命令
(一)有镜像才能创建容器, 这是根本前提(下载一个CentOS或者ubuntu镜像演示)
docker pull centos
docker pull ubuntu
- 本次演示用ubuntu演示
(二)新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
1. OPTIONS说明
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字"
:为容器指定一个名称,若不指定则使用系统随机分配的名称;
-d
:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i
:以交互模式运行容器,通常与 -t 同时使用;
-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
i 表示 interaction (交互)
t 表示 tyy(伪终端)
-P
:随机端口映射,大写P
-p
:指定端口映射,小写p,一般使用指定端口映射
-p
指定端口映射的几种不同形式:-p hostPort:containerPort
:端口映射,例如-p 8080:80
-p ip:hostPort:containerPort
:配置监听地址,例如-p 10.0.0.1:8080:80
-p ip::containerPort
:随机分配端口,例如-p 10.0.0.1::80
-p hostPort1:containerPort1 -p hostPort2:containerPort2
:指定多个端口映射,例如-p 8080:80 -p 8888:3306
2. 启动交互式容器(前台命令行)
上图中的
root@d72e720a13d3
,其中的d72e720a13d3
表示这个新创建的容器实例ID
# 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash
参数说明:
-i
:交互式操作。-t
:终端。centos
:centos 镜像。/bin/bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash(或者bash)。- 要退出终端,直接输入
exit
(三)列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS说明(常用):
-a
:列出当前所有正在运行的容器+历史上运行过的-l
:显示最近创建的容器。-n
:显示最近n个创建的容器。-q
:静默模式,只显示容器编号。
silly_dewdney是系统为这个容器实例随机分配的名称,因为创建这个容器实例时并没有使用
--name
参数指定容器名称
myu1则是我们创建容器实例时使用
--name
参数指定的容器名称,两个容器实例都是使用ubuntu镜像创建的,所以IMAGE
列是一样的,但却是两个不同的容器实例,所以容器IDCONTAINER ID
列是两个不同的ID值
(四)退出容器
两种退出方式
1. exit
run进去容器,exit
退出,容器停止
2. Ctrl + p + q
run进去容器,Ctrl + p + q
退出,容器不停止
(五)启动已停止运行的容器
docker start 容器ID或者容器名
(六)重启容器
docker restart 容器ID或者容器名
(七)停止容器
docker stop 容器ID或者容器名
(八)强制停止容器
docker kill 容器ID或容器名
慎用!!!
(九)删除已停止的容器
# 删除单个容器实例
docker rm 容器ID
# 删除全部容器实例,生产环境慎用!!!
docker rm -f $(docker ps -a -q)
# 或
docker ps -a -q | xargs docker rm
一定要是已停止的容器才可以删除,如果非要删除正在运行的容器,则可以加一个强制删除的参数,命令为
docker rm -f 容器ID
,知道用法即可,一般不建议这样用!
(十)重要
1. 有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)
2. 启动守护式容器(后台服务器)
在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过
-d
指定容器的后台运行模式。docker run -d 容器名
养成好习惯,在使用
run
命令启动一个容器实例以后,接着使用docker ps
命令查看一下容器实例是否启动成功,状态(STATUS)列一定要是Up
。# 使用镜像ubuntu:latest以后台模式启动一个容器 docker run -d ubuntu
问题:然后
docker ps -a
进行查看,会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start。但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。
所以,最佳的解决方案是将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。redis 前后台启动演示case
- 前台交互式启动:
docker run -it redis:6.0.8
- 后台守护式启动:
docker run -d redis:6.0.8
要区分好
前台交互
和后台守护
的区别,个人认为可以结合java -jar
命令来辅助理解,因为启动jar包时也区分前台启动和后台启动。
通过这里我们也可以加深对docker这种容器化技术的理解,以前我们在linux环境下安装redis时,需要做各种gcc配套、配置文件修改、还有make、make install等等。现在使用docker容器,直接一条run
命令就可以实现秒级
启动。- 前台交互式启动:
3. 查看容器日志
docker logs 容器ID
知识拓展:
现代化开发的主流趋势
- 编码开发微服务
- 上线部署容器化
- 时时刻刻要监控
4. 查看容器内运行的进程
docker top 容器ID
5. 查看容器内部细节
docker inspect 容器ID
lowerdir
是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录upperdir
是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层MergedDir
是表现层,是容器的挂载点
6. 进入正在运行的容器并以命令行交互
- docker exec -it 容器ID bashShell
- 重新进入docker attach 容器ID
- 案例演示:用 centos 或者 ubuntu 都可以
- 上述两个区别
- attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
- exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
- attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
推荐
大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。- 用之前的redis容器实例进入试试
docker exec -it 容器ID /bin/bash
docker exec -it 容器ID redis-cli
- 一般用
-d
后台启动的程序,再用exec
进入对应容器实例
如果有多个终端,都对同一个容器执行了
docker attach
,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。
7. 从容器内拷贝文件到主机上
- 容器→主机
- docker cp 容器ID:容器内路径 目的主机路径
8. 导入和导出容器
- export 导出容器的内容留作为一个tar归档文件[对应import命令]
- import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
- 案例
- docker export 容器ID > 文件名.tar
- cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
- docker export 容器ID > 文件名.tar
七、容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。
特性: 卷设计的目的就是数据的持久化,完全独立于容器的生存周期,
因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接实施生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
运行一个带有容器卷存储功能的容器实例:
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名
可以使用docker inspect
查看容器绑定的数据卷。
权限:
rw
:读写ro
:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。
容器卷的继承:
# 启动一个容器
docker run -it --privileged=true -v /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
八、小总结
【所有命令示意图】
命令 | 英文描述 | 中文描述 |
---|---|---|
attach | Attach to a running container | 当前 shell 下 attach 连接指定运行镜像 |
build | Build an image from a Dockerfile | 通过 Dockerfile 定制镜像 |
commit | Create a new image from a container changes | 提交当前容器为新的镜像 |
cp | Copy files/folders from the containers filesystem to the host path | 从容器中拷贝指定文件或者目录到宿主机中 |
create | Create a new container | 创建一个新的容器,同 run,但不启动容器 |
diff | Inspect changes on a container’s filesystem | 查看 docker 容器变化 |
events | Get real time events from the server | 从 docker 服务获取容器实时事件 |
exec | Run a command in an existing container | 在已存在的容器上运行命令 |
export | Stream the contents of a container as a tar archive | 导出容器的内容流作为一个 tar 归档文件[对应 import] |
history | Show the history of an image | 展示一个镜像形成历史 |
images | List images | 列出系统当前镜像 |
import | Create a new filesystem image from the contents of a tarball | 从tar包中的内容创建一个新的文件系统映像[对应export] |
info | Display system-wide information | 显示系统相关信息 |
inspect | Return low-level information on a container | 查看容器详细信息 |
kill | Kill a running container | kill 指定 docker 容器 |
load | Load an image from a tar archive | 从一个 tar 包中加载一个镜像[对应 save] |
login | Register or Login to the docker registry server | 注册或者登陆一个 docker 源服务器 |
logout | Log out from a Docker registry server | 从当前 Docker registry 退出 |
logs | Fetch the logs of a container | 输出当前容器日志信息 |
port | Lookup the public-facing port which is NAT-ed to PRIVATE_PORT | 查看映射端口对应的容器内部源端口 |
pause | Pause all processes within a container | 暂停容器 |
ps | List containers | 列出容器列表 |
pull | Pull an image or a repository from the docker registry server | 从docker镜像源服务器拉取指定镜像或者库镜像 |
push | Push an image or a repository to the docker registry server | 推送指定镜像或者库镜像至docker源服务器 |
restart | Restart a running container | 重启运行的容器 |
rm | Remove one or more containers | 移除一个或者多个容器 |
rmi | Remove one or more images | 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] |
run | Run a command in a new container | 创建一个新的容器并运行一个命令 |
save | Save an image to a tar archive | 保存一个镜像为一个 tar 包[对应 load] |
search | Search for an image on the Docker Hub | 在 docker hub 中搜索镜像 |
start | Start a stopped containers | 启动容器 |
stop | Stop a running containers | 停止容器 |
tag | Tag an image into a repository | 给源中镜像打标签 |
top | Lookup the running processes of a container | 查看容器中运行的进程信息 |
unpause | Unpause a paused container | 取消暂停容器 |
version | Show the docker version information | 查看 docker 版本号 |
wait | Block until a container stops, then print its exit code | 截取容器停止时的退出状态值 |