Docker系列-(1) 原理与基本操作

目前已经更新完《Java并发编程》,《Docker教程》和《JVM性能优化》,欢迎关注【后端精进之路】,轻松阅读全部文章。
Java并发编程:
- Java并发编程系列-(1) 并发编程基础
- Java并发编程系列-(2) 线程的并发工具类
- Java并发编程系列-(3) 原子操作与CAS
- Java并发编程系列-(4) 显式锁与AQS
- Java并发编程系列-(5) Java并发容器
- Java并发编程系列-(6) Java线程池
- Java并发编程系列-(7) Java线程安全
- Java并发编程系列-(8) JMM和底层实现原理
- Java并发编程系列-(9) JDK 8/9/10中的并发
Docker教程:
JVM性能优化:
Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker容器是完全使用沙箱机制,相互之间不会有任何接口,相比于虚拟机,容器启动速度快,性能开销极低。
Docker架构
首先介绍下Docker的架构,可以由下图表示,主要由Clients、Hosts、Registries组成,下面提到了几个专有名词,我来一个个单独介绍:

Image
Docker镜像,用于创建 Docker 容器的模板。可以看成Java里面的Class类。
Container
独立运行的一个或者一组容器。启动Images后会生成Container,因此可以看成Java里面类的实例化对象。一个Image可以启动多次生成多个Container。
Client
Docker 客户端,使用 Docker Api与 Docker 的守护进程通信。一般在桌面开发中,Client和下面介绍到的Host都在同一个客户端中,使我们感觉Client和Host是在一起的,其实原理是上单独的两个模块。
Host
Docker 主机,一个物理或者虚拟的机器,用于执行 Docker 守护进程和容器。
Registry
Docker仓库,用来保存镜像。官方的Docker镜像是 https://hub.docker.com/ ,注册后可以在这里存放你自己的Image。
Machine
docker-machine就是帮助你快速去创建安装docker环境的工具,当我们需要在很多台Server上安装Docker环境时,我们可以使用Machine进行安装。
Docker常用操作流程
日常工作中,用到的最多的Docker操作如下,主要包含:
- 从本地提交Image到远端镜像
- 从远端获取镜像到本地
- 在本地进行镜像的测试与制作

接下来进行Docker的实际安装与操作。
安装
Docker官方在这里 https://docs.docker.com/install 给出了详细的安装流程,直接按照步骤一步步安装,一般不会有什么问题。
注意:在Ubuntu系统上进行安装时,推荐使用
Install using the repository的方式安装,否则直接使用安装包安装会出现很多依赖问题。
Docker基本操作
Docker安装好了以后,我们可以运行
docker run hello-world
来启动我们的第一个docker容器,正常情况下,docker会从远端仓库下载好hello-world以后直接启动。

Docker的操作主要包括两类,一类是对Image镜像的操作,另一类是对Container容器的操作。
容器与镜像的关系
首先通过下图再次认识一下容器与镜像的关系,简单来讲,镜像类似Class类,容器类似new对象。另外镜像类似于Class类,也有继承的关系,也就是说一个镜像可以基于另一个镜像,增加自己的新的功能和需求,这点在后续的制作Docker镜像和Docker文件结构中会详细讲到。

镜像操作
以下是主要的镜像操作,
docker [images|rmi|tag|build|history|save|load]
- images:列出本地镜像列表
- rmi [镜像名:版本]:删除镜像
- tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
- build -t [镜像名:版本] [path]:Dockerfile 创建镜像
- history [镜像名:版本]: 查看指定镜像的创建历史
- save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar : 将镜像保存成 tar 归档文件
- load --input xx.tar / docker load<xxx.tar : 从归档文件加载镜像
容器操作
相比于对镜像的操作,对于容器的操作更多,
docker [run|start|stop|restart|kill|rm|pause|unpause]
- run/create[镜像名]: 创建一个新的容器并运行一个命令
- start/stop/restart[容器名]:启动/停止/重启一个容器
- kill [容器名]: 直接杀掉容器,不给进程响应时间
- rm[容器名]:删除已经停止的容器
- pause/unpause[容器名]:暂停/恢复容器中的进程
docker [ps|inspect|exec|logs|export|import]
- ps:查看容器列表(默认查看正在运行的容器,-a查看所有容器)
- inspect[容器名]:查看容器配置元数据
- exec -it [容器名] /bin/bash:进入容器环境中交互操作
- logs --since="2019-02-01" -f --tail=10 [容器名]:查看容器日志
- cp path1 [容器名]:path 容器与主机之间的数据拷贝
- export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个tar归档文件
- import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像
以上给出了容器和镜像的基本操作,一般情况下,开发比较常见的是下面三个,
1. 启动容器并且后台运行
docker run -d --name myhello-world hello-world

注意到-d参数是后台运行,--name指定容器的名称.
同时在运行时可以绑定容器端口,比如启动nginx容器的时候,可以将nginx的80端口绑定到本机的8080端口。
docker run -d -p 8080:80 --name nginx nginx:latest
2. 进入正在运行的容器
docker exec -it nginx /bin/bash
-it交互式的启动bash,这个在后面会经常用到,因为经常会进入容器进行调试。
这一节主要介绍了Docker的基本架构和操作,后续会介绍Docker的文件结构和Docker的制作。
本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处
搜索『后端精进之路』关注公众号,立刻获取最新文章和价值2000元的BATJ精品面试课程。
Docker系列-(1) 原理与基本操作的更多相关文章
- Docker系列之原理简单介绍
目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...
- Docker系列-(3) Docker-compose使用与负载均衡
上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...
- Docker系列-(2) 镜像制作与发布
上篇文章引入了Docker的基本原理和操作,本节文章主要介绍如何制作Docker镜像和发布. 镜像文件结构 Docker镜像的本质是一系列文件的集合,这些文件依次叠加,形成了最后的镜像文件,类似于下图 ...
- Docker系列之常用命令操作手册
目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...
- Docker 容器基本操作[Docker 系列-2]
Docker 入门及安装[Docker 系列-1] 镜像就像是一个安装程序,而容器则是程序运行时的一个状态. 查看容器 查看容器 启动 docker 后,使用 docker ps 命令可以查看当前正 ...
- docker系列 参考文章
Docker 系列一(概念原理和安装) Docker 系列二(操作镜像) Docker 系列三(容器管理) 持续更新... ubuntu 安装docker 参考文章 :(https://blog.cs ...
- 土法搞docker系列之自制docker的graph driver vdisk
写在最前 偶然整理,翻出来14年刚开始学docker的时候的好多资料.当时docker刚刚进入国内,还有很多的问题.当时我们的思考方式很简单,docker确实是个好的工具,虽然还不成熟.但是不能因为短 ...
- Docker 容器高级操作[Docker 系列-3]
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 上篇文章向读者介绍了一个 Nginx 的例子,对于 Nginx 这样一个容器而言,当它启动成功后,我们 ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
随机推荐
- Recursive Learning
At first, I just want to learn SQL Server / T-SQL, which I hope can replace MySQL. Then, I was attra ...
- redis 底层数据结构
简单动态字符串SDS 包含字符串长度,剩余可用长度,字符数组 用于Redis中所有的string存储 字典(map) 数组+链表形式,跟hashMap很像 链地址法解决hash冲突 rehash使用新 ...
- [RAM] FPGA的学习笔记——RAM
1.RAM——随机存取存储器, 分为SRAM和DRAM. SRAM:存和取得速度快,操作简单.然而,成本高,很难做到很大.FPGA的片内存储器,就是一种SRAM,用来存放程序,以及程序执行过程中,产生 ...
- 你不知道的JS系列【1】- 什么是作用域
几乎所有的编程语言都能够储存变量,并且能在之后对这个变量值进行访问或修改,正是储存和访问变量的能力将状态带给了程序,那么,这些变量储存在哪里呢?程序需要时又是如何找到他们?这些问题说明需要一套设计 ...
- 小白学习React官方文档看不懂怎么办?
最近在上React课程的时候,发现好多同学不会看文档,所以在这里写一篇文章,希望能给同学们一点点启发. 我们首先打开React官方网站——https://react.docschina.org/doc ...
- Python 操作Gitlab-API 实现批量的合并分支
1.需求:每次大批量上线完成后,都会进行将hotfix合并到Master,合并到test/uat等等重复操作(上线发布后自动合并master已完成). 2.现实:在完成发布后自动合并master后,可 ...
- 元数据管理的重要性 - xms
什么是元数据?引用百科的描述就是:元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息: 看起来有点抽象 ...
- PHP基于Redis实现轻量级延迟队列
延迟队列,顾名思义它是一种带有延迟功能的消息队列. 那么,是在什么场景下我才需要这样的队列呢? 一.背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节 ...
- python中的random模块简析
在Python生成随机数用random模块,下面的文章是本人自己简单总结的ython生成随机数与random模块中最常用的几个函数的关系,希望对大家有所帮助. random.random()用于生成随 ...
- java中sleep()和wait()区别
1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法 2,sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时 ...
