自從2013年Docker問世後,短短几年時間已經成爲了火爆全球的容器化解決方案,被認爲可能會改變軟件行業的發展,時至今日,可能還有許多開發者不知道,不瞭解Docker是什麼,解決了什麼問題,咱們爲何要用Docker,此係列文章將會詳細解釋,幫助你們理解他,而且加入一些實例來更好的使用.php
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
軟件開發中,經歷的最麻煩也是你們最不喜歡的一件事就是環境的配置,每一次公司新換服務器或者本身新購買了一臺服務器,環境配置永遠首要工做,而且安裝一個服務還會涉及到一系列的依賴服務github
並且若是兩臺服務器的環境配置或者內核不相同,就會出現一臺機器能夠跑,另外一臺機器因爲各類奇葩或者沒法解決的問題致使跑不起來的尷尬狀況sql
環境配置如此麻煩,換一臺機器,就要重來一次,曠日費時。不少人想到,能不能從根本上解決問題,軟件能夠帶環境安裝?也就是說,安裝的時候,把原始環境如出一轍地複製過來。docker
大部分我的服務器和小公司的服務器中,不少狀況下都是好多服務部署在同一臺服務器中,即使是大型的分佈式項目,也有可能兩個服務的某個節點在同一臺服務器中,這種使用狀況致使若是某一服務發現異常致使cpu跑滿,則在此臺服務器中全部的服務都將掛掉,這不是咱們所指望的數據庫
那麼有人可能會提到虛擬機技術,虛擬機技術佔用的資源過於誇張,可能我實際運行的服務只佔用幾MB內存,可是仍是須要佔用宿主機幾百MB內存才能使用,並且虛擬機的管理方式比較麻煩,而且啓動和退出都是十分慢的
那麼基於以上這些問題,linux提供給用戶容器化的技術,首先要明確一個概念,容器並非docker率先提出的,甚至不是linux,容器化的概念早在2000年就已經被提出了
而Linux容器不是模擬一個完整的操做系統,而是對進程進行隔離。或者說,在正常進程的外面套了一個保護層。對於容器裏面的進程來講,它接觸到的各類資源都是虛擬的,從而實現與底層系統的隔離。
Docker 屬於 Linux 容器的一種封裝 ,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機技術更爲輕便、快捷,提供簡單易用的容器使用接口(Docker Client 即docker命令行)。它是目前最流行的 Linux 容器解決方案。
Docker是CS架構主要有兩個概念
Docker中容器,鏡像和倉庫的概念,相似於LOL中英雄商店(倉庫),你擁有的英雄(鏡像),你在遊戲中游玩的英雄(容器),好比想玩一個快樂風男(運行一個Apache服務),首先你要先從商店中購買英雄(從倉庫中下載鏡像),而後在開啓遊戲選擇快樂風男(使用鏡像啓動容器)
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
將鏡像運行呈容器
命令解讀
若是以上命令執行成功就會返回一個命令提示符
[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運行容器的實例就進行完成啦~
想觀看更多教程能夠移步個人我的博客 小阿宅的我的博客
感謝觀看