Docker常用命令

一、Docker概念介绍

1. Docker架构

从上图得知,Docker分为三部分,客户端Docker服务端仓库

1.1 客户端

平常我们使用的就是客户端,通过客户端命令和Docker引擎进行交互

Docker 是一个客户端-服务器(C/S)架构程序。

Docker 客户端只需要向 Docker 服务端发起请求,服务端将完成所有的工作并返回相应结果。

Docker 提供了一个命令行工具 docker 以及一整套 RESTful API。

比如:

1
2
docker pull 
docker run

客户端可以和服务端在一台宿主机上,也可以不在

1.2 Docker服务端

Docker服务端 又称为Docker主机,Docker引擎,Docker守护进程。

依托于宿主机,守护进程,用于管理镜像,容器,执行客户端命令等。

1.3 仓库Registry

Docker有两个重要的概念镜像容器

镜像可以理解为就是软件安装包,容器就是软件安装完成后可运行的状态。

既然镜像是软件安装包,那么这个安装包从哪下载呢?

Docker推出了Registry这个概念,一般有人也称为是 注册中心,当我们需要发布Docker镜像(Docker专用软件安装包)的时候,就需要将镜像发布到注册中心上,这样其他人就可以下载使用。

Registry 分为公共私有两种。Docker 公司运营公共的 Registry 叫做 Docker Hub,地址为:https://hub.docker.com

  • 一个 Docker Registry 中可以包含多个仓库(Repository)

  • 每个仓库可以包含多个标签(Tag)

  • 每个标签对应一个镜像

通常,一个仓库会包含同一个软件不同版本的镜像,而标签对应该软件的各个版本。我们可以通过 「<仓库名>:<标签>」 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 「latest」 作为默认标签。

2. 镜像

上面我们提到,镜像可以理解为就是软件安装包,但是这个软件安装包和我们理解意义上是不一样的,一个Docker镜像是一个完整的操作系统的描述

什么意思呢?

就是一个Docker镜像描述了,需要运行的程序以及运行程序所处的操作系统

那不同的镜像区别在哪里呢?镜像中的操作系统中安装的软件不同,运行的程序不同。

当然镜像只是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。

真正运行,我们需要通过镜像启动容器

容器才是真正的可运行的操作系统。

Docker 把 App 文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:

  • 多个 App 可以共用相同的底层镜像(初始的操作系统镜像);
  • App 运行时的 IO 操作和镜像文件隔离;
  • 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个 App 镜像可以用来运行无数个不同业务的容器。

3. 容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等。

注意:容器运行需要指定镜像,当容器运行后,一个容器就相当于一个虚拟的完整的操作系统,比如你通过mysql的镜像来安装mysql,当mysql的容器启动后,就相当于开启了一个操作系统,mysql只是安装在此容器内部的操作系统中,我们可以进入容器内部操作mysql(和正常操作系统一致),也可以通过docker命令来操作

4. 安装docker

官方文档教程:https://docs.docker.com/engine/install/centos/

  1. 卸载原有的版本

    1
    2
    3
    4
    5
    6
    7
    8
    sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  2. 安装 yum-utils

    1
    sudo yum install -y yum-utils
  3. 添加阿里云镜像

    1
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. 安装

    1
    sudo yum install docker-ce docker-ce-cli containerd.io
  5. 启动并加入开机启动

    1
    2
    3
    sudo systemctl start docker

    sudo systemctl enable docker

二、Docker常用命令

官方文档:https://docs.docker.com/reference/

1. 查看镜像

1
2
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
  • REPOSITORY:镜像在仓库中的名称
  • TAG:镜像标签(一般是软件的版本号)
  • IMAGE ID:镜像 ID
  • CREATED:镜像的创建日期(不是获取该镜像的日期)
  • SIZE:镜像大小

2. 搜索镜像

如果需要下载镜像,但是又不知道docker有没有,可以通过搜索镜像命令进行查看。

1
[root@VM-0-15-centos ~]# docker search 镜像名称

比如:

  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反映一个镜像的受欢迎程度
  • OFFICIAL:是否为官方构建
  • AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的。

3. 拉取镜像

拉取镜像就是从中央仓库下载镜像到本地。

1
[root@VM-0-15-centos ~]# docker pull 镜像名称:tag

如果不声明tag,默认拉取latest版本。

可以通过https://hub.docker.com/ 搜索该镜像,查看支持的 tag 信息。

比如我们要下载centos7的镜像:

1
[root@VM-0-15-centos ~]# docker pull centos:7

4. 镜像仓库加速

因为docker的网站是国外的,有时候访问速度较慢,我们可以设置镜像仓库加速,提升获取Docker官方镜像的速度。

这里我们选用阿里云,阿里云搜索容器镜像服务

选择centos,因为我的操作系统是centos的。

根据提示,配置镜像加速器

5. 删除镜像

1
[root@VM-0-15-centos ~]# docker rmi 镜像id
1
[root@VM-0-15-centos ~]# docker rmi 镜像名称
1
[root@VM-0-15-centos ~]# docker rmi 镜像名称:tag

使用镜像id删除的时候,输入id的前几位即可

删除镜像的时候,必须保证没有镜像被使用,也就是说没有通过镜像创建容器,如果有,则必须先删除容器

docker images -q 可以查询到所有镜像的 ID

1
2
#以下命令可以删除 所有镜像
docker rmi `docker images -q`

6. 查看正在运行的容器

1
2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • CONTAINER ID:容器 ID
  • IMAGE:所属镜像
  • COMMAND:命令
  • CREATED:创建时间
  • STATUS:容器状态 Up运行 Exited退出
  • PORTS:端口
  • NAMES:容器名称

7. 查看所有的容器

不管是运行的还是未运行的

1
2
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8. 其他容器查看命令

1
2
3
4
#查看退出的容器
docker ps -f status=exited
#查看最后一次运行的容器
docker ps -l

9. 容器启动命令

1
[root@localhost ~]# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • -i:表示运行容器;
  • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;
  • --name:为创建的容器命名;
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;
  • -d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里);
  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。
  • -P:随机使用宿主机的可用端口与容器内暴露的端口映射。

9.1 创建并进入容器

1
docker run -it --name 容器名称 镜像名称:标签 /bin/bash

注意:Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。

退出命令 exit,一旦退出容器停止运行

示例:

1
docker run -it --name mszlu_mysql mysql:5.7 /bin/bash

9.2 守护方式创建容器

1
docker run -di --name 容器名称 镜像名称:标签

此方式创建完成后,会启动容器,但不会进入容器,容器一直运行,除非使用docker stop命令关闭容器

9.3 守护方式进入容器

1
2
# 必须是容器正在运行
docker exec -it 容器名称|容器ID /bin/bash

10. 停止与启动容器

1
2
3
4
# 停止容器
docker stop 容器名称|容器ID
# 启动容器
docker start 容器名称|容器ID

11. 文件拷贝

如果我们需要将文件拷贝到容器内可以使用 cp 命令。

1
docker cp 需要拷贝的文件或目录 容器名称:容器目录

也可以将文件从容器内拷贝出来。

1
docker cp 容器名称:容器目录 需要拷贝的文件或目录

12. 容器数据卷

数据卷这个概念非常重要

比如有以下场景:

  1. 配置文件需要频繁修改
  2. 容器内部的数据需要备份
  3. 删除容器不希望删除数据

上述的需求,有了数据卷之后,变的非常容易。

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。

但是容器被删除的时候,宿主机的内容并不会被删除,因为底层是通过拷贝实现的。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响,同理,底层是拷贝实现的。

容器与宿主机之间的数据卷属于引用的关系,数据卷是从外界挂载到容器内部中的,所以可以脱离容器的生命周期而独立存在,正是由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。

12.1 命令

创建容器添加 -v 参数,格式为宿主机目录:容器目录,例如:

1
2
3
4
docker run -di -v /mszlu/docker/centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名

注意:目录挂载操作可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 SELinux 把权限禁掉了,在 docker run 时通过 --privileged=true 给该容器加权限来解决挂载的目录没有权限的问题。

12.2 匿名挂载

匿名挂载只需要写容器目录即可,宿主机对应的目录会在 /var/lib/docker/volumes 中生成。

1
2
3
4
# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls

如果需要知道当前容器的挂载情况:

1
# docker inspect centos7-02(容器名称)

12.3 具名挂载

具名挂载就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成。

1
2
3
4
# 具名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls

通过 docker volume inspect 数据卷名称 可以查看该数据卷对应宿主机的目录地址。

12.4 只读/读写

1
2
3
4
# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名

12.5 数据卷容器(数据卷继承)

1
2
3
4
5
# 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-from centos7-01 --name centos7-04 centos:7
docker run -di --volumes-from centos7-01 --name centos7-05 centos:7

上述 centos7-01称为数据卷容器

这样做的好处就是,如果需要创建大量的相同目录的映射关系,可以简化命令便于操作和记忆

13. 查看容器ip地址

我们可以通过以下命令查看容器的元信息。

1
docker inspect 容器名称|容器ID

  也可以直接执行下面的命令直接输出 IP 地址。

1
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID

14. 删除容器

1
2
3
4
5
# 删除指定容器
docker rm 容器名称|容器ID
# 删除多个容器
docker rm 容器名称|容器ID 容器名称|容器ID