学习完容器的相关概念,开始学习docker的核心组件分别是Docker客户端、Docker服务器、Docker镜像、Docker容器、仓库。
学习之前,我们先思考一个问题,目前开发面临着怎样的挑战?
随着系统在架构上的调整,已经变得非常复杂了,之前采用的三层架构,开发将代码告诉运维,运维打包好后部署在几台物理服务器上,暴露出的问题很少,而今天随着应用的增多,各类的服务比如MQ、DB、Redis、应用等,为了方便管理,这些不同的服务有可能会部署到不同的环境,一方面这些服务有所依赖的库和软件包,另一方面存在多种部署环境,这就产生了一个问题:如何让这些服务不用考虑运行环境的因素,能够顺利的运行?
docker的出现正是解决了类似的问题,它的思想将各类软件打包,为代码提供了一个基于容器标准化运输系统。将任何应用及其所依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。
对于开发人员: Build Once 、Run Anywhere,开发人员只需要为应用创建一次运行环境。然后打包成容器便可在其他机器上运行。
对于运维人员: Configure Once、Run Anything
只需要配置好标准的runtime运行环境、服务器就可以运行任何容器。容器消除了开发、测试、生产环境的不一致性,提高工作效率。
Docker采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。
Docker客户端最常用的就是docker命令,如docker image docker run等。
Docker服务器指的是docker 运行在服务器上的后台进程
如systemctl status docker.service
可将Docker镜像看成只读模板,通过它可以创建Docker容器。
镜像有多种生成方法:
(1)从无到有开始创建镜像;
(2)下载并使用别人创建好的现成的镜像;
(3)在现有镜像上创建新的镜像。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统
各个选项说明:
REPOSITORY:表示镜像的仓库源 TAG:镜像的标签版本号 IMAGE ID:镜像ID CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
·
OPTIONS说明: ·
-a :列出本地所有的镜像(含历史映像层) ·
-q :只显示镜像ID
· – limit : 只列出N个镜像,默认25个 · docker search --limit 5 redis
docker pull
docker pull 某个XXX镜像名字 · 下载镜像 · docker pull 镜像名字[:TAG] ·
docker pull 镜像名字 · 没有TAG就是最新版 · 等价于 · docker pull 镜像名字:latest
docker pull ubuntu
例:拉取redis:5.0版本的镜像
docker pull redis:5.0
扩展
docker system df 查看镜像/容器/数据卷所占的空间
docker images 的镜像相加等于 docker system df 的镜像所占空间
常用命令
· docker rmi 某个XXX镜像名字ID
· 删除镜像
· 删除单个
· docker rmi -f 镜像ID
· 删除多个
· docker rmi -f 镜像名1:TAG 镜像名2:TAG
· 删除全部
· docker rmi -f $(docker images -qa)
扩展:
什么是docker虚悬镜像是什么?
仓库名、标签都是的镜像,俗称虚悬镜像dangling image,容器有时候在构建过程中的不成功会产生 虚悬镜像。
从镜像容器角度,可以把容器看做是一个简易版的 Linux
环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 Docker容器就是Docker镜像的运行实例。
用户可以通过CLI(Docker)、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
镜像与容器的关系
镜像相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
容器常用命令
· docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
--name="容器新名字" 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
启动交互式容器(前台命令行)
使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
centos : centos 镜像
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
列出当前所有正在运行的容器
· docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-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
仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。
类似于 Maven仓库,存放各种jar包的地方; github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker
Hub(https://hub.docker.com/), 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
Docker常用命令
帮助启动类命令