安装Docker CE
对于个人来说,一般只用到社区版(Community Edition),也就是Docker CE
,安装可以参考官方文档
安装完成后可以执行docker info
或docker version
查看是否安装成功
Docker
在Linux安装后默认会以服务的形式启动,如果没有启动可以手动执行systemctl start docker
,然后就可以执行docker命令了
Docker的常用操作、命令
帮助类命令
用于自行查看学习Docker
的各种命令及其含义和使用方法
docker --help # 查看docker的全部命令
docker xxx --help # 查看docker中某个具体命令的使用,类似套娃
# 例如docker rm --help
镜像类命令
我们要下载使用的应用程序都是被Docker
打包为镜像存放在在仓库(repository)里,默认为Docker Hub,实际上我们要用某个应用程序都要去仓库里下载镜像
列出本地主机的镜像
docker images # 列出本地主机上的所有镜像
# or
docker image ls # 同上
docker images -a # 列出本地所有镜像(包含历史映像层)
docker images -q # 只显示镜像ID
去仓库中查找所需镜像
docker search xxx # xxx代表镜像名,用于去仓库中查找镜像
docker search --limit N xxx # 表示只列出N个镜像
将镜像从仓库下拉到本地
docker pull xxx # 把xxx镜像拉(下载)到本地,就是下载到电脑上
# 注意这里的xxx可以带版本号,因此可以:
docker pull xxx:1.1.1 # 1.1.1表示版本号,根据需要更换,不带版本号默认为最新版(latest)
查看容器/镜像/数据卷所占的空间
docker system df # 查看容器/镜像/数据卷所占的空间
删除本地镜像
docker rmi xxx # 删除某个镜像,xxx可以用镜像名或ID
docker rmi -f xxx # -f表示强制删除
docker rmi -f xxx1 xxx2 xxx3 # 删除多个
docker rmi -f $(docker images -aq) # 删除全部,注意这是docker支持的参数续传,$(docker images -aq)可以列出全部的镜像ID
容器类命令
下载镜像的目的当然就是用它来创建并启动容器
创建并启动容器
docker run image_name # 启动容器
docker run -d image_name xxx # xxx表示容器中要运行的程序或命令,不加的话会运行生成镜像时设置的默认命令
docker run --name image_name # --name指定容器的名字
docker run -d image_name # -d表示启动守护进程也就是后台运行,并返回容器ID
docker run -it image_name /bin/bash # -i表示以交互模式运行,-t表示分配一个伪终端,最后/bin/bash表示用于交互的shell
docker run -p host_port:container_port image_name # -p表示添加端口映射,比如8080:80表示将容器的80端口映射到本地8080端口
要注意的是,如果在启动容器时在最后加上了命令或者要执行的程序名,会覆盖掉容器默认要执行的命令,比如docker run -it nginx /bin/bash
,这样的话容器进程就变成了/bin/bash
那这就有一个问题,我启动了nginx
容器后,我要怎么进到里面配置呢,这时我们可以先使用docker run -d nginx
在后台启动,然后使用后面要讲的docker exec
进入容器
另外,关于-d
参数启动守护进程要说明的一下,就是有时候使用-d
后发现容器启动后就自动关闭了,这是因为如果我们容器内运行的进程不是一直挂起的命令,比如docker run -d ubuntu /bin/bash
,Docker
默认是会自动退出的,这时就需要-it
参数告诉Docker
,我还需要交互,不要中断
列出(运行中的)容器
docker ps # 列出正在运行的容器
docker ps -a # 列出正在运行的容器和(历史上运行过的)容器
docker ps -l # 列出最近创建的容器
docker ps -n N # 列出最近创建的N个容器
docker ps -q # 静默模式,只显示容器ID
退出容器
对于使用docker run -it ubuntu /bin/bash
进入的容器,有两种退出方式:
执行
exit
表示退出并停止容器执行
Ctrl + p + q
退出容器但容器不停止,也就是将容器转到后台运行
启动停止的容器,重启/停止/删除容器
docker start 容器ID或容器名 # 启动停止的容器
docker restart 容器ID或容器名 # 重启容器
docker stop 容器ID或容器名 # 停止容器
docker kill 容器ID或容器名 # 强制停止容器
删除容器
docker rm 容器ID或容器名 # 删除停止的容器
docker rm -f 容器ID或容器名 # 强制删除容器,包括正在运行的
docker rm -f $(docker ps -aq) # 强制删除所有容器
# or
docker ps -aq | xargs docker rm -f # 同上
查看容器日志
注意,这个适用于后台运行的容器,并且容器进程挂起并且会随时打印日志
docker logs 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器信息
docker inspect 容器ID
进入正在运行的容器并交互
docker exec -it 容器ID /bin/bash # 进入正在运行的容器,并启动一个新的/bin/bash进行交互
docker attach 容器ID # 直接容器启动命令的终端
关于这两条命令的区别做一下解释:
docker exec -it 容器ID /bin/bash
实际上是打开了一个新的shell
用来交互(启动了一个新的进程),与容器进程是什么无关,使用exit
退出后不会导致容器停止
docker attach 容器ID
实际上是直接进入了容器启动命令的终端,不会启动新的进程,如果用exit
退出,那么容器也会停止。如果容器进程是shell
进程,那么会直接进入这个shell
;但如果容器进程不是shell
,使用attach
进入容器就不会得到交互式终端,而是直接进入该进程(比如Nginx
的容器进程),这时候由于不是shell
终端,如果使用Ctrl + c
退出实际上就把容器进程停掉了,容器也就停止了PS:也就是说
attach
进入的是容器进程,不一定是shell
所以一般不要用docker attach
,通常情况使用-d
后台启动,然后docker exec -it 容器ID /bin/bash
进入容器实例
拷贝容器内文件到宿主机
docker cp 容器ID:容器内文件的路径 宿主机路径
导入和导出容器
可以将配置好的容器导出为tar
包,这个tar
包可以重新生成容器镜像,再利用这个镜像启动之前配置好的容器(新的容器,但配置和之前一样)
docker export 容器ID > xxx.tar # 导出容器
cat xxx.tar | docker import - 镜像用户/镜像名:镜像版本号 # 把export导出的tar包恢复为容器镜像,然后可以通过该镜像启动容器
但是测试发现,tar
包恢复的镜像启动容器时需要指定容器进程,也就是说这里似乎抹杀掉了原容器默认运行的容器进程(如果有的话)