Docker基本概念

在使用Docker前,首先要先知道Docker中这几个常用的概念:

镜像:镜像是文件,只读的,提供了运行完整软硬件应用程序的集装箱。

容器:是镜像的实例,由Docker负责创建,容器之间彼此隔离,容器可以被创建,删除,停止。

仓库:用来保存镜像,可以理解为代码控制中的代码仓库,Docker官方仓库名字是Docker Hub

更多内容,通过访问Docker官方网站获取:https://www.docker.com/

Docker安装

使用Docker首先我们要安装Docker,Docker Engine(Enterprise/Community)有企业版和社区版,平常学习我们选择社区版(Community)就可以了,更多区别可以访问官方网站查看二者的区别
Docker所支持的平台和操作系统也是很广泛的,支持Linux/Windows/Mac系统,这里主要讲解Linux其中一个发行版CentOS的安装使用,官网提供了是怎么获取安装Docker的,查看安装指南

在CentOS上安装Docker Engine - Community要求CentOS的版本必须是7以上版本,如果之前安装过先进行移除操作,如果没有安装过此步骤则无须执行

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

安装utils

yum install -y yum-utils device-mapper-persistent-data lvm2

配置合适的repo,考虑国外网站的速度建议选择阿里云给我们提供的repo

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo         官方仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    阿里云仓库

配置好安装源之后,让yum检测并使用最快的源

yum makecache fast

开始安装Docker,ce表示是社区版

yum -y install docker-ce

启动服务

service docker start 或者 systemctl start docker

查看Docker的安装版本

docker version

到此安装工作就已经完成!

Docker架构

基本架构

Docker使用客户端-服务器(client-server)架构模式,可以使用docker version来查看安装的client和server端的版本。通过下面这个图可以简单清晰看出Server/Client通信,容器和镜像、数据之间的关系系,用户无法直接和Docker Server进行交互。

  • Docker是提供应用打包,部署与运行应用的容器化平台
  • Docker整体可以大致分为三部分
    • 内层:Server,可以是本地的也可以时远程的,接收并分发Client端发起的请求。
    • 中间层:REST API,使用HTTP协议简历Client与Server之间的通信。
    • 外层:Client 通过中间层向Docker Server发起请求,执行命令。

Docker Daemon 是Docker架构中一个常驻在后台的系统进程,主要功能是在后台启动一个Server接收处理Client发送的请求。Server负载接受Client发送的请求通过路由分发调度,找到相应的Handler来执行请求。

执行流程

客户端Client向服务端Docker Daemon发送各种命令,包括镜像的拉取,构建执行等,服务端由Docker daemon来负责管理Containers和Images,Registry是远程注册中心,用来提供各种各样的官方或者第三方镜像文件。

Docker使用

使用Docker运行镜像

了解完Docker的基本概念后,接下来就开始一个简单的例子来使用Docker,体会Docker带给我我们的方便之处。使用Docker部署一个Tomcat应用。打开Docker的官方镜像网站,搜索Tomcat可以看到官方给我们提供了很多镜像版本,执行

docker pull tomcat

或者指定版本:

docker pull tomcat:8.5.-jdk8-openjdk

可以看到在下载tomcat镜像的时候里面包含了tomcat运行所需要的JDK,这也说明了镜像是包含了应用运行的一整套环境,包含操作系统等等。

下载完成后就可以开始运行tomcat容器

docker run tomcat

docker使用常见命令如下:

docker pull imageName<:tags> 抽取远程仓库镜像
docker images 查看已下载镜像
docker run 创建容器,启动应用
docker ps 查看正在运行的镜像
docker rm 删除容器 添加-f参数强制删除
docker rmi 删除镜像

如果在下载过程中出现下载过慢的情况,可以配置阿里云镜像加速来提升下载速度

登录阿里云控制台,搜索 容器镜像服务

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

创建配置文件,重启Docker服务就可以使用阿里云帮我们提供的Docker镜像加速服务了。

宿主机与容器间的通信

直接使用docker run tomcat 容器,这时我们通过外部浏览器还是无法正常访问tomcat首页,这是因为容器内部端口是与外面隔离的,这时我们可以在启动时配置端口映射,这时就可以建立容器与宿主机之间的通信,达到外部访问的目的,其实实现起来也很简单,只需执行

docker run -p : -d tomcat
-p 映射端口:容器端口
-d 表示在后台运行容器

这时就可以将容器的8080端口,与宿主机的8080端口进行绑定,与外面端口映射的时候我们可以自行指定。

这个时候如果要停止后台运行的容器,可以执行

docker kill containerID

如果不知道容器ID,可以使用docker ps -s来查看当前正在运行的容器信息,获取containerID。

容器内部结构

通过Docker镜像就可以快速实例化一个tomcat容器,我们省去了下载安装JDK,配置环境变量,下载tomcat的过程,是不是很方便快捷,同样我们如果需要mysql镜像也可以直接下载MySQL镜像来实例化一个MySQL数据库,这样是我们的应用在部署的时候可以模块化来部署,这样松耦合的实现可以方便我们对应用的管理,那么容器的内部结构究竟是如何实现的,其实我们也是可以直接进入容器内部,查看容器的内部结构。

docker exec [-it] 容器id 命令

例如:查看你tomcat,这里的命令是我们可选的,后面将会介绍。

[root@conly ~]# docker exec -it 3c7488f8d35a /bin/bash
root@3c7488f8d35a:/usr/local/tomcat

此处以tomcat容器为例,容器内部结构如图所示:包含了tomcat运行的必备环境。

这样就已经进入容器内部,进入/usrl/ocal目录,发现这里已经包含tomcat运行所需要的JDK和tomcat,而且容器内部自身是建立在一个Linux系统基础之上的,我们可能疑惑为什么有一个操作系统,文件还这么小,这里linux仅支持这个应用,其他组件一律没有安装,所以占用资源较少,这也很好的解释为什么Linux适合做服务器系统,可以根据不同业务场景定制化系统所需要的组件。

root@3c7488f8d35a:/usr/local# ls /usr/local/
aegis bin etc games include lib man openjdk- sbin share src tomcat

退出容器内部

exit

容器的生命周期

关于Docker容器的生命周期可以参考下图:

  • docker run 命令包含 docker create 和 docker start两个状态
  • docker create 单执行,则会进入停止状态
    • 执行docker start 进入开始状态
    • docker destroy 删除容器
  • docker kill 或者 docker stop 都置die状态,紧接着进入stop状态
    • docker kill 后进行docker start 创建新进程
    • docker stop 后进行docker start 进入恢复
  • docker restart 可以重启
  • docker pause 进行暂停状态

内存溢出OOM,会置die,查看状态 docker ps -a 我们会发现更多子状态。
关于Docker的基本学习先说这么多,后面介绍Docker中DockerFile,网桥,volume,以及Docker compose的进阶使用。

 
 
 
 
 
 

Docker安装,基本概念,执行流程,生命周期简介的更多相关文章

  1. Servlet 执行流程 生命周期 ServletConfig 线程安全

    Day34 servlet 三.如何使用Servlet 1.继承GenericServlet类(通用) (1)GenericServlet类有一个关键的设计,定义了一个私有的ServletConfig ...

  2. Android之Activity生命周期简介

    概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...

  3. vue生命周期简介

    vue生命周期简介 生命周期的钩子 LifeCycle hooks 上面已经能够清晰的看到vue2.0都包含了哪些生命周期的钩子函数~~ 那么 执行顺序以及什么时候执行,我们上代码来看~~~ 生命周期 ...

  4. Vue生命周期简介和钩子函数

    钩子就好像是把人的出生到死亡分成一个个阶段,你肯定是在出生阶段起名字,而不会在成年或者死亡的阶段去起名字.或者说你想在出生阶段去约炮,也是不行的.组件也是一样,每个阶段它的内部构造是不一样的.所以一般 ...

  5. 浅谈Android的Activity运行流程(生命周期)

    关于Android的Activity运行流程,我们可以写一些程序来直观的查看Activity的运行流程.在这里我们使用Log工具来获取Activity运行日志.假如我们新建一个Android项目,Pr ...

  6. Vue(3)- 安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用

    一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...

  7. Vue 3 --安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用

    一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...

  8. [PHP]代码执行和生命周期

    PHP代码的执行:1.和大部分程序一样,接收数据,处理数据,输出结果2.编写的代码就是输入的数据,php内核进行处理,返回相应的输出3.php作为业务程序和编译语言的区别就是,php多了一步把用户代码 ...

  9. Spring Framework核心概念之Bean生命周期管理

    目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...

随机推荐

  1. Linux引导过程!(重点)

    1.开机自检:服务器开机后,将根据主板BIOS (基本输入系统),中的设置对CPU .内存.显卡.键盘等设备进行初步检测,并初始化部分硬件. 2.MBR 引导:当从本机硬盘中启动系统时,首先根据硬盘中 ...

  2. CSP-J2019 纪念品

    Description: Solution: 第一天买入,第二天卖出,在干些别的,再把第二天刚卖出的再买回来,就相当于是啥也没干.也就是说手中的物品本身要算在手中的钱中.这也就是为什么 dp 的状态可 ...

  3. 使用HttpURLConnection通过post请求服务器时,URLEncode编码的必要性

    通过Post提交表单数据时,数据类型为x-www-urlencoded,提交到服务器的数据服务器默认是通过URLEncoder.encode()编码过得,所以服务器处理时会用URLDecoder.de ...

  4. 设置npm源的几种方式

    设置npm源的几种方式 原始源 # the original source https://registry.npmjs.org/ 方案: 使用nrm 安装 npm install -g nrm 列出 ...

  5. Codeforces1301B. Motarack's Birthday

    题意是说给你一串数组,其中-1代表未知,求相邻两个数之差的绝对值最小,-1可以由k赋值,先考虑-1的情况,把k解出来,转换一下,就是绝对值之差最小情况,|k-a|,|k-b|,|k-c|,要使最大的最 ...

  6. luogu P3356 火星探险问题

    本题很简单的费用流问题,有石头的点需要限制,那我们就可以拆点,capacity为1就可以限制,然后cost为-1,直接跑板子就可以了,注意输出的时候找残量网络的反向边

  7. Django 学习 之路由层(URL)

    路由层(URL) 1.路由层简单配置 (1)path方法 写固定的url. (2)re_path方法 可以正则规则 例: urlpatterns = [ path('admin/', admin.si ...

  8. 【JAVA蓝桥杯】基础练习1 十进制转十六进制

    资源限制 时间限制:1.0s   内存限制:512.0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式.它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16 ...

  9. 应用内打开AppStore上某个应用的下载界面--SKStoreReviewController的使用

    产品设计要求是这样的: 对应的初步代码是这样的: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after ...

  10. mabatisplus-update

    /** * <p> * 根据 whereEntity 条件,更新记录 * </p> * * @param entity 实体对象 (set 条件值,不能为 null) * @p ...