Docker是一個開放源代碼軟件項目,讓應用程序佈署在軟件貨櫃下的工做能夠自動化進行,藉此在Linux操做系統上,提供一個額外的軟件抽象層,以及操做系統層虛擬化的自動管理機制。Docker利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心名字空間(namespaces),來建立獨立的容器(containers)。這能夠在單一Linux實體下運做,避免啓動一個虛擬機形成的額外負擔。Linux核心對名字空間的支持徹底隔離了工做環境中應用程序的視野,包括進程樹、網絡、用戶ID與掛載文件系統,而核心的cgroup提供資源隔離,包括CPU、存儲器、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer庫作爲以本身的方式開始直接使用由Linux核心提供的虛擬化的設施,mysql
Docker有兩個版本:
社區版(CE)
企業版(EE)
Docker Community Edition(CE)很是適合但願開始使用Docker並嘗試使用基於容器的應用程序的我的開發人員和小型團隊。linux
Docker企業版(EE)專爲企業開發和IT團隊而設計,他們能夠在生產中大規模構建,發佈和運行業務關鍵型應用程序git
功能 | 社區版 | 企業版基礎版 | 企業版標準 | 企業版高級版 |
---|---|---|---|---|
容器引擎和內置編排,網絡,安全性 | 是 | 是 | 是 | 是 |
通過認證的基礎設施,插件和ISV容器 | 否 | 是 | 是 | 是 |
圖像管理 | 否 | 否 | 是 | 是 |
容器應用管理 | 否 | 否 | 是 | 是 |
圖像安全掃描 | 否 | 否 | 否 | 是 |
Linux容器技術很早就有了,比較有名的是被集成到主流Linux內核中的LXC項目。容器經過對操做系統的資源訪問進行限制,構建成獨立的資源池,讓應用運行在一個相對隔離的空間裏,同時容器間也能夠進行通訊。容器技術對比虛擬化技術,容器比虛擬化更輕量級,對資源的消耗小不少。容器操做也更快捷,啓動和中止都要比虛擬機快。但Docker容器須要與主機共享操做系統內核,不能像虛擬機那樣運行獨立的內核。
Docker是一個基於LXC技術構建的容器引擎,基於GO語言開發,遵循Apache2.0協議開源。Docker的發展得益於爲使用者提供了更好的容器操做接口。包括一系列的容器,鏡像,網絡等管理工具,可讓用戶簡單的建立和使用容器。
Docker支持將應用打包進一個能夠移植的容器中,從新定義了應用開發,測試,部署上線的過程,核心理念就是 Build once, Run anywhere。Docker容器技術的典型應用場景是開發運維上提供持續集成和持續部署的服務。github
Docker的鏡像概念相似於虛擬機裏的鏡像,是一個只讀的模板,一個獨立的文件系統,包括運行容器所需的數據,能夠用來建立新的容器。鏡像能夠基於Dockerfile構建,Dockerfile是一個描述文件,裏面包含若干條命令,每條命令都會對基礎文件系統建立新的層次結構。用戶能夠經過編寫Dockerfile建立新的鏡像,也能夠直接從相似github的Docker Hub上下載鏡像使用。web
Docker容器是由Docker鏡像建立的運行實例。Docker容器相似虛擬機,能夠支持的操做包括啓動,中止,刪除等。每一個容器間是相互隔離的,但隔離的效果比不上虛擬機。容器中會運行特定的應用,包含特定應用的代碼及所需的依賴文件。
在Docker容器中,每一個容器之間的隔離使用Linux的 CGroups 和 Namespaces技術實現的。其中 CGroups 對CPU,內存,磁盤等資源的訪問限制,Namespaces 提供了環境的隔離。redis
若是你使用過 git 和 github 就很容易理解Docker的倉庫概念。Docker倉庫至關於一個 github 上的代碼庫。
Docker 倉庫是用來包含鏡像的位置,Docker提供一個註冊服務器(Registry)來保存多個倉庫,每一個倉庫又能夠包含多個具有不一樣tag的鏡像。Docker運行中使用的默認倉庫是 Docker Hub 公共倉庫。倉庫支持的操做相似 git,建立了新的鏡像後,咱們能夠 push 提交到倉庫,也能夠從指定倉庫 pull 拉取鏡像到本地。sql
Docker有下面這些組成docker
1.Docker 服務器守護程序(server daemon),用於管理全部的容器。shell
2.Docker 命令行客戶端,用於控制服務器守護程序。centos
3.Docker 鏡像:查找和瀏覽 docker 容器鏡像。
Docker特性
文件系統隔離:每一個進程容器運行在徹底獨立的根文件系統裏。
資源隔離:可使用cgroup爲每一個進程容器分配不一樣的系統資源,例如CPU和內存。
網絡隔離:每一個進程容器運行在本身的網絡命名空間裏,擁有本身的虛擬接口和IP地址。
寫時複製:採用寫時複製方式建立根文件系統,這讓部署變得極其快捷,而且節省內存和硬盤空間。
日誌記錄:Docker將會收集和記錄每一個進程容器的標準流(stdout/stderr/stdin),用於實時檢索或批量檢索。
變動管理:容器文件系統的變動能夠提交到新的映像中,並可重複使用以建立更多的容器。無需使用模板或手動配置。
交互式Shell:Docker能夠分配一個虛擬終端並關聯到任何容器的標準輸入上,例如運行一個一次性交互shell。
Docker兩個基礎概念images與container
Container和Image 在Docker的世界裏,Image是指一個只讀的層(Layer),這裏的層是AUFS裏的概念,最直觀的方式就是看一下docker官方給出的圖:
Docker使用了一種叫AUFS的文件系統,這種文件系統可讓你一層一層地疊加修改你的文件,最底下的文件系統是隻讀的,若是須要修改文件,AUFS 會增長一個可寫的層(Layer),這樣有不少好處,例如不一樣的Container能夠共享底層的只讀文件系統(同一個Kernel),使得你能夠跑N多 個Container而不至於你的硬盤被擠爆了!這個只讀的層就是Image!而如你所看到的,一個可寫的層就是Container。
那Image和Container的區別是什麼?很簡單,他們的區別僅僅是一個是隻讀的層,一個是可寫的層,你可使用docker commit 命令,將你的Container變成一個Image,也就是提交你所運行的Container的修改內容,變成一個新的只讀的Image,這很是相似於git commit命令。
Docker 要求 CentOS 系統的內核版本高於 3.10 ,安裝前須要驗證 CentOS 版本是否支持 Docker。
# 命令查看你當前的內核版本 $ uname -r # 更新yum $ sudo yum makecache fast # 安裝yum-utils $ sudo yum install yum-utils # 使用如下命令設置穩定存儲庫 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 卸載舊版本(若是安裝過舊版本的話) $ sudo yum remove docker docker-common docker-selinux docker-engine # 安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的 $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 安裝Docker $ sudo yum install docker-ce # 啓動、中止、重啓Docker服務 $ systemctl start | stop | restart docker.service # 設置開機啓動、關閉服務 $ systemctl enable | disable docker.service # 驗證安裝是否成功(有client和service兩部分表示docker安裝啓動都成功了) $ docker version [root@localhost ~]# docker version Client: Version: 18.03.0-ce API version: 1.37 Go version: go1.9.4 Git commit: 0520e24 Built: Wed Mar 21 23:09:15 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.03.0-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.4 Git commit: 0520e24 Built: Wed Mar 21 23:13:03 2018 OS/Arch: linux/amd64 Experimental: false [root@localhost ~]# # docker經過運行hello-world 映像驗證是否已正確安裝。 $ sudo docker run hello-world
# 搜索鏡像(我這裏搜索的是tomcat的鏡像) $ docker search tomcat # 下載鏡像(在搜索出來的鏡像列表中選擇一個下載,我這裏下載的是官方提供的centos鏡像,速度會有點慢,耐心等待) $ docker pull tomcat # 列出本機的鏡像 $ docker images # 基於image建立一個容器,運行完畢後並退出 $ docker run [centos] /bin/echo 'Hello world' # 運行一個交互式容器,-t表示指定一個容器內的僞tty。 # -i表示建立一個交互式鏈接,命令運行後,將會進入shell交互式界面,可執行任意的命令. $ docker run -t -i centos /bin/bash # 建立一個帶名字的容器 $ docker run -d --name myweb centos /bin/bash # 開始/中止/強制中止/重啓一個的容器 $ docker start/stop/kill/restart [container] # 刪除一個容器 $ docker rm [container] # 進入容器內容 $ docker exec -it [container] /bin/bash # 列出正在運行的容器,[-a]列出全部狀態下的容器,[-l]只列出最後一個啓動的容器。 $ docker ps [-a] [-l]
# -p 3306:3306:表示在這個容器中使用3306端口(第二個)映射到本機的端口號也爲3306(第一個) # 建立一個容器 docker run -d \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=[password] \ -v /xxx/mysql:/var/lib/mysql \ -v /etc/my.cnf:/etc/my.cnf mysql:5.7.23 # 建立用戶 create user 'user'@'%' identified by 'password'; # 受權 grant replication slave on *.* to 'user'@'%'; # 刷新 flush privileges;
# 運行一個docker容器 docker run -d \ --name redis \ -p 6379:6379 \ -v /xxx/redis:/data redis redis-server \ --appendonly yes \ --requirepass "[password]" # 參數詳解 docker run \ # 端口映射 宿主機:容器 -p 6379:6379 \ # 映射數據目錄 rw 爲讀寫 -v /xxx/data:/data:rw \ # 掛載配置文件 ro 爲readonly -v /xxx/conf/redis.conf:/etc/redis/redis.conf:ro \ # 給與一些權限 --privileged=true \ # 給容器起個名字 --name redis \ # 開啓數據持久化 --appendonly yes \ # deamon 運行 服務使用指定的配置文件 -d redis redis-server /xxx/conf/redis.conf
docker run -d \ -p 8080:8080 \ --name nexus \ -v /xxx/nexus:/var/nexus-data \ --restart=always sonatype/nexus3
docker run -d \ -p 8080:8080 \ -p 50000:50000 \ --name jenkins \ --privileged=true \ -v /xxx/jenkins:/var/jenkins_home jenkins
docker run --detach \ --hostname 120.76.77.230 \ --publish 444:443 \ --publish 8088:8088 \ --publish 25:22 \ --name gitlab \ --restart always \ --volume /xxx/gitlab/config:/etc/gitlab \ --volume /xxx/gitlab/logs:/var/log/gitlab \ --volume /xxx/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest