Docker基础教程(1)-基础概念

Docker基础教程(1)

自从2013年Docker问世后,短短几年时间已经成为了火爆全球的容器化解决方案,被认为可能会改变软件行业的发展,时至今日,可能还有许多开发者不知道,不了解Docker是什么,解决了什么问题,咱们为何要用Docker,此系列文章将会详细解释,帮助你们理解他,而且加入一些实例来更好的使用.php

什么是docker

Docker 是世界领先的软件容器平台。开发人员利用 Docker 能够消除协做编码时“在个人机器上可正常工做”的问题。运维人员利用 Docker 能够在隔离容器中并行运行和管理应用,得到更好的计算密度。企业利用 Docker 能够构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。html

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了 Docker,就不用担忧环境问题。java

整体来讲,Docker 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。mysql

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 受权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推进 开放容器联盟(OCI)。linux

Docker 自开源后受到普遍的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至因为 Docker 项目的火爆,在 2013 年末,dotCloud 公司决定更名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中普遍应用 Docker。git

Docker解决了什么问题

环境配置的问题

软件开发中,经历的最麻烦也是你们最不喜欢的一件事就是环境的配置,每一次公司新换服务器或者本身新购买了一台服务器,环境配置永远首要工做,而且安装一个服务还会涉及到一系列的依赖服务github

并且若是两台服务器的环境配置或者内核不相同,就会出现一台机器能够跑,另外一台机器因为各类奇葩或者没法解决的问题致使跑不起来的尴尬状况sql

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。不少人想到,能不能从根本上解决问题,软件能够带环境安装?也就是说,安装的时候,把原始环境如出一辙地复制过来。docker

资源使用的问题

大部分我的服务器和小公司的服务器中,不少状况下都是好多服务部署在同一台服务器中,即使是大型的分布式项目,也有可能两个服务的某个节点在同一台服务器中,这种使用状况致使若是某一服务发现异常致使cpu跑满,则在此台服务器中全部的服务都将挂掉,这不是咱们所指望的数据库

那么有人可能会提到虚拟机技术,虚拟机技术占用的资源过于夸张,可能我实际运行的服务只占用几MB内存,可是仍是须要占用宿主机几百MB内存才能使用,并且虚拟机的管理方式比较麻烦,而且启动和退出都是十分慢的

容器化

那么基于以上这些问题,linux提供给用户容器化的技术,首先要明确一个概念,容器并非docker率先提出的,甚至不是linux,容器化的概念早在2000年就已经被提出了

而Linux容器不是模拟一个完整的操做系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。

Docker是什么

Docker 属于 Linux 容器的一种封装 ,从文件系统、网络互联到进程隔离等等,极大的简化了容器的建立和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷,提供简单易用的容器使用接口(Docker Client 即docker命令行)。它是目前最流行的 Linux 容器解决方案。

Docker是CS架构主要有两个概念

  • Docker deamon: 运行在宿主机上,Docker守护进程,用户在宿主机中使用Docker Client(docker 命令行)来与Docker deamon 进行交互
  • Docker client: 是用户使用Docker的主要方式,Docker client与Docker daemon通讯并将结果返回给用户,Docker client也能够经过socket或者RESTful api访问远程的Docker daemon

Docker的安装

Ubuntu Docker 安装

CentOS Docker 安装

Windows Docker 安装

MacOS Docker 安装

Docker的重要概念

镜像(Image)

  • Docker的镜像相似虚拟机的快照,不过更轻量,不过image只是一个静态的文件,并无运行任何程序,只占用磁盘资源
  • Docker把应用程序及其依赖打包在一个image文件里面,能够理解为一个容器的使用. 经过这个image文件能够生成容器的实例.同一个image文件能够生成同时运行的多个实例

容器(Container)

  • 等同于从快照中建立出的虚拟机,也是服务实际运行的地方
  • 容器是从镜像建立的运行实例,它能够被启动、开始、中止、删除.每一个容器都是相互隔离的,保证安全的平台
  • 能够把容器看做一个简易的Linux环境和运行在其中的应用程序
  • 容器中的端口能够与宿主机共享,也可使用端口映射的方式来映射到宿主机中详见Docker中的网络和端口

仓库(Registry)

  • Docker仓库能够理解为git仓库或者maven仓库同样的远程存储中心,仓库中存储的是image数据,仓库能够选择公共的DockerHub(相似github),也能够选择在本身的服务器上搭建属于本身的Docker仓库(相似gitlab,gogs等私人仓库)

Docker中容器,镜像和仓库的概念,相似于LOL中英雄商店(仓库),你拥有的英雄(镜像),你在游戏中游玩的英雄(容器),好比想玩一个快乐风男(运行一个Apache服务),首先你要先从商店中购买英雄(从仓库中下载镜像),而后在开启游戏选择快乐风男(使用镜像启动容器)

数据卷(volumes)

  • 数据卷是一个可供一个容器或多个容器使用的特殊目录
  • 进程和数据的分离
  • 实际保存在容器以外,从而容许你在不影响数据的状况下对容器进行销毁、重建、修改、丢弃
  • 可用于数据持久化
  • 数据卷的共享, 能够在多个容器中共享数据

连接(links)

  • 容器的链接系统是除了端口的映射外,另外一种跟容器中应用交互的方式
  • 在源和容器之间建立一个隧道,接收容器能够看到源容器指定的信息
  • Docker在两个互联的容器之间建立了一个安全隧道,并且不用映射他们的端口到宿主机上,从而避免了暴露关键系统(如数据库)端口到外部网络上

Docker简单实践

Docker的基础概念已经整理的差很少了,接下来咱们来动手实践一下运行一个Docker的CentOS容器

运行命令docker search centos搜索镜像

[root@iZbp1cwfb0i1aften1twtvZ ~]# docker search centos
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             The official build of CentOS.                   5615      [OK]       
docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              124                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos ...   113                  [OK]
docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   99                   [OK]
docker.io   docker.io/centos/mysql-57-centos7            MySQL 5.7 SQL database server                   63                   
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                   [OK]
docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      44                   
docker.io   docker.io/centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relationa...   39                   
docker.io   docker.io/kinogmt/centos-ssh                 CentOS with SSH                                 29                   [OK]
docker.io   docker.io/pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag nam...   10                   
docker.io   docker.io/guyton/centos6                     From official centos6 container with full ...   9                    [OK]
docker.io   docker.io/drecom/centos-ruby                 centos ruby                                     6                    [OK]
docker.io   docker.io/centos/tools                       Docker image that has systems administrati...   4                    [OK]
docker.io   docker.io/darksheer/centos                   Base Centos Image -- Updated hourly             3                    [OK]
docker.io   docker.io/mamohr/centos-java                 Oracle Java 8 Docker image based on Centos 7    3                    [OK]
docker.io   docker.io/pivotaldata/centos                 Base centos, freshened up a little with a ...   3                    
docker.io   docker.io/miko2u/centos6                     CentOS6 日本語環境                                   2                    [OK]
docker.io   docker.io/pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated ...   2                    
docker.io   docker.io/pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile...   2                    
docker.io   docker.io/blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                    [OK]
docker.io   docker.io/indigo/centos-maven                Vanilla CentOS 7 with Oracle Java Developm...   1                    [OK]
docker.io   docker.io/mcnaughton/centos-base             centos base image                               1                    [OK]
docker.io   docker.io/pivotaldata/centos6.8-dev          CentosOS 6.8 image for GPDB development         0                    
docker.io   docker.io/pivotaldata/centos7-dev            CentosOS 7 image for GPDB development           0                    
docker.io   docker.io/smartentry/centos                  centos with smartentry                          0                    [OK]
复制代码

选择star数最高的第一个镜像,NAME字段就是镜像的名称,下载的时候能够省略docker.io

运行docker pull centos 下载centos镜像,能够在镜像后面加入:版本号来下载对应的版本,默认选择latest版本

[root@iZbp1cwfb0i1aften1twtvZ ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for docker.io/centos:latest
复制代码

运行docker images查看已经下载的镜像

[root@iZbp1cwfb0i1aften1twtvZ ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                     latest              0f3e07c0138f        2 weeks ago         220 MB
复制代码

运行docker run -it --name mycentos -v /tmp/centos/:/tmp/ -e IMAGENAME=testcentos centos /bin/bash将镜像运行呈容器

命令解读

  • run命令将镜像运行成容器
  • -it 以命令行的形式打开
  • --name 指定运行容器的名称,若是不指定则默认分配一个名称
  • -v 数据卷的指定,将容器中的/tmp/目录映射到/tmp/centos/下
  • -e 环境变量的设定
  • centos 镜像名称的指定(若是有标签,还须要提供标签,默认是 latest 标签)。
  • /bin/bash 容器启动之后,内部第一个执行的命令。这里是启动 Bash,保证用户可使用 Shell。

若是以上命令执行成功就会返回一个命令提示符

[root@iZbp1cwfb0i1aften1twtvZ ~]# docker run -it --name mycentos -v /tmp/centos/:/tmp/ -e IMAGENAME=testcentos centos bash
[root@a90b77adefcf /]# 
复制代码

能够看到咱们目前实际已经进入了容器中,试着运行echo $IMAGENAME输出一下咱们制定的环境变量

[root@a90b77adefcf /]# echo $IMAGENAME
testcentos
复制代码

接下来测试一下数据卷的使用,咱们进入/tmp文件夹并建立一个文件而且输入一些内容

[root@a90b77adefcf tmp]# cd /tmp/
[root@a90b77adefcf tmp]# touch test.txt
[root@a90b77adefcf tmp]# echo test > test.txt 
复制代码

接下来咱们退出容器,注意退出容器有两种方式exit命令(Ctrl+D也可)和Ctrl+P+Q,第一种退出方式会关闭当前bash对话框,第二种则是bash后台运行直接返回宿主机,因为咱们的docker容器须要一个主线程来支撑,若是容器以为没有任何线程或者bash在运行,则会以为本身没事情作选择本身退出容器,各位小伙伴在之后的使用中若是出现容器刚刚启动就退出的状况,有多是这个问题

由于咱们目前只有这一个bash在运行,若是是用exit的话容器就会关闭,因此咱们选择Ctrl+P+Q退出容器

[root@a90b77adefcf tmp]# [root@iZbp1cwfb0i1aften1twtvZ ~]# 
复制代码

能够看到咱们已经回到宿主机中了,运行docker ps查看正在运行的容器

[root@iZbp1cwfb0i1aften1twtvZ ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                              NAMES
a90b77adefcf        centos               "bash"                   16 minutes ago      Up 16 minutes                                                          mycentos
复制代码

咱们的centos服务还在后台默默地运行,那么咱们来看看刚刚在容器中建立的文件是否能在宿主机中正常查看呢

[root@iZbp1cwfb0i1aften1twtvZ ~]# cd /tmp/centos/
[root@iZbp1cwfb0i1aften1twtvZ centos]# cat test.txt 
test
[root@iZbp1cwfb0i1aften1twtvZ centos]#
复制代码

能够看到咱们在容器中建立的这个文件依旧能够在宿主机中查看

接下来咱们运行docker stop mycentos来中止掉这个容器(此处可使用容器的名称,也可使用容器的id)

[root@iZbp1cwfb0i1aften1twtvZ centos]# docker stop mycentos
mycentos
复制代码

运行docker ps -a查看全部的容器

[root@iZbp1cwfb0i1aften1twtvZ centos]# docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                                              NAMES
a90b77adefcf        centos               "bash"                   20 minutes ago      Exited (0) 58 seconds ago                                                      mycentos

复制代码

该容器的STATUS已经变成了Exited,说明该容器已经中止了,可是中止的容器也会占用咱们服务器的磁盘资源,因此运行docker rm mycetnos 删除该容器

[root@iZbp1cwfb0i1aften1twtvZ centos]# docker rm mycentos
mycentos
复制代码

有兴趣的同窗能够回去看一下刚刚咱们建立的text.txt文件,依旧存在宿主机中,这就是数据卷的持久化保存

接下来咱们删除掉使用的镜像 运行docker rmi centos删除镜像

[root@iZbp1cwfb0i1aften1twtvZ centos]# docker rmi centos
Untagged: centos:latest
Untagged: docker.io/centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Deleted: sha256:0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da
Deleted: sha256:9e607bb861a7d58bece26dd2c02874beedd6a097c1b6eca5255d5eb0d2236983
复制代码

这样整个docker运行容器的实例就进行完成啦~

想观看更多教程能够移步个人我的博客 小阿宅的我的博客

感谢观看

相关文章
相关标签/搜索