Docker

什么是Docker

虚拟化技术

在计算机中,虚拟化是一种资源管理技术,将计算机中的各种实体资源如:CPU、硬盘、内存等予以抽象、转换后呈现出来打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。在实际的生产环境当中,虚拟化技术主要用来解决高性能计算机产能过剩和老旧的机器产能过低的重组重用。对硬件进行最大化利用

虚拟化种类

  1. 全虚拟化架构

虚拟机的监视器(hypervisor)是类似于用户的应用程序运行在主机的OS之上,如VMware的workstation,这种虚拟化产品提供了虚拟的硬件。可以在一台设备上运行不同内核的操作系统

  1. OS层虚拟化技术

  2. 硬件层虚拟化

硬件层的虚拟化具有高性能和隔离性,因为hypervisor(虚拟机的监视器)直接在硬件上运行,有利于控制VM的OS访问硬件资源,使用这种解决方案的产品有VMwareESXi 和 Xen server

Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor,VMM)。

Hypervisor是所有虚拟化技术的核心。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。 宿主机

Hypervisor是所有虚拟化技术的核心,软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来。常见的产品有:VMware、KVM、Xen等等。Openstack

Docker

特点:

上手快

用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。

随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

职责的逻辑分类

使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

快速高效的开发周期

Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

鼓励使用面向服务的架构

Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)

Docker组件

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

Docker镜像

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:

添加一个文件;

执行一个命令;

打开一个窗口。

也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Registry(注册中心)

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)

Docker容器

Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务

Docker安装

使用 yum 命令在线安装

yum install docker

查看 docker 版本

docker -v

启动和关闭

启动 docker

systemctl命令是系统服务管理器指令,它是service 和 chkconfig 两个命令组合。

启动 docker:systemctl start docker

停止 docker:systemctl stop docker

重启 docker:systemctl restart docker

状态 docker:systemctl status docker

开机自启:systemctl enable docker

查看 docker 概要信息:docker info

查看 docker 帮助文档:docker --help

Docker镜像操作

Docker镜像

Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像。

列出镜像:

docker images

列名 含义
repository 镜像所在的仓库名称
tag 镜像标签,一般对应该镜像的版本号
image id 镜像的ID
created 镜像创建日期
size 镜像大小

搜索镜像:

docker search 镜像名称
列名 介绍
NAME 仓库名称
DESCRIPTION 镜像描述
STARS 用户评价,反应一个镜像的受欢迎程度。应该类似于GitHub收藏数?或者是基于某种算法计算而来
OFFICIAL 是否官方
AUTOMATED 自动构建,表示该镜像由Docker Hub自动构建流程创建的

拉取镜像

由于一些不可控的原因,我们从中央仓库下载镜像速度是很慢的,学过 MAVEN/NPM 的同学应该也知道,这时候就要我们来使用国内的远程镜像仓库了。

使用远程仓库的方法:

  1. 编辑该文件:

    vi /etc/docker/daemon.json // 如果该文件不存在就手动创建;说明:在centos7.x下,通过vi

  2. 在该文件中输入如下内容:

    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
  3. 重启 docker 服务,如果速度还是很慢就重启一下虚拟机

删除镜像

docker rmi $IMAGE_ID:删除指定镜像
docker rmi `docker images -q`:删除所有镜像

Docker容器操作

查看容器

查看正在运行的容器

docker ps

查看所有的容器

docker ps -a

查看最后一次运行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

创建与启动容器

创建容器命令:

docker run
  • -i:表示运行容器

  • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

  • --name :为创建的容器命名。

  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

  • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。

  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

交互式容器(前台启动容器)

创建一个交互式容器并取名为mycentos

docker run -it --name=mycentos centos:7 /bin/bash

退出当前容器

exit

守护式容器(后台启动容器)

创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复)

docker run -id --name=mycentos2 centos:7

登录守护式容器:

docker exec -it 容器名 (或者 容器ID)  /bin/bash(exit退出时,容器不会停止)

停止与启动容器

停止正在运行的容器:

docker stop 容器名/ID

启动已运行过的容器:

docker start 容器名/ID

文件拷贝

将宿主机器的文件拷贝到 docker 容器中

docker cp 需要拷贝的文件或目录 容器名称:容器目录

将容器中的文件拷贝到宿主机器中

docker cp 容器名称:容器目录 需要拷贝的文件或目录

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。创建容器 添加-v参数 后边为 宿主机目录:容器目录

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7

如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true

来解决挂载的目录没有权限的问题

查看容器IP地址

docker inspect 容器名
对应的字段是 ipaddr

删除容器

docker rm 容器名/ID  // 仅支持删除未运行的容器
// 删除所有容器:
docker rm `docker ps -a -q

部署应用

MySQL部署

  1. 拉取 MySQL 镜像:docker pull mysql
  2. 创建 MySQL 容器:docker run -id --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-p 代表端口映射,格式为  宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
  1. 进入 MySQL 容器,登陆 MySQL
docker exec -it mysql5.7 /bin/bash

TomCat部署

  1. 拉取 TomCat 镜像:docker pull tomcat:7-jre7
  2. 创建 TomCat 容器:
docker run -id --name=tomcat -p 8080:8080 -v /usr/local/myhtml:/usr/local/tomcat/webapps --privileged=true tomcat:7-jre7
// -v 就是指定文件映射路径(这里 myhtml是一个CAS单点登陆的工程)
// -p 就是端口映射,可以通过宿主IP:端口 来访问容器里面部署的项目
  1. 修改web项目中的配置文件,这里修改CAS项目连接的数据库地址为部署 MySQL 的容器的 IP(注意不是宿主机器的IP)

Nginx部署

  1. 拉取 Nginx 镜像:docker pull nginx

  2. 创建 Nginx 容器:docker run -id --name=nginx -p 80:80 nginx

  3. 测试 Nginx

  4. 配置反向代理:

官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下。在容器内编辑配置文件不方便,我们可以先将配置文件从容器内拷贝到宿主机,编辑修改后再拷贝回去。

从容器拷贝配置文件到宿主机:

docker cp nginx:/etc/nginx/nginx.conf nginx.conf

编辑nginx.conf,添加反向代理配置:

upstream tomcat-cas {
server 172.17.0.7:8080;
}
server {
listen 80;
server_name passport.pinyougou.com;
location / {
proxy_pass http://tomcat-cas;
index index.html index.htm;
}
}

将修改后的配置文件拷贝到容器:

docker cp nginx.conf nginx:/etc/nginx/nginx.conf

重新启动容器

设置域名指向:

这里推荐使用:SwitchHost这个管理Host的小工具。下载地址:https://oldj.github.io/SwitchHosts/

记得以管理员身份运行,这里只能配 IP 和 域名的映射关系,如果想要区别端口,在浏览器输入域名:端口号就OK

Redis部署

  1. 拉取 Redis 镜像:docker pull redis

  2. 创建 Redis 容器:docker run -id --name=redis -p 6379:6379 redis

  3. 测试,在redis目录下启动cmd,输入以下命令: redis-cli -h 宿主机器IP 【端口号默认6379】

C:\develop\redis-2.8.9>redis-cli -h 192.168.40.131

备份与迁移

容器保存为镜像

docker commit 容器名 镜像名

镜像备份

docker  save -o mynginx.tar mynginx
// -o 指定输出到的文件名

镜像恢复与迁移

docker load -i mynginx.tar

Docker入门学习笔记的更多相关文章

  1. docker入门-学习笔记

    docker可以类比成window下的VMware或者virtualbox软件.docker有两个基本的概念:容器(container)和镜像(image),分别对应为VMware中的系统镜像和系统镜 ...

  2. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  3. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  4. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  5. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  6. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  7. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  8. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  9. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

随机推荐

  1. [apue] 使用 popen/pclose 的一点疑问

    当我们需要将输出作为标准输入传递给一个命令,或者将一个命令的输出作为标准输入来读取, 一般会想到使用pipe与fork相结合的方式,来重定向标准输入/输出给指定命令. popen/pclose 帮助我 ...

  2. TensorFlow 2.0 入门教程实战案例

    中文文档 TensorFlow 2 / 2.0 中文文档 知乎专栏 欢迎关注知乎专栏 https://zhuanlan.zhihu.com/geektutu 一.实战教程之强化学习 TensorFlo ...

  3. Hive入门(四)查询优化

    1 本地模式 0.7版本后Hive开始支持任务执行选择本地模式(local mode). 大多数的Hadoop job是需要hadoop提供的完整的可扩展性来处理大数据的.不过,有时hive的输入数据 ...

  4. UVa 10480:Sabotage (最小割集)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. 微信小程序注册流程

    响应公司号召,跟上时代潮流,接下来我将独自开发微信小程序,接下来我介绍下注册流程,后续会补上小程序开发心得. 注册流程 注册之前,需要使用一个邮箱,该邮箱作为登录小程序的账号,这个邮箱不能被微信开放平 ...

  6. django基础知识之csrf:

    csrf 全称Cross Site Request Forgery,跨站请求伪造 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完 ...

  7. C语言学习书籍推荐《你必须知道的495个C语言问题》

    萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...

  8. 一个内存不能被written的问题

    C程序面试中曾经面试过这样一道题: #include <stdio.h> int main() { char *p = "12345"; *p = '6'; print ...

  9. NDK_OVERVIEW翻译

    Android NDK Overview Introduction: The Android NDK is a set of tools that allows Android application ...

  10. ASP.NET--Web服务器端控件和Html控件

    今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但 ...