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. day9 修改文件

    # 修改文件 # 文件是不能修改 with open('小护士班主任', mode='r', encoding='utf-') as f, open('小护士班主任.bak', 'w', encodi ...

  2. BZOJ #2506. calc [根号分治,莫队,二分]

    \(p\) 是个正常范围, \(\sqrt p <= 100\) 比较小,预处理出来 \(a_i % p == k\) 的位置,然后丢进去,最后询问的 \(p\) 如果大于 \(100\) 就莫 ...

  3. 服务器CentOS7上安装MySql

    1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成Replaced:grub2.x86_64 1:2.02-0.64.e ...

  4. QPixmap和QImage

    1.QPixmap QPixmap的设计本来就是用来加速显示,用paint绘图时用QPixmap会比其他类的效果好很多.一般小图片用QPixmap. 2.QImage 依赖软件,直接像素访问,适合大图 ...

  5. 吴裕雄--天生自然 HADOOP大数据分布式处理:安装WinSCP

    下载安装包

  6. Lodash是什么?

    lodash:是一个一致性.模块化.高性能的 JavaScript 实用工具库.(也就是相当于自己封装的私有方法) node里引入 // Load the full build. var _ = re ...

  7. 备战2020年金三银四,看这一篇面试文章就够了(合适各级Java人员)

    本文不是原创.为整理所得!但是内容是很干货的!我看了也有帮助.做个分享. 企业开始上班,就意味着大批量的招聘需求正在路上.在即将到来的金三银四跳槽面试季,提前祝贺大家拿到大厂offer.前程似锦.前程 ...

  8. [PAT] A1022 Digital Library

    [题目大意] 给出几本书的信息,包括编号,名字,出版社,作者,出版年份,关键字:然后给出几个请求,分别按照1->名字,2->出版社等对应信息查询符合要求的书的编号. [思路] 模拟. [坑 ...

  9. 安全 - CORS(脚本请求等)

    功能概述 出于安全原因,浏览器限制从脚本内发起的跨域HTTP请求 或 拦截了跨域请求的结果. 例如,XMLHttpRequest和Fetch API遵循同源策略. 这意味着使用这些API的Web应用程 ...

  10. How Many Answers Are Wrong HDU - 3038 带边权并查集

    #include<iostream> #include<cstring> using namespace std; ; int d[N],p[N]; int find(int ...