Docker基本概念

基本概念

容器

什么是容器?Docker官方介绍:

将软件打包到标准化单元中,以进行开发,运输和部署

容器是一个标准的软件单元,它将代码及其所有依赖打包,以便应用程序从一个计算环境快速可靠地运行到另一个计算环境。 Docker容器镜像是一个轻量级,独立的可执行软件包,包含运行应用程序所需的一切:代码,运行时,系统工具,系统库和设置。

容器镜像在运行时成为容器,对于Docker容器,镜像在Docker Engine上运行时成为容器。 适用于基于Linux和Windows的应用程序,无论基础架构如何,容器化软件运行结果始终相同。 容器将软件与环境隔离开来,并确保它可以统一工作,尽管开发和演示之间存在差异。

在Docker Engine上运行的Docker容器:

  • 标准: Docker创建了容器的行业标准,因此它们可以在任何地方移植

  • 轻巧:容器共享计算机的OS系统内核,因此不需要每个应用程序都具有OS,从而提高了服务器效率,并降低了服务器和许可成本

  • 安全:应用程序在容器中更安全,并且Docker提供了业界最强大的默认隔离功能

虚拟化和容器化的区别

  • 虚拟化是物理资源层面的隔离,容器是进程层面的隔离
  • 容器在操作系统上运行,并与其他容器共享主机的内核。没有臃肿的操作系统,相对VM节省了大量资源开销。

容器化技术比虚拟机更灵活,更轻量小巧。

容器化解决的问题

  • 标准化的迁移方式
  • 提升部署效率,屏蔽环境带来的差异
  • 统一的参数配置
  • 降低开发与运维之间的沟通桥梁

Docker

  • Docker是一个提供应用打包,部署与运行应用的容器化平台
  • 开源的应用容器引擎,使用 Go 语言开发,基于Linux内核 的cgroupnamespace以及使用Union FS技术来实现资源控制、工作区隔离、操作系统虚拟化
  • Build once,Run anywhere,Configure once,Run anything

Docker Engine

Docker Engine也就是Docker,Docker Engine为C/S模型,用户可以通过docker client向docker daemon发送操作请求。

Docker Engine包括以下几部分:

  • Docker Daemon是一个守护进程,属于C/S中的server
  • REST API, docker daemon向外暴露的REST 接口
  • Docker向外暴露的命令行接口(Command Line API)

因此我们可以通过Docker REST API或者使用CLI命令与Docker Daemon进行交互。
Docker Daemon负责创建和管理Docker 对象,例如镜像,容器,网络和卷。

镜像和容器

  • 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"
  • 容器是镜像的实例,由Docker负责创建,容器之间彼此隔离

交互流程

常用命令

  • docker build - 使用Dockerfile创建镜像
  • docker pull 镜像名<:tags> - 从远程仓库抽取镜像
  • docker images - 查看本地镜像
  • docker run 镜像名<:tags> - 创建容器,启动应用
  • docker start 容器id - 启动容器
  • docker ps - 查看正在运行中的镜像
  • docker rm <-f> 容器id - 删除容器
  • docker rmi <-f> 镜像名:<tags> - 删除镜像
  • docker exec 进入容器,可以在容器的Shell执行命令

示例

# 1.拉取远程镜像
# docker pull tomcat
# 2.运行tomcat
# docker run tomcat
......省略一堆日志
11-Sep-2020 03:39:47.314 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
11-Sep-2020 03:39:47.323 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [64] milliseconds

tomcat是启动成功了,但是我们的界面也进入了tomcat的启动界面,想要进行下步操作只能另外启动一个shell了,不太方便。Ctrl + c中断,这时可以使用docker run中的参数d(相关参数可以通过docker run --help查看)

-d: 后台运行容器,并返回容器ID

# docker run -d tomcat
e8131c2c78e12bda89db059ee184b4fe9afc2a47217631c96a9947da823e6c07
# 查看运行的容器
# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
e8131c2c78e1        tomcat                "catalina.sh run"        30 seconds ago      Up 29 seconds       8080/tcp                 objective_franklin

Docker宿主机与容器通信

此时如果要通过外部访问是访问不通的,原因是容器暴露的端口并未与宿主机映射。


-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

# 先停止上面启动的容器(`e8131c2c78e1`为上面创建的容器id,通过docker ps可以查看运行的容器以及相关的参数)
# docker stop e8131c2c78e1
# docker run -d -p 8080:8080 tomcat
90c7a49e7495fd2dd418cfc36b5678b34d617618cf9089bfa4d99d4f5e79c937

容器内部结构

容器内部依赖关系如下:

如果我们要在tomcat中添加一个html,可以直接使用docker exec命令进入容器内部。

docker exec -it [容器id] /bin/bash

# docker exec -it 90c7a49e7495 /bin/bash
# 默认进入到tomcat的工作目录
root@90c7a49e7495:/usr/local/tomcat# cd webapps
root@90c7a49e7495:/usr/local/tomcat/webapps# mkdir ROOT && echo "Hello World" > ROOT/index.html
# Ctrl + d 回到宿主机访问tomcat服务查看结果
# curl localhost:8080
Hello World

挂载本地目录

如果每次都需要进入容器修改或者新增文件那也太麻烦了,此时我们可以将本地目录挂载到容器里。

--volume , -v: 绑定一个卷

# 在宿主机创建一个目录
# mkdir /webapps
# 停止上面启动的容器
# docker stop 90c7a49e7495
# 启动,加上-v参数挂载目录
# docker run -d -p 8080:8080 -v /webapps:/usr/local/tomcat/webapps tomcat
51d3b61731d12025c3a9d40f78bd9e1b568dfd1b1392c4cee74cacd78ff2c0bd
# cd /webapps
# mkdir ROOT && cd ./ROOT && echo "hello world" > index.html
# curl localhost:8080
hello world

容器的生命周期

DockerFile

Dockerfile是一个用来构建镜像的文本文件,其中包含镜像构建的指令。

构建镜像命令:

docker build -t 机构/镜像名<:tags> Dockerfile目录 

一张来自互联网的图,使用幽默诙谐的语言对相关指令的解释:

示例

本次示例为构建一个tomcat应用镜像,直接将html文件放置到webapps目录,如果是java应用直接将war包放置到该目录即可。

# ls
Dockerfile  index.html

DockerFile文件内容:

FROM tomcat:latest
WORKDIR /usr/local/tomcat/webapps/ROOT/
COPY index.html .

html文件内容:

<h1>hello world</h1>

执行构建镜像

# docker build -t hosjoy/mytomcat:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM tomcat:latest
 ---> d5eef28cf41d
Step 2/3 : WORKDIR /usr/local/tomcat/webapps/ROOT/
 ---> Running in 3d945ec4369e
Removing intermediate container 3d945ec4369e
 ---> 3d823064c72f
Step 3/3 : COPY index.html .
 ---> 3f10023cfd3e
Successfully built 3f10023cfd3e
Successfully tagged hosjoy/mytomcat:1.0

运行容器

# docker run --rm -d -p 8080:8080 hosjoy/mytomcat:1.0
92050690ca846241c1944962c24ec2a2eb6ae060cb944bcaa69987a0a09bcc5f
# curl localhost:8080
<h1>hello world</h1>

更多指令可查看官方文档

镜像分层

Docker镜像里面是一层层的文件系统,基于Union FS(联合文件系统)技术,可以将多层目录挂载到一起,形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 Linux 的目录结构一样,Docker通过这些文件再加上宿主机的内核提供了一个Linux 的虚拟环境。

Linux文件系统由bootfsrootfs两部分组成:

  • bootfs(boot file system):主要包含bootloaderkernel,Linux启动时会加载bootfs文件系统,boot将内核加载到内存中后,此时系统会卸载bootfs
  • rootfs (root file system): 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件,不同的Linux 发行版(如 ubuntuCentOS)在rootfs这一层会有所区别。

当运行镜像时,Docker会生成一个新的可写层并加载到镜像的顶层。这一层通常称为"容器层",之下都是"镜像层",最底层的为基础镜像(base image)。
容器层可以读写,镜像层只允许读取。

分层带来的好处:

  • 共享资源,例如:有多个镜像都从相同的base镜像进行构建,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有的容器服务了。而且镜像的每一层都可以被共享。
  • 可以并发上传下载,提升构建速度。如果修改了镜像,相当于在原有镜像基础再加一层,推送到仓库也不需要全部推送,只需要推送新加的一层即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354