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運行容器的實例就進行完成啦~

想觀看更多教程能夠移步個人我的博客 小阿宅的我的博客

感謝觀看

相關文章
相關標籤/搜索