网络知识 娱乐 从零开始学Docker(超详细讲解+案例分析)

从零开始学Docker(超详细讲解+案例分析)

参考狂神说Docker:https://www.bilibili.com/video/BV1og4y1q7M4?p=40

目录

  • 一、Docker概述
    • 1. Docker为什么出现
    • 2. Docker历史
    • 3. 对比虚拟化技术
    • 4. 为什么选择Docker
    • 引入Docker后:DevOps(开发、运维)
  • 二、Docker安装配置
    • 1. Docker的基本组成
      • 镜像(image)
      • 容器(container)
      • 仓库(repository)
    • 2. 环境准备
    • 3. 安装
      • 1. 卸载旧版本
      • 2. 安装Docker软件包
      • 3. 设置镜像仓库地址
      • 4. 安装最新版Docker Engine和容器
      • 5. 启动Docker
      • 6. 运行Hello World映像测试
    • 4. 卸载Docker方法
      • 1. 卸载Docker依赖
      • 2. 删除Docker资源
    • 5. 阿里云镜像加速
  • 三、Docker run的流程和底层原理
    • 1. 流程图
    • 2. 底层原理
      • Docker是怎么工作的?
      • Docker为什么比VM快?
  • 四、Docker常用命令
    • 1. 帮助命令
    • 2. 镜像命令
      • 查看所有镜像
      • 搜索镜像
      • 下载镜像
      • 删除镜像
    • 3. 容器命令
      • 新建容器并启动
      • 列出所有运行的容器
      • 退出容器
      • 删除容器
      • 启动停止容器
    • 4. 常用其他命令
      • 后台启动容器
      • 查看日志
      • 查看容器中的进程
      • 查看镜像元数据
      • 进入当前正在运行的容器
      • 从容器内拷贝文件到主机
  • 五、Docker命令实战
    • 1. 部署Nginx
    • 2. 部署Tomcat
    • 3. 部署es+kibana
  • 六、Portainer可视化面板
    • 1. 什么是 portainer ?
    • 2. 下载
    • 3. 访问测试
  • 七、Docker镜像讲解
    • 1. 镜像是什么
    • 2. Docker镜像加载原理
    • 3. 分层理解
      • 下载示例
      • 理解
      • 特点
    • 4. Commit镜像
  • 八、容器数据卷
    • 1. 什么是容器数据卷
    • 2. 使用数据卷
    • 实战:安装MySQL
    • 3. 具名和匿名挂载
      • 匿名挂载
      • 具名挂载(常用)
      • 拓展
    • 4. 初识Dockerfile
    • 5. 数据卷容器
  • 九、DockerFile
    • 1. DockerFile介绍
    • 2. DockerFile的构建过程
    • 3. DockerFile指令
      • 常见指令
      • CMD和ENTRYPOINT的区别
    • 4. 实战:构建自己的CentOS
      • 1. 编写dockerfile
      • 2. 通过dockerfile构建镜像
      • 3. 通过镜像启动容器
    • 5. 实战:构建自己的Tomcat
      • 1. 准备镜像文件
      • 2. 编写dockerfile文件
      • 3. 构建镜像
      • 4. 启动容器
      • 5. 进入容器
      • 6. 访问测试
      • 7. 发布项目
    • 6. 发布镜像到 Docker Hub
      • 1. 登录 Docker Hub
      • 2. 提交到 Docker Hub
    • 7. 发布镜像到阿里云镜像
      • 1. 创建阿里云镜像仓库
      • 2. 提交到阿里云镜像仓库
    • 小结
  • 十、Docker网络
    • 1. Docker网络原理
    • 2. 容器互联--link
    • 3. 自定义网络
    • 4. 网络联通
    • 实战:部署Redis集群
  • 十一、SpringBoot微服务&docker
    • 1. 构建springboot项目
    • 2. 打包应用
    • 3. 编写Dockerfile
    • 4. 构建镜像
    • 5. 启动容器测试
    • 6. 发布镜像

一、Docker概述

官网:https://www.docker.com/

文档地址:https://docs.docker.com/

仓库地址:https://hub.docker.com/
image-20210123215554401

1. Docker为什么出现

一款产品的开发往往需要多套环境,比如开发环境、测试环境以及最终的上线环境;环境的配置是时分麻烦的,每一个机器都要部署环境(Redis、ES、Hadoop集群…),尤其是各种集群的部署特别浪费时间,常常会遇到 ”在我电脑上可以运行,在你电脑上不能运行“、”版本更新导致服务不用“、”不能跨平台“ 等等大量问题,这对运维人员来说就十分棘手。

在以前,开发人员发开完成就发布一个jar或者war包,其他的都交给运维人员来做;而现在,开发即运维,打包部署上线一套流程走完:开发人员会将项目及其附带的环境一起打包jar+(Redis Jdk ES MySQL)成一整套发布,称为镜像,这样就不再需要再配置环境,直接执行一整套即可,省去环境配置的麻烦且保证了一致性;

Docker的出现就是为了解决以上问题,类似于安卓应用:

  • java – apk – 发布到应用商店 – 下载即可使用
  • java – jar(环境) – 打包项目+环境(镜像) – 发布到Docker仓库 – 下载镜像即可直接运行

image-20210123213116207
Docker 的思想来源于集装箱,打包装箱,每个箱子互相隔离

Docker 通过隔离机制,可以将服务器运行到极致


2. Docker历史

参考:Docker的前生今世

2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫 dotCloud 的公司。dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。底层技术上,dotCloud 平台利用了 Linux 的 LXC 容器技术。

img

为了方便创建和管理这些容器,dotCloud 基于 Google 公司推出的 Go 语言开发了一套内部工具,之后被命名为 Docker。Docker 就是这样诞生的。

如同 Docker 的 Logo 一样,Docker 的思想来源于集装箱。集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来,并且各种各样的货物被集装箱标准化,集装箱与集装箱之间互不影响。那么就不需要专门运送水果的船和专门运送化学用品的船了。只要这些货物封装在不同的集装箱里,就可以用一艘大船把它们都运走。

Docker 技术诞生之后,并没有引起行业的关注。而 dotCloud 公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。

正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。

有的软件一开始就是开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。2013 年 3 月,dotCloud 公司的创始人之一,Docker 之父,28 岁的 「Solomon Hykes」 正式决定,将 Docker 项目开源。
img

不开则已,一开惊人。越来越多的 IT 工程师发现了 Docker 的优点,然后蜂拥而至,加入 Docker 开源社区。Docker 的人气迅速攀升,速度之快,令人瞠目结舌。

开源当月, Docker 0.1 版本发布。此后的每一个月, Docker 都会发布一个版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式发布。

此时的 Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google、微软、Amazon、 VMware 这样的巨头们都对它青睐有加,表示将全力支持。

Docker 火了之后, dotCloud 公司干脆把公司名字也改成了 Docker Inc.


3. 对比虚拟化技术

虚拟机技术

image-20210123222839757

缺点

  • 资源占用十分大
  • 冗余步骤多
  • 启动慢

容器化技术不是模拟的一个完整的操作系统

image-20210123223050340

Docker 和 虚拟机技术 的不同:

  • 传统虚拟机技术,虚拟出一套硬件,运行一个完整的操作系统,在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟硬件,轻便快速,
  • 每个容器互相隔离,每个容器都有一个自己的文件系统,互不影响

4. 为什么选择Docker

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的在生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。


引入Docker后:DevOps(开发、运维)

Docker技术的出现以后,DevOps的概念由然而生,即开发即运维

应用更快速的交付和部署

  • 传统:一堆帮助文档,安装程序

  • Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

  • 使用Docker之后,部署应用就和搭积木一样
  • 项目打包成一个镜像,比如服务器A出现性能瓶颈,水平拓展,在服务器B上一键运行镜像

更简单的系统运维

  • 容器化之后,开发、测试环境高度一致

更高效的计算资源利用

  • Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器性能可以被压榨到极致


二、Docker安装配置

1. Docker的基本组成

img

镜像(image)

镜像就是一个只读的模板,可以通过这个模板创建容器服务,一个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)

容器(container)

  • Docker利用容器技术,独立运行的一个或一组应用。容器是用镜像创建的运行实例。
  • 它可以被启用,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。
  • 可以把容器看作是一个简易版的Linux系统(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
  • 容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

仓库(repository)

  • 仓库是集中存放镜像文件的场所。

  • 仓库和仓库注册服务器(Registry)是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签

  • 仓库分为公开仓库(public)和私有仓库(private)两种形式

  • 最大的开放仓库是国外的 Docker Hub,存放了数量庞大的镜像供用户下载。

  • 国内的公开仓库包括阿里云,网易云都有容器服务器(需要配置镜像加速)等


2. 环境准备

要安装Docker Engine,您需要CentOS 7或8的维护版本。不支持或未测试存档版本。

这里为阿里云 CentOS7 服务器,用 XShell 连接远程服务器工具

# 系统内核
[root@iZ2ze3zdx4jq8v6hetjjuxZ /]# uname -r
3.10.0-1127.13.1.el7.x86_64

# 系统版本
[root@iZ2ze3zdx4jq8v6hetjjuxZ /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

image-20210124122435184


3. 安装

官网安装教程十分详细,可参照此教程:https://docs.docker.com/engine/install/centos/

1. 卸载旧版本

sudo yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-engine

image-20210124122540474
yum报告没有安装这些软件包,即可

2. 安装Docker软件包

sudo yum install -y yum-utils

3. 设置镜像仓库地址

# 默认是国外的
sudo yum-config-manager 
    --add-repo 
    https://download.docker.com/linux/centos/docker-ce.repo
    
# 换成阿里云镜像地址
sudo yum-config-manager 
    --add-repo 
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20210124125536572

4. 安装最新版Docker Engine和容器

安装前建议先将将服务器上的软件包信息现在本地缓存,以提高安装软件的速度

sudo yum makecache fast

image-20210124131450474

# docker-ce社区版(docker-ee企业版)
sudo yum install docker-ce docker-ce-cli containerd.io

image-20210124131501379
安装完成后,Docker只安装但并未启动

5. 启动Docker

sudo systemctl start docker

然后可用docker version命令测试Docker是否安装成功,并查看Docker的版本信息
image-20210124132058970

6. 运行Hello World映像测试

sudo docker run hello-world

image-20210124132401800
我们可用docker images查看Docker所有的镜像信息
image-20210124132716312


4. 卸载Docker方法

1. 卸载Docker依赖

# 1、卸载Docker依赖: Docker Engine,CLI和Containerd软件包
sudo yum remove docker-ce docker-ce-cli containerd.io

2. 删除Docker资源

# 2、删除Docker资源: 所有镜像,容器和卷(主机上的镜像,容器,卷或自定义配置文件不会自动删除)
sudo rm -rf /var/lib/docker

/var/lib/docker为Docker的默认工作路径

5. 阿里云镜像加速

登录阿里云账号,找到产品与服务下的弹性计算中的容器镜像服务image-20210124134502593
点击进入,找到左侧栏 镜像加速器,选择对应的系统,便可看到对用的命令
image-20210124134727343
然后就可配置使用,逐条执行以下命令

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://73z5h6yb.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

image-20210124134953356
到此则配置完毕



三、Docker run的流程和底层原理

1. 流程图

2. 底层原理

Docker是怎么工作的?

  • Docker 是一个 Client-Server 结构的系统,Docket 的守护进程运行在主机上,通过Socket从客户端访问
  • DockerServer 接收到 DockerClient 的指令,就会执行这个命令

image-20210124152058394

Docker为什么比VM快?

image-20210124155953457

  1. Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

  2. Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

Docker容器虚拟机(VM)
操作系统与宿主机共享OS宿主机OS上运行宿主机OS
存储大小镜像小,便于存储与传输镜像庞大(vmdk等)
运行性能几乎无额外性能损失操作系统额外的cpu、内存消耗
移植性轻便、灵活、适用于Linux笨重、与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者


四、Docker常用命令

帮助文档地址:https://docs.docker.com/reference/
img

1. 帮助命令

# 显示docker的版本信息
docker version

# 显示docker的系统信息(包括镜像和容器数量)
docker info

# 帮助命令
docker 命令 --help

2. 镜像命令

查看所有镜像

# 查看本地主机所有的镜像
docker images

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

# 解释
REPOSITORY	镜像仓库源
TAG			镜像的标签
IMAGE ID	镜像的ID
CREATED		镜像的创建时间
SIZE		镜像大小

#可选项
--all , -a		列出所有镜像
--quiet , -q	只显示镜像ID

搜索镜像

# 搜索镜像
docker search 镜像名

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10414     [OK]       
mariadb                           MariaDB is a community-developed fork of MyS…   3865      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   762                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   524       [OK]       
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   87                   
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79                   
centurylink/mysql                 Image containing mysql. Optimized to be link…   59                   [OK]
bitnami/mysql                     Bitnami MySQL Docker Image                      47                   [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   41                   [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         37                   
prom/mysqld-exporter                                                              37                   [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   35                   
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   29                   [OK]
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   27                   
circleci/mysql                    MySQL is a widely used, open-source relation…   20                   
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   20                   
arey/mysql-client                 Run a MySQL client from a docker container      17                   [OK]
mysql/mysql-router                MySQL Router provides transparent routing be…   17                   
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   10                   [OK]
yloeffler/mysql-backup            This image runs mysqldump to backup data usi…   7                    [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6                    
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   3                    
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                2                    [OK]
jelastic/mysql                    An image of the MySQL database server mainta…   1                    
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   1                    [OK]

# 可选项
-f, --filter filter   根据提供的条件过滤输出
# 例如搜索STARS大于3000的
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker search mysql -f STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10414     [OK]       
mariadb   MariaDB is a community-developed fork of MyS…   3865      [OK]   

下载镜像

# 下载镜像
docker pull 镜像名[:tag]

测试:

# 不指定版本号默认下载最新版latest
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete	#分层下载,docker image的核心:联合文件系统
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest	#真实地址

# 指定版本号下载
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists 
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

下载完再次查看所有镜像,即可看到刚下载的镜像

image-20210125201641758

删除镜像

# 删除镜像
docker rmi
 `docker rmi -f 镜像id`:删除指定镜像
 `docker rmi -f 镜像id 镜像id 镜像id`:删除指定多个镜像
 `docker rmi -f $(docker images -aq)`:删除全部镜像

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         5.7       a70d36bc331a   5 days ago      449MB
mysql         latest    c8562eaf9d81   5 days ago      546MB
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
#删除指定镜像
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker rmi -f a70d36bc331a 
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5
Deleted: sha256:50c77bf7bcddd1f1d97789d80ac2404eec22c860c104e858620d2a2e321f0ef7
Deleted: sha256:14244329b83dfc8982398ee4104a548385652d2bffb957798ff86a419013efd6
Deleted: sha256:6d990477f90af28473eb601a9bca22253f6381e053c5a8edda0a4f027e124a3c
Deleted: sha256:ee0449796df204071589162fc16f8d65586312a40c68d1ba156c93c56f5e5ce8
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    c8562eaf9d81   5 days ago      546MB
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
#删除所有镜像
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker rmi -f $(docker images -aq)
Untagged: mysql:latest
Untagged: mysql@sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Deleted: sha256:c8562eaf9d81c779cbfc318d6e01b8e6f86907f1d41233268a2ed83b2f34e748
Deleted: sha256:1b649b85960473808c6b812fc30c3f6a3ff1c0ffdcba5c9435daf01cf7d5373a
Deleted: sha256:19cc889447050c16c797fd209fa114ee219de23facb37c00d4137a4ed4aad922
Deleted: sha256:3c793c06a026d276cf56a6a6a75527026ed9eafa7a7d21a438f7d5ed2314148e
Deleted: sha256:1e1cd89a2bc183a7fea3dab0b543e9924278321ad0921c22cc088adbf3c2e77b
Deleted: sha256:83b2015dfd000588c7c947b2d89b3be7a8e5a3abc6ab562668c358033aa779ec
Deleted: sha256:d08533f1e2acc40ad561a46fc6a76b54c739e6b24f077c183c5709e0a6885312
Deleted: sha256:4f9d91a4728e833d1062fb65a792f06e22e425f63824f260c8b5a64b776ddc38
Deleted: sha256:20bf4c759d1b0d0e6286d2145453af4e0e1b7ba3d4efa3b8bce46817ad4109de
Deleted: sha256:a9371bbdf16ac95cc72555c6ad42f79b9f03a82d964fe89d52bdc5f335a5f42a
Deleted: sha256:5b02130e449d94f51e8ff6e5f7d24802246198749ed9eb064631e63833cd8f1d
Deleted: sha256:ab74465b38bc1acb16c23091df32c5b7033ed55783386cb57acae8efff9f4b37
Deleted: sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

3. 容器命令

有了镜像才能够创建容器,这里下载一个centos镜像为以下测试做准备

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

新建容器并启动

# 新建容器并启动
docker run [可选参数] image

# 参数说明
--name="Name"	 容器名字,用于区分容器
-d				后台方式运行
-it				使用交互方式运行,进入容器查看内容
-p				指定容器端口(小写)
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口(最常用)
	-P 容器端口
	容器端口
-P				随机执行端口(大写)

测试:

#测试,启动进入容器
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker run -it centos /bin/bash
[root@22d0484830c9 /]# ls	查看容器内的centos,基础版本,很多命令不完善
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#退出容器到主机
[root@22d0484830c9 /]# exit
exit
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# ls
3000  cp  cp.tar.gz  f.sh  hello.c  install.sh  login.sh  read.sh  time.sh

列出所有运行的容器

# 列出所有运行的容器
docker ps [可选参数]

# 参数说明
-a		列出当前正在运行以及历史运行过的容器
-n=?	显示最近创建的容器
-q		只显示容器编号
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                          PORTS     NAMES
22d0484830c9   centos         "/bin/bash"   About a minute ago   Exited (0) About a minute ago             condescending_mcnulty
3efe49d28bdd   bf756fb1ae65   "/hello"      7 hours ago          Exited (0) 7 hours ago                    confident_babbage
40fc94e7b0a4   bf756fb1ae65   "/hello"      7 months ago         Exited (0) 7 months ago                   inspiring_lovelace
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
22d0484830c9   centos    "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             condescending_mcnulty
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -aq
22d0484830c9
3efe49d28bdd
40fc94e7b0a4

退出容器

# 容器停止并退出
exit

# 容器不停止退出
Ctrl+p+q

删除容器

# 删除指定容器,不能删除正在运行的容器,强制删除用rm -f
docker rm 容器id	

# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -aq
6518909c5fb2
3dfd73738e3b
22d0484830c9
3efe49d28bdd
40fc94e7b0a4
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker rm 6518909c5fb2
6518909c5fb2
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -aq
3dfd73738e3b
22d0484830c9
3efe49d28bdd
40fc94e7b0a4
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker rm -f $(docker ps -aq)
3dfd73738e3b
22d0484830c9
3efe49d28bdd
40fc94e7b0a4
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -aq

启动停止容器

docker start 容器id		# 启动容器
docker restart 容器id		# 重启容器
docker stop 容器id		# 停止正在运行的容器
docker kill 容器id		# 强制停止当前容器

4. 常用其他命令

后台启动容器

# 后台启动容器
docker run -d 容器名

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker run -d centos
9606d8980f73ff313c64388f5f82e036072cc7191c3305ab80b371e37d8b1ad7
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
9606d8980f73   centos    "/bin/bash"   54 seconds ago   Exited (0) 53 seconds ago             youthful_dubinsky
  • 问题:后台启动容器,再用 docker ps 查看发现容器停止
  • 原因:docker 容器使用后台运行,就必须有一个前台进程;如果仅仅后台启动,没有应用来提供服务,就会自动停止

查看日志

docker logs [可选参数] 容器ID
      --details        显示提供给日志的其他详细信息
  -f, --follow         跟踪日志输出
  -n, --tail string    指定要显示的日志条数 (默认为全部)
  -t, --timestamps     显示时间戳

测试:

# 后台启动容器,同时执行脚本不停打印zsr
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker run -d centos /bin/bash -c "while true;do echo zsr;sleep 1;done"
980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02
# 查看运行的容器,此时可以查看到
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
980daf06de58   centos    "/bin/bash -c 'while…"   6 seconds ago   Up 6 seconds             distracted_germain
# 查看日志信息,显示时间戳,指定显示10条日志
[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker logs -t -n 10 980daf06de58 
2021-01-25T04:53:47.619357189Z zsr
2021-01-25T04:53:48.621476433Z zsr
2021-01-25T04:53:49.623833490Z zsr
2021-01-25T04:53:50.626253957Z zsr
2021-01-25T04:53:51.628526460Z zsr
2021-01-25T04:53:52.630878536Z zsr
2021-01-25T04:53:53.633046201Z zsr
2021-01-25T04:53:54.635296632Z zsr
2021-01-25T04:53:55.637614256Z zsr
2021-01-25T04:53:56.640358130Z zsr

查看容器中的进程

# 查看容器中的进程
docker top 容器ID

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker top 980daf06de58
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                28359               28339               0                   12:52               ?                   00:00:00            /bin/bash -c while true;do echo zsr;sleep 1;done
root                29065               28359               0                   12:58               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像元数据

# 查看镜像元数据
docker inspect 容器ID

测试:

[root@iZ2ze3zdx4jq8v6hetjjuxZ ~]# docker inspect 980daf06de58
[
    {
        "Id": "980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02",
        "Created": "2021-01-25T04:52:46.079489883Z",
        "Path": "/bin/bash",
        "Args": [
            "-c",
            "while true;do echo zsr;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 28359,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-01-25T04:52:46.469990116Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02/hostname",
        "HostsPath": "/var/lib/docker/containers/980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02/hosts",
        "LogPath": "/var/lib/docker/containers/980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02/980daf06de5878e2d3e5c048c7de92817e09e92f20d2d6242ecb15b9b7a5bd02-json.log",
        "Name": "/distracted_germain",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps"