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. GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)

    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频) GraphQL + React Apollo + React Hook 大型项目实战 #1 介绍「 ...

  2. MySQL概述及入门(二)

    MySql概述及入门(二) MySQL架构 逻辑架构图: 执行流程图: MySQL的存储引擎 查询数据库支持的存储引擎 执行: show engines: 多存储引擎是mysql有别于其他数据库的一大 ...

  3. linux--工具参考篇

    linux下的好用工具 工具好多!!! gdb调试利器 ldd查看程序依赖库 lsof一切皆文件 ps进程查看器 pstack 跟踪进程栈 strace 跟踪进程中的系统调用 ipcs 查询进程间通信 ...

  4. 关于所学,及JNI问题

    上周每天学习Java两个小时,随后两个小时里对教材上的例子进行验证,学会了如何使用Javac对文件进行终端编译,输出,但由于所下载的 jdk版本问题出现了JNI问题,正在尝试解决.并学会了如何使用ec ...

  5. java课后作业10.14

    一.简单总结一下java中类的初始化的规律: 1.类的构造函数优先 2.初始化块儿和定义时候的赋值,这俩个初始化方法优先级是一样的,在程序中谁最后执行,那么程序就采用谁的初始化值. 二.在java中想 ...

  6. qt 带箭头的直线 (类似viso)

    2020.02.27 本来上传到CSDN,后来想想,我要放弃csdn了.csdn已经跟我分享的精神背道而驰了.想要代码,留邮箱吧. 近来Qt开发时可能遇到这样的需求:两个(或多个)矩形,要用直线将它们 ...

  7. .7、void*

    void * 是一种特殊的指针类型,可用于存放任意类型的地址.与其他指针类似,不同的是,我们对该地址中到底是一个什么类型的对象不了解,因此我们不能直接操作void * 所指的对象. ; int *p ...

  8. 监听Ueditor的 iframe中的按键,按键组合事件(Ctrl+s)

    个人博客 地址:https://www.wenhaofan.com/a/20190716214214 监听按键事件 ueditor.ready(function() {     UE.dom.domU ...

  9. final 和 static之间的区别和联系

    关键字final和关键字static两者的含义并不相似,但是笔者常常使用一段时间后就会忘记它们之间的区别,因为它俩总是相伴着出现.当只出现其中一个时,就对其代表的含义不甚清晰了.故而特地将相关知识点记 ...

  10. Redis入门-02-CentOS7环境搭建

    CentOS7下redis安装过程,安装后需要开启端口号6379 #下载 wget http://download.redis.io/releases/redis-3.2.4.tar.gz #解压 t ...