目录
1、docker的概述
1.1、概念
1.2、优点
2、docker的安装
2.1、卸载旧版本
2.2、配置yum资源库
2.3、安装Docker引擎
2.4、启动docker引擎
2.5、卸载Docker
3、docker的基本指令
3.1、启动类命令
3.2、帮助类命令
3.3、镜像命令
3.3.1、列出本地主机上的镜像
3.3.2、在远程仓库中搜索镜像
3.3.3、下载镜像
3.3.4、查看占据的空间
3.3.5、删除镜像
3.3.6、虚悬镜像
3.3.7、命令自动补
3.4、容器命令
3.4.1、新建启动容器
3.4.2、启动交互式容器
3.4.3、启动守护式容
3.4.4、列出正在运行的容器
3.5、容器其他启停操作
3.5.1、启动已经停止的容器
3.5.2、重启容器
3.5.3、停止容器
3.5.4、强制停止容器
3.5.5、删除容器
3.5.5.1、删除已经停止的容器:
3.5.5.2、强制删除正在运行的容器:
3.5.5.3、一次删除多个容器实例:
3.5.6、查看容器日志
3.5.7、查看容器内运行的进程
3.5.8、查看容器内部细节
3.5.9、进入正在运行的容器
3.5.10、容器和宿主机文件拷贝
3.5.11、导入和导出容器
3.5.12、将容器生成新镜像
3.5.13、容器数据卷
4、所有命令示意图
docker是基于GO语言实现的云开源项目,能够对应用组件进行封装、分发、部署和运行等生命周期管理,做到一次镜像,处处运行。
docker运行速度快:与虚拟机相比,拥有更少的抽象层,即docker容器直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。
centos安装docker:
参考官网:Install Docker Engine on CentOS | Docker Docs
如果之前安装过Docker,需要先卸载旧版本:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
旧版本的Docker引擎包可能叫做:docker
、docker-engine
。
新版本的Docker引擎包叫做:docker-ce
安装yum-config-manager
:
# yum-util提供yum-config-manager功能
sudo yum install -y yum-utils
配置docker的资源库地址:
官方地址:(比较慢,不推荐)
# 在yum资源库中添加docker资源库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
阿里云镜像地址:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
阿里云官网提供了很多资源镜像,镜像地址:https://mirrors.aliyun.com
,进入之后可以选择自己需要的资源进行配置
安装最新版本的Docker引擎、Docker客户端:
# docker-ce是Docker引擎,docker-ce-cli是客户端
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
此时,默认安装的docker引擎、客户端都是最新版本。
如果要安装指定版本:
# 查询版本列表
yum list docker-ce --showduplicates | sort -r
# 指定版本安装17.09.0.ce版
# sudo yum install docker-ce- docker-ce-cli- containerd.io docker-compose-plugin
sudo yum install docker-ce-17.09.0.ce docker-ce-cli-17.09.0.ce containerd.io docker-compose-plugin
如果没有启动Docker引擎,那么执行 docker version
查看版本号时,只能看到 Client: Docker Engine
(Docker引擎客户端)的版本号。
启动Docker引擎:
# 新版本的Docker就是一个系统服务,可以直接使用启动系统服务方式启动
systemctl start docker
# 此时查看docker版本,可以看到Server: Docker Engine(Docker引擎)版本号
docker version
卸载Docker步骤:
1.关闭服务
systemctl stop docker
2.使用yum
删除docker引擎
sudo yum remove docker-ce docker-ce-cli containerd.io
3.删除镜像、容器、卷、自定义配置等文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
启动docker:
systemctl start docker
停止Docker:
systemctl stop docker
重启Docker
systemctl restart docker
查看状态:
systemctl status docker
设置开机自启:
systemctl enable docker
查看Docker版本:
docker version
查看Docker概要信息:
docker info
查看Docker总体帮助文档:
docker --help
查看docker具体命令帮助文档:
docker 具体命令 --help
docker images
参数:
-a
:列出所有镜像(含历史镜像)-q
:只显示镜像ID-f
:过滤(默认取docker hub中搜索)
docker search 镜像名称
参数:
-f
:过滤--limit 数量
:只展示前几项docker pull 镜像名称[:tag]
不加 tag 时,默认下载最新的镜像(即tag为latest
)。
查看镜像/容器/数据卷所占的空间:
docker system df
docker rmi 镜像名称/ID
可以使用空格分隔,删除多个镜像:
docker rmi 镜像1 镜像2 镜像3
删除全部镜像:
docker rmi -f $(docker images -qa)
仓库名、标签都是
的镜像,俗称虚悬镜像(dangling image)。
docker支持命令自动补全功能,当输入镜像名前几位时,可以按tab
键自动补全镜像名称、tag等。
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub
如果按下tab
时没有自动补全,可以按以下步骤操作:
1、检查是否安装了bash-completion
(命令补全增强包)
# 检查有 /usr/share/bash-completion/bash_completion 这个文件
ls /usr/share/bash-completion/bash_completion
2、如果有/usr/share/bash-completion
目录,但是没有/usr/share/bash-completion/bash_completion
文件(centos6为/etc/bash_completion
文件),则需要安装bash-completion
yum -y install bash-completion
3、检查是否安装了docker的自动补全
# 检查/usr/share/bash-completion/completions文件夹下是否有docker开头的自动补全
# docker安装完后会在该文件夹下生成自动补全文件docker
# 如果安装了docker-compose,则该文件夹下还会有 docker-compose文件
ll /usr/share/bash-completion/completions/docker*
4、如果已经安装了docker自动补全,使用source
命令使其生效
source /usr/share/bash-completion/completions/docker
5、再次使用tab
查看是否可以自动补全
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub
6、如果有报错,且报错中提示_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
7、再次使用tab
查看是否可以自动补全
# 如果镜像中有ubuntu,查看输入ub按下tab是否可以补全
docker run ub
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用的参数:
--name
:为容器指定一个名称-d
:后台运行容器并返回容器ID,也即启动守护式容器-i
:以交互模式(interactive)运行容器,通常与-t
同时使用-t
:为容器重新分配一个伪输入终端(tty),通常与-i
同时使用。也即启动交互式容器(前台有伪终端,等待交互)-e
:为容器添加环境变量-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
以交互方式启动ubuntu镜像
# -i 交互模式
# -t 分配一个伪输入终端tty
# ubuntu 镜像名称
# /bin/bash(或者bash) shell交互的接口
docker run -it ubuntu /bin/bash
退出交互模式:
方式1:
# 在交互shell中exit即可退回宿主机
exit;
方式2:使用快捷键ctrl
+ P
+ Q
方式1 退出后,容器会停止;
方式2 退出后容器依然正在运行。
大部分情况下,我们系统docker容器服务时在后台运行的,可以通过-d
指定容器的后台运行模式:
docker run -d 容器名
注意事项:
如果使用docker run -d ubuntu
尝试启动守护式的ubuntu,会发现容器启动后就自动退出了。
因为Docker容器如果在后台运行,就必须要有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(例如top
、tail
),就会自动退出。
列出所有正在运行的容器:
docker ps [OPTIONS]
常用参数:
-a
:列出当前所有正在运行的容器+历史上运行过的容器-l
:显示最近创建的容器-n
:显示最近n个创建的容器-q
:静默模式,只显示容器编号docker start 容器ID或容器名
docker restart 容器ID或容器名
docker stop 容器ID或容器名
docker kill 容器ID或容器名
docker rm 容器ID或容器名
删除容器是 docker rm,删除镜像是 docker rmi,注意区分。
docker rm -f 容器ID或容器名
docker rm -f ${docker ps -a -q}
# 或者
docker ps -a -q | xargs docker rm
docker logs 容器ID或容器名
docker top 容器ID或容器名
docker inspect 容器ID或容器名
进入正在运行的容器,并以命令行交互:
docker exec -it 容器ID bashShell
重新进入:
docker attach 容器ID
docker exec
和 docker attach
区别:
attach
直接进入容器启动命令的终端,不会启动新的进程,用exit
退出会导致容器的停止exec
是在容器中打开新的终端,并且可以启动新的进程,用exit
退出不会导致容器的停止如果有多个终端,都对同一个容器执行了 docker attach
,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示。
容器内文件拷贝到宿主机:
docker cp 容器ID:容器内路径 目的主机路径
宿主机文件拷贝到容器中:
docker cp 主机路径 容器ID:容器内路径
export
:导出容器的内容流作为一个tar归档文件(对应import
命令);
import
:从tar包中的内容创建一个新的文件系统再导入为镜像(对应export
命令);
示例:
# 导出
# docker export 容器ID > tar文件名
docker export abc > aaa.tar
# 导入
# cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号
cat aaa.tar | docker import - test/mytest:1.0.1
docker commit
提交容器副本使之成为一个新的镜像。
docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用docker commit
将新的这个容器快照生成一个镜像。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]
Docker挂载主机目录,可能会出现报错:cannot open directory .: Perission denied
。
解决方案:在命令中加入参数 --privileged=true
。
CentOS7安全模块比之前系统版本加强,不安全的会先禁止,目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了。如果要开启,一般使用 --privileged=true
,扩大容器的权限解决挂载没有权限的问题。也即使用该参数,容器内的root才拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFS,提供一些用于持续存储或共享数据。
特性:卷设计的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
运行一个带有容器卷存储功能的容器实例:
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名
可以使用docker inspect
查看容器绑定的数据卷。
权限:
rw
:读写ro
:只读。如果宿主机写入内容,可以同步给容器内,容器内可以读取。容器卷的继承:
# 启动一个容器
docker run -it --privileged=true /tmp/test:/tmp/docker --name u1 ubuntu /bin/bash
# 使用 --volumes-from 继承 u1的容器卷映射配置
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu