Docker安裝與啓動
前言
目標
- 掌握Docker基礎知識,能夠理解Docker鏡像與容器的概念
- 完成Docker安裝與啓動
- 掌握Docker鏡像與容器相關命令
- 掌握Tomcat Nginx 等軟件的常用應用的安裝
- 掌握docker遷移與備份相關命令
- 能夠運用Dockerfile編寫創建容器的腳本
- 能夠搭建與使用docker私有倉庫
Docker 簡介
1.1 什麼是虛擬化
在計算中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶可以比原來的組態更好的方式來應用這些資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算機和資料存儲。
1.2 什麼是Docker
Docker是一個開源項目,誕生於2013年初,最初是dotCloud公司內部的一個業餘項目。它基於Google公司推出的Go語言實現。項目後來加入了Linux基金會,遵循了Apache2.0協議,項目代碼在gitHub上進行維護。
Docker 自開源後受到廣泛關注和討論,以至於dotCloud公司後來都改名爲 Docker Inc。ReaHat已經在其 RHEL6.5中集中支持Docker:Google也在其Pass產品中廣泛應用。
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。Docker 的基礎是Linux容器(LXC) 等技術。
在LXC的基礎上 Docker進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更爲簡便。用戶操作Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
1.3 爲什麼選擇Docker
(1)上手快
用戶只需要幾分鐘,就可以把自己的程序“Docker化”。Docker依賴於“寫時複製”(copy-on-write),使修改應用程序也非常迅速,可以說達到“隨心所致,代碼即改"的境界。
隨後,就可以創建容器來運行應用程序了。大多數Docker容器只需要不到1秒中即可啓動。由於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶儘可能的充分利用系統資源。
(2)職責的邏輯分類
使用Docker,開發人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結爲肯定是運維的問題)。
(3)快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裏面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就形成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務都可以表示爲一系列內部互聯的容器,從而使分佈式部署應用程序,擴展或調試應用程序都變得非常簡單,同時也提高了程序的內省性(當然,可以在一個容器中運行多個應用程序)。
1.4 容器與虛擬機的比較
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器時在操作系統層面上實現虛擬化,直接複用本地主機的操作系統,二傳統方式則時在硬件層面實現。
與傳統的虛擬機相比,Docker優勢體現爲啓動快、佔用體積小。
1.5 Docker組件
1.5.1 docker客戶端和服務器(守護進程)
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只需要向Docker服務器或者守護進程發出請求,服務器或者守護進程將完成所有工作並返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。
1.5.2 Docker 鏡像與容器
鏡像是構建Docker的基石。用戶基於鏡像來運行自己的容器。鏡像也是Docker生命週期中的“構建"部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:
添加一個文件;
執行一個命令;
打開一個窗口。
也可以將鏡像當作容器的“源代碼"。鏡像體積很小,非常“便攜",易於分享、存儲和更新。
Docker可以幫助你構建和部署容器,你只需要把自己應用程序或服務打包即可。容器是基於鏡像啓動起來的,容器中可以運行一個或多個進程。我們可以認爲,鏡像是Docker生命週期中的構建或者打包階段,而容器則是啓動或者執行階段。容器基於鏡像啓動,一旦啓動完成後,我們就可以登錄到容器中安裝自己需要的軟件或者服務。
所以Docker 容器就是:
一個鏡像;
一些標準操作;
一個執行環境。
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟件。
和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麼,它不管是web服務器,還是數據庫,或者是應用程序服務器什麼的。所有的容器都按照相同的方式將內容“裝載"進去。
Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的服務器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。
使用Docker,我們可以快速的構建一個應用程序服務器、一個消息總線、一套實用工具、一個持續集成(CI)測試環境或者任意一種應用程序、服務或工具。我們可以在本地構建一個完整的測試環境,也可以爲生產或開發快速複製一套複雜的應用程序棧。
1.5.3 Registry(註冊中心、倉庫)
Docker用Registry來保存用戶構建的鏡像。Registry分爲公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。用戶可以在Docker Hub註冊賬號,分享並保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry)。
一、環境
- Centos7.x
Centos 鏡像下載地址:
http://isoredirect.centos.org/centos/
此處忽略下載和安裝
二、安裝Docker
(1)yum包更新到最新
sudo yum update
(2)安裝需要的軟件包,yum-util 提供 yum-config-manager 功能,另外兩個是devicemapper 驅動依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3) 設置yum源爲阿里雲
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安裝docker
sudo yum install docker-ce
(5)安裝後查看docker版本
docker -v
三、設置ustc的鏡像
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04 版本的時候就在用。ustc的docker鏡像加速器速度很快。 ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。
ustc地址:
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
創建該(daemon.json)文件:
遞歸創建文件夾:
mkdir -p /etc/docker
指定目錄創建文件:
touch /etc/docker/daemon.json
編輯該文件:
vi /etc/docker/daemon.json
在該文件中輸入以下內容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
四、Docker的啓動與停止
systemctl 命令是系統服務管理指令
啓動docker:
systemctl start docker
停止docker:
systemctl stop docker
重啓docker:
systemctl restart docker
查看docker的狀態:
systemctl status docker
設置開機自動啓動:
systemctl enable docker
查看docker概要信息:
docker info
查看docker幫助文檔:
docker --help
五、常用命令
5.1 鏡像相關命令
5.1.1 查看鏡像
docker images
REPOSITORY :鏡像名稱
TAG :鏡像標籤>IMAGE ID:鏡像ID
CREATED:鏡像的創建日期(不是獲取該鏡像的日期)
SIZE:鏡像大小 這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
5.1.2 搜索鏡像
docker search mysql
這裏 mysql 爲鏡像名稱,就是關於這個鏡像名稱的都有哪些
NAME :倉庫名稱
DESCRIPTION: 鏡像描述
STARS: 用戶評價,反應一個鏡像的受歡迎度
OFFICIAL: 是否官方提供
AUTOMATED: 自動構建,表示該鏡像由Docker Hub自動構建流創建的
5.1.3 拉取鏡像
拉取鏡像就是從中央倉庫中下載鏡像到本地
docker pull 鏡像名稱
例如,我要下載mysql 這樣一個鏡像
docker pull mysql
docker pull mysql 默認的是latest 最後一個版本號,這個是沒有指定版本號,如果你想指定版本下載:
docker pull mysql:5.7 這樣下載的就是指定版本鏡像
查看到我們剛纔下載好的鏡像:
5.1.4 刪除鏡像
按鏡像ID刪除鏡像:
docker rmi 鏡像ID
刪除所有鏡像:
docker rmi `docker images -q`
5.2 容器相關命令
5.2.1 查看容器
查看正在運行的容器:
docker ps
查看所有容器:
docker ps -a
查看最後一次運行的容器:
docker ps -l
查看停止的容器:
docker ps -f status-exited
5.2.2 創建與啓動容器
創建容器常用的參數說明:
創建容器命令:
docker run
-i: 表示運行容器
-t: 表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。
即分配一個僞終端。
--name:爲創建的容器命名。
-v: 表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),
可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上
做修改,然後共享到容器上。
-d: 在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後
不會自動登錄容器,如過只加-i -t兩個參數,創建後就會自動進入容器)。
-p: 表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多
個-p做端口映射
(1)交互式方式創建容器(退出容器就相當於關機狀態):
docker run -it --name=容器名稱 鏡像名稱:標籤 /bin/bash
這時我們通過ps命令查看,發現可以看到啓動的容器,狀態爲啓動狀態
退出當前容器:
exit
5.2.2.1 模擬操作一個centos 版本爲7的鏡像:
# 下載版本號爲7的centos鏡像
docker pull centos:7
# 查看所有鏡像
docker images
# 交互式運行並進入容器(docker 虛擬的 centos7環境) 如下圖
docker run -it --name=mycentos centos:7 /bin/bash
退出docker容器:
exit
退出之後查看交互式運行的docker啓動方式啓動的centos7的運行狀態:
docker ps -a
發現屬於關閉狀態
(2)守護式方式創建容器(退出容器繼續運行):
docker run -di --name=容器名稱 鏡像名稱:標籤
查看容器
docker images
docker容器守護方式啓動centos7:
docker run -id --name=centos7d centos:7
查看正在運行的容器:
這樣就是守護式方式啓動的容器,正在運行
====================================================
進入剛纔守護式創建的容器(centos7d):
docker exec -it centos7d /bin/bash
退出當前容器
exit
我們驗證一下退出之後,容器是否繼續運行:
docker ps
發現容器還是正在運行,沒有問題。
5.2.3 停止與啓動容器
停止容器
docker stop 容器名稱(或者容器ID)
啓動容器
docker start 容器名稱(或者容器ID)
演示停止:
演示啓動:
5.2.4 文件拷貝
如果我們需要將文件拷貝到容器內可以使用cp命令
docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
也可以將文件從容器內拷貝出來
docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
演示拷貝文件到容器內:
演示從容器內部拷貝文件出來:
5.2.5 目錄掛載
我們可以在 “創建容器” 的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。
創建容器 添加-v參數 後邊爲 宿主機目錄:容器目錄,例如:
docker run -di --name=mycentos2 -v /usr/local/myhtml:/usr/local/myhtml centos:7
如果你共享的是多級目錄,可能會出現權限不足的提示。
這是因爲Centos7中的安全模塊selinux把權限禁掉了,我們需要添加參數
–privileged=true
來解決掛載的目錄沒有權限的問題。
容器創建目錄映射演示:
5.2.6 查看容器ip地址
我們可以通過以下命令查看容器運行的各種數據:
docker inspect 容器名稱(容器ID)
也可以直接執行下面的命令直接輸出IP地址:
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
演示:
5.2.7 刪除容器&刪除鏡像
刪除指定容器:
docker rm 容器名稱(容器ID)
刪除鏡像(上面已經有了,這裏再寫一遍是因爲,還有容器運行鏡像是不允許刪除了,必須停止所有的容器):
docker rmi 鏡像名稱:版本號
演示圖:
六、應用部署
6.1 MySQL 部署
(1) 拉取鏡像
docker pull centos/mysql-57-centos7
(2) 創建容器
docker run -di --name=test_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
-p 代表端口映射,格式爲 宿主機映射端口:容器運行端口
-e 代表添加環境變量 MYSQL_ROOT_PASSWORD 是root用戶的登錄密碼
(3) 遠程登錄mysql
連接宿主機的IP,指定端口爲33306
6.2 tomcat部署
(1)拉取鏡像
docker pull tomcat:7-jre7
(2)創建容器
創建容器-p表示地址映射:
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
準備一個war包,丟到宿主機的:/usr/local/webapps 目錄;
瀏覽器訪問: 宿主機的ip:9000 即可訪問
6.3 nginx部署
(1)拉取鏡像
docker pull nginx
(2)創建Nginx容器
docker run -di --name=mynginx -p 8888:80 nginx
結果:
(3)在自己的nginx 容器部署靜態頁面
進入容器
docker exec -it mynginx /bin/bash
nginx位於此目錄下
找到nginx 配置:
切換目錄到 include 文件目錄
cd /etc/nginx/conf.d/
看看配置文件配置了我們的html位置:
轉移到此目錄下:
這裏就看到了我們熟悉的50x.html index.html
按照圖片的命令操作,隨便創建個index.html 文件並cp命令到容器,刷新瀏覽器看效果即可:
6.4 Redis 部署
(1)拉取鏡像
docker pull redis
(2)創建容器
docker run -di --name=myredis -p 6379:6379 redis
測試結果
6.5 遷移與備份
6.5.1容器保存爲鏡像
我們可以通過以下命令將容器保存爲鏡像:
docker commit mynginx mynginx_i
查看保存的鏡像:
docker images
運行我們保存的鏡像:
docker run -di --name=mynginx2 -p 8889:80 mynginx_i
6.5.2 鏡像備份
我們可以通過以下命令將鏡像保存爲tar文件
docker save -o mynginx.tar mynginx_i
6.5.3 鏡像恢復與遷移
當前centos7模擬準備,刪除掉剛纔的mynginx_i鏡像:
執行此命令進行恢復
docker load -i mynginx.tar
-i 輸入的文件
執行後再次檢查鏡像,可以看到鏡像已經恢復
恢復結果:
七、Dockerfile
7.1 什麼是Dockerfile
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
1、對於開發人員:可以爲開發團隊提供一個完全一致的開發環境;
2、對測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了;
3、對於運維人員:在部署時,可以實現應用的無縫移植。
7.2 常用命令
命令 | 作用 |
---|---|
FROM image_name.tag | 定義了使用哪個基礎鏡像啓動構建流程 |
MAINTAINER user_name | 聲明鏡像的創建者 |
ENV key_value | 設置環境變量(可以寫多條) |
RUN command | 是Dockerfile的核心部分(可以寫多條) |
ADD source_dir/file dest_dir/file | 將宿主機文件複製到容器內,如果是一個壓縮文件,複製後自動解壓 |
COPY source_dir/file dest_dir/file | 將宿主機文件複製到容器內,壓縮文件不解壓 |
WORKDIR path_dir | 設置工作目錄 |
- 模擬JDK8 鏡像搭建:
mkdir -p /usr/local/dockerjdk8
上傳jdk8文件到創建的目錄上:
如圖,此處忽略下載jdk8和上傳到宿主機的過程:
- 構建文件, 注意這個名稱必須叫 Dockerfile 而且D 是大寫
vi Dockerfile
填入此段內容,注意指定自己的jdk版本號,我的是 251:
# 基礎鏡像,不存在則自動下載
FROM centos:7
# 指定創建鏡像的創建者
MAINTAINER dock
# 設置當前目錄
WORKDIR /usr
# 創建java目錄
RUN mkdir /usr/local/java
# ADD 剛纔上傳的壓縮文件,上傳到指定目錄
ADD jdk-8u251-linux-x64.tar.gz /usr/local/java
# JDK 環境變量配置
ENV JAVA_HOME /usr/local/java/jdk1.8.0_251
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
如圖:
按鍵盤 ESC 鍵, 並 :wq 保存並退出
構建Dockerfile文件
docker build -t='jdk1.8' .
-t 表示鏡像名稱
. 指定Dockerfile文件夾目錄,.代表當前目錄
構建完成
八、Docker私有倉庫
8.1 私有倉庫搭建與配置
(1)拉取私有倉庫鏡像
docker pull registry
(2)啓動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
(3)打開瀏覽器輸入地址 http://10.10.5.38:5000/v2/_catalog
看到{"repositories":[]}
表示私有倉庫搭建成功並且內容爲空
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下內容,保存並退出。
{"insecure-registries":["10.10.5.38:5000"]}
* 此步用於讓 docker信任私有倉庫地址
(5)重啓 docker
服務,使剛纔配置生效
systemctl restart docker
8.2 鏡像上傳至私有倉庫
(1)標記此鏡像爲私有倉庫的鏡像
docker tag jdk1.8 10.10.5.38:5000/jdk1.8
(2)上傳標記的鏡像
docker push 10.10.5.38:5000/jdk1.8
注意,在新的服務器要
安裝docker
- 修改daemon.json
vi /etc/docker/daemon.json
- 添加以下內容,保存並退出。
{"insecure-registries":["10.10.5.38:5000"]}
- 重啓
docker
服務,使剛纔配置生效
systemctl restart docker
- 然後拉取 jdk1.8鏡像到新的服務器上
docker push 10.10.5.38:5000/jdk1.8