Docker 基础

为什么需要docker?在传统部署下,我们会遇到不同机器、不同依赖版本的兼容性等问题,解决此问题一般会消耗大量时间,并且在不同机器上均要执行统一环境的部署也是一个耗时较长的工作。除此之外、还包括例如管理Dev/Test/Prod等不同环境的成本。为了解决这些问题,Docker应运而出。

Docker 可以使用不同的Container 运行不同的组件(如node.js web server, MongoDB, Messaging System等),并且这些Containers 可以运行在同一个物理主机上,而相互之间无影响(也就是各有各的执行环境与依赖)。如:

通过上图我们可以看到,Docker Container 是共享的一个Kernel,且执行在Docker 层之上。Docker与Hypervisor(虚拟化中的控制进程)不一样的是:Docker并不是虚拟化,并不是在同一个底层硬件上运行不同的Kernel以及OS,它主要的目的是将应用容器化,使用同一套Kernel与OS执行不同的应用。而传统的虚拟化架构为:

这种虚拟化的架构会很大程度上使用硬件资源,且VM 镜像一般是GB级别的数据。而Docker Container 是一种轻量化的资源,大小也是MB 级别的量。这样可以使得Docker Container 启动更快,一般是秒级别。而VM 启动时间会长的多,因为需要启动整个OS。

Docker 安装与启动

在Linux 下,可以使用 yum 或是 apt-get 直接安装,如:

sudo yum install -y docker

然后启动:

sudo /etc/init.d/docker start

测试:

sudo docker run hello-world

基本Docker 命令

docker run

执行一个docker container,指定参数为image 名,如果本地不存在此image,则会从dockerhub进行下载,例如:
> sudo docker run ubuntu

Unable to find image 'ubuntu:latest' locally

latest: Pulling from library/ubuntu

7ddbc47eeb70: Pull complete

c1bbdc448b72: Pull complete

8c3b70e39044: Pull complete

45d437916d57: Pull complete

Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d

Status: Downloaded newer image for ubuntu:latest

docker ps

列出当前运行的containers。可以使用 docker
ps –a 查看所有containers
状态。

docker stop <container_name>

停止一个docker container。但是此 docker container 仍可以被 docker ps
-a 命令列出。

docker rm
<container_name>

移除一个docker container。

docker images

列出所有images。

docker rmi
<image_name>

移除一个image。移除前必须要删除所有正在使用此image 的container。

docker pull
<image>

拉取一个 image到本地,之后执行docker
run 后,不会再去DockerHub
拉取镜像。

docker exec <command>

在一个docker container 内执行指定命令。如(7e2290cbe2f7为docker
id):

docker exec 7e2290cbe2f7 cat /etc/*release*

DISTRIB_ID=Ubuntu

DISTRIB_RELEASE=18.04

Docker Run 命令进阶

1. 指定image 的版本,如:

docker run ubuntu:17.04

2. attach 到一个正在运行的container中,如:

> docker run -d training/webapp

> docker ps

CONTAINER ID       
IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

fdd161c7d3f3       
training/webapp     "python
app.py"     19 seconds ago      Up 19 seconds       5000/tcp            vibrant_hermann

> docker attach eager_johnson

attach 用于将container 的输出指向当前实例的stdout

3. docker run -i 指定等待stdin 输入

4. 端口映射

在执行一个 web app 样例后,我们可以看到以下输出:

docker run training/webapp

* Running on
http://0.0.0.0:5000/ (Press CTRL+C to quit)

此时,这个5000 端口绑定的是一个私网 ip ,例如:我们看一下这个container
内部的 ip:

> docker exec da16b96211f6 ifconfig

eth0      Link
encap:Ethernet  HWaddr 02:42:ac:11:00:02

inet
addr:172.17.0.2 
Bcast:172.17.255.255 
Mask:255.255.0.0

UP BROADCAST
RUNNING MULTICAST  MTU:1500  Metric:1

RX
packets:15 errors:0 dropped:0 overruns:0 frame:0

TX packets:0
errors:0 dropped:0 overruns:0 carrier:0

collisions:0
txqueuelen:0

RX
bytes:1186 (1.1 KB)  TX bytes:0 (0.0 B)

可以看到此 ip 为 172.17.0.2,而我们宿主实例的 ip 为10.0.0.83。所以,若是单纯的使用宿主实例的 ip:5000,是访问不到这个页面的。这里我们需要做端口映射,例如:

docker run -p 80:5000 training/webapp

并且可以启动多个container,使用不同的端口映射,例如:

docker run -p 8000:5000 training/webapp

这样我们便部署了两个 web server,监听的端口分别为外部实例的 8000 端口已经 80 端口。

4. 卷映射

Docker container 内部有自己的文件系统,与外部文件系统隔离。我们也可以将外部卷与docker container
内的卷进行映射。这样在container
销毁后,卷里的数据仍保存在本地。例如:

docker run –v /opt/datadir/:/var/lib/mysql mysql

Docker(一)概念与基础的更多相关文章

  1. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  2. Docker容器概念讲解

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源. Docker是通过内核虚 ...

  3. Docker教程:docker的概念及安装

    http://blog.csdn.net/pipisorry/article/details/50754385 Why docker 对于运维来说,Docker提供了一种可移植的标准化部署过程,使得规 ...

  4. 菜鸟系列docker——docker基本概念(1)

    docker基本概念 1.准备 这里先介绍容器技术,后续再介绍docker.docker是容器的一种,除docker以外,还存在coreos.不过在当前趋势下容器和docker基本上可以划为等号了. ...

  5. Docker学习笔记:基础

    docker的概念 :docker是一个可供开发者在容器中 开发 部署 运行 应用的一个平台.通过使用Linux容器去部署应用的方式称为容器化. 基础概念 Images and Container i ...

  6. Docker for .Net Developers(part1:Docker基本概念介绍)

    一.什么是Docker 目前,.Net 社区中很可能会用到的两个词是“微服务”和“Docker”. 这两个主题都非常引人注目,并为开发人员和架构师带来兴奋之情. 在这个新系列的博客文章中,我把自己最近 ...

  7. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  8. Docker虚拟化实战学习——基础篇(转)

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  9. 后端技术杂谈9:先搞懂Docker核心概念吧

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识

    使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...

随机推荐

  1. 秋水逸冰实用Linux脚本收藏

    秋水逸冰的脚本非常受欢迎,奈何其本人博客已经不能访问(目前是这样,不知道别的地区是否能访问),实际上GitHub上他本人一直在维护,因为某些原因不放出他本人的GitHub地址.截止到2019年12月1 ...

  2. python—lambda函数,三个常用的高阶函数

    """lambda 参数列表 : 返回值lambda 参数形式: 1.无参数:lambda:100 2.一个参数:lambda a: a 3.默认参数:lambda a, ...

  3. day 15 内置函数

    内置函数 不用def定义能直接用的函数,带括号的 locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 global 变量 nonlocal 变量 迭代 ...

  4. KD-Tree 学习笔记

    这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...

  5. Selenium实战(四)——unittest单元测试3(测试用例的执行顺序)

    一.测试用例的执行顺序 层级:多个测试目录 > 多个测试文件 > 多个测试类 > 多个测试方法(测试用例).在这里以一个测试执行顺序的脚本为例test_order.py import ...

  6. 【spring boot】SpringBoot初学(2.1) - properties读取明细

    前言 算是对<SpringBoot初学(2) - properties配置和读取>的总结吧. 概念性总结 一.Spring Boot允许外化(externalize)你的配置.可以使用pr ...

  7. 【database】oracle触发器基础

    一.oracle触发器基本语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE ...

  8. 最短路径算法总结(floyd,dijkstra,bellman-ford)

    继续复习数据结构和算法,总结一下求解最短路径的一些算法. 弗洛伊德(floyd)算法 弗洛伊德算法是最容易理解的最短路径算法,可以求图中任意两点间的最短距离,但时间复杂度高达\(O(n^3)\),主要 ...

  9. opencv图像加文字与运行时间

    //获取推断时间 vector<double>layterTimings; double freq = getTickFrequency() / 1000; //得到ms double t ...

  10. scrapy框架综合运用 爬取天气预报 + 定时任务

    爬取目标网站: http://www.weather.com.cn/ 具体区域天气地址: http://www.weather.com.cn/weather1d/101280601.shtm(深圳) ...