Docker入門之docker的安裝
Docker初體驗
Docker 簡介
Docker有兩個版本:
社群版(CE)
企業版(EE)
Docker Community Edition(CE)非常適合希望開始使用Docker並嘗試使用基於容器的應用程式的個人開發人員和小型團隊。
Docker企業版(EE)專為企業開發和IT團隊而設計,他們可以在生產中大規模構建,釋出和執行業務關鍵型應用程式
功能 | 社群版 | 企業版基礎版 | 企業版標準 | 企業版高階版 |
---|---|---|---|---|
容器引擎和內建編排,網路,安全性 | 是 | 是 | 是 | 是 |
經過認證的基礎設施,外掛和ISV容器 | 否 | 是 | 是 | 是 |
影象管理 | 否 | 否 | 是 | 是 |
容器應用管理 | 否 | 否 | 是 | 是 |
影象安全掃描 | 否 | 否 | 否 | 是 |
關於容器技術的介紹及概念
- 容器技術
Linux容器技術很早就有了,比較有名的是被整合到主流Linux核心中的LXC專案。容器通過對作業系統的資源訪問進行限制,構建成獨立的資源池,讓應用執行在一個相對隔離的空間裡,同時容器間也可以進行通訊。容器技術對比虛擬化技術,容器比虛擬化更輕量級,對資源的消耗小很多。容器操作也更快捷,啟動和停止都要比虛擬機器快。但Docker容器需要與主機共享作業系統核心,不能像虛擬機器那樣執行獨立的核心。
Docker是一個基於LXC技術構建的容器引擎,基於GO語言開發,遵循Apache2.0協議開源。Docker的發展得益於為使用者提供了更好的容器操作介面。包括一系列的容器,映象,網路等管理工具,可以讓使用者簡單的建立和使用容器。
Docker支援將應用打包進一個可以移植的容器中,重新定義了應用開發,測試,部署上線的過程,核心理念就是 Build once, Run anywhere。Docker容器技術的典型應用場景是開發運維上提供持續整合和持續部署的服務。 - 映象
Docker的映象概念類似於虛擬機器裡的映象,是一個只讀的模板,一個獨立的檔案系統,包括執行容器所需的資料,可以用來建立新的容器。映象可以基於Dockerfile構建,Dockerfile是一個描述檔案,裡面包含若干條命令,每條命令都會對基礎檔案系統建立新的層次結構。使用者可以通過編寫Dockerfile建立新的映象,也可以直接從類似github的Docker Hub上下載映象使用。 - 容器
Docker容器是由Docker映象建立的執行例項。Docker容器類似虛擬機器,可以支援的操作包括啟動,停止,刪除等。每個容器間是相互隔離的,但隔離的效果比不上虛擬機器。容器中會執行特定的應用,包含特定應用的程式碼及所需的依賴檔案。
在Docker容器中,每個容器之間的隔離使用Linux的 CGroups 和 Namespaces技術實現的。其中 CGroups 對CPU,記憶體,磁碟等資源的訪問限制,Namespaces 提供了環境的隔離。 - 倉庫
如果你使用過 git 和 github 就很容易理解Docker的倉庫概念。Docker倉庫相當於一個 github 上的程式碼庫。
Docker 倉庫是用來包含映象的位置,Docker提供一個註冊伺服器(Registry)來儲存多個倉庫,每個倉庫又可以包含多個具備不同tag的映象。Docker執行中使用的預設倉庫是 Docker Hub 公共倉庫。倉庫支援的操作類似 git,建立了新的映象後,我們可以 push 提交到倉庫,也可以從指定倉庫 pull 拉取映象到本地。
Docker有下面這些組成
1.Docker 伺服器守護程式(server daemon),用於管理所有的容器。
2.Docker 命令列客戶端,用於控制伺服器守護程式。
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 7 安裝 Docker CE)
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
[[email protected] ~]# 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
[[email protected] ~]#
docker通過執行hello-world 映像驗證是否已正確安裝。
$ sudo docker run hello-world
Docker的常用操作
獲取映象
搜尋映象(我這裡搜尋的是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引數,則列出所有狀態下的容器,包含處於stop狀態的容器。如果沒有帶-a引數,則只顯示出處於執行狀態的容器。-l引數表示只列出最後一個啟動的容器。
$ docker ps [-a] [-l]
docker容器的常用軟體安裝過程
安裝mysql
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;
安裝redis
docker run -d --name redis -p 6379:6379 -v /xxx/data/redis:/data redis redis-server --appendonly yes --requirepass "[password]"
docker run \
-p 6379:6379 \ # 埠對映 宿主機:容器
-v /xxx/data:/data:rw \ # 對映資料目錄 rw 為讀寫
-v /xxx/conf/redis.conf:/etc/redis/redis.conf:ro \ # 掛載配置檔案 ro 為readonly
--privileged=true \ # 給與一些許可權
--name redis \ # 給容器起個名字
--appendonly yes \ # 開啟資料持久化
-d redis redis-server /xxx/conf/redis.conf # deamon 執行 服務使用指定的配置檔案
安裝nexus
docker run -d -p 8080:8080 --name nexus -v /xxx/nexus:/var/nexus-data --restart=always sonatype/nexus3
安裝Jenkins
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true -v /xxx/jenkins:/var/jenkins_home jenkins