CSS基礎2--簡單應用
Docker簡介
什麼是虛擬化
在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。
在實際的生產環境中,虛擬化技術主要用來解決高效能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體對資源充分利用。
虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機器等等。
什麼是Docker
Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在
-
上手快:
Docker和虛擬機器比較
下面的圖片比較了Docker和傳統虛擬化方式的不同之處,可見容器是在作業系統層面上實現虛擬化,直接複用本地主機的作業系統,而傳統方式則是在硬體層面實現。
與傳統的虛擬機器相比,Docker又是體現為啟動速度快、佔用體積小。
使用上的區別如下圖:
Docker元件
Docker是一個客戶端-伺服器(C/S)架構程式。Docker客戶端只需要向Docker伺服器或者守護程序發出請求,伺服器或者守護程序將完成所有工作並返回結果。Docker提供了一個命令列工具Docker以及一整套RESTful API。你可以在同一臺宿主機上執行Docker守護程序和客戶端,也可以從本地的Docker客戶端連線到執行在另一臺宿主機上的遠端Docker守護程序。
Docker伺服器與客戶端
Docker是一個客戶端-伺服器(C/S)架構程式。Docker客戶端只需要向Docker伺服器或者守護程序發出請求,伺服器或者守護程序將完成所有工作並返回結果。Docker提供了一個命令列工具Docker以及一整套RESTful API。你可以在同一臺宿主機上執行Docker守護程序和客戶端,也可以從本地的Docker客戶端連線到執行在另一臺宿主機上的遠端Docker守護程序。
新增一個檔案、開啟一個視窗。也可以將映象當作容器的“原始碼”。映象體積很小,非常“便攜”,易於分享、儲存和更新。
Docker可以幫助你構建和部署容器,你只需要把自己的應用程式或者服務打包放進容器即可。容器是基於映象啟動起來的,容器中可以執行一個或多個程序。我們可以認為,映象是Docker生命週期中的構建或者打包階段,而容器則是啟動或者執行階段。 容器基於映象啟動,一旦容器啟動完成後,我們就可以登入到容器中安裝自己需要的軟體或者服務。
所以Docker容器就是:一個映象格式,一個執行環境。
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟體。
和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麼,它不管是web伺服器,還是資料庫,或者是應用程式伺服器什麼的。所有的容器都按照相同的方式將內容“裝載”進去。
Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的伺服器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。
Docker用Registry來儲存使用者構建的映象。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。使用者可以在Docker Hub註冊賬號,分享並儲存自己的映象(說明:在Docker Hub下載映象巨慢,可以自己構建私有的Registry)。
Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu釋出的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支援更新最新的一些補丁包的。
由於我伺服器環境都使用的是CentOS,因此這裡我們將Docker安裝到CentOS上。注意:這裡建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支援更新。
- yum包更新到最新。
1 sudo yum update
- 安裝需要的軟體包,yum-util提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的。
1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 設定yum源為阿里雲。
1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安裝Docker。
1 sudo yum install docker-ce
- 安裝後檢視docker版本。
1 docker -v
1 vim /etc/docker/daemon.json
- 在該檔案中輸入如下內容。
1 { 2 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 3 }
systemctl
1 systemctl startdocker
- 停止Docker。
1 systemctl stopdocker
- 重啟Docker。
1 systemctl restartdocker
- 檢視Docker狀態。
1 systemctl statusdocker
- 開機啟動Docker。
1 systemctl enable docker
- 檢視Docker概要資訊。
1 docker info
- 檢視Docker幫助文件。
1 docker --help
1 docker images
結果列名 | 說明 |
---|---|
REPOSITORY | 映象名稱 |
TAG | 映象標籤 |
IMAGE ID | 映象ID |
CREATED | 映象的建立日期(不是獲取該映象的日期) |
SIZE | 映象大小 |
這些映象都是儲存在Docker宿主機的/var/lib/docker目錄下。
如果你需要從網路中查詢需要的映象,可以通過以下命令搜尋。
1 docker search 映象名稱
結果列名 | 說明 |
---|---|
NAME | 倉庫名稱 |
DESCRIOTION | 映象描述 |
STARS | 使用者評價,反應一個映象的受歡迎程度 |
OFFCIAL | 是否官方 |
AUTOMATED | 自動構建,表示該映象由Docker Hub自動構建流程建立的 |
拉取映象就是從中央倉庫中下載映象到本地。
1 docker pull 映象名稱
例如,我要下載centos7映象
1 docker pull centos:7
按映象ID刪除映象。
1 docker rmi 映象ID
刪除所有映象。
1 docker rmi `docker images -q`
檢視正在執行的容器。
1 docker ps
檢視所有容器。
1 docker ps –a
檢視最後一次執行的容器。
1 docker ps –l
檢視停止的容器
1 docker ps -f status=exited
1 docker run
建立容器常用的引數說明。
引數 | 說明 |
---|---|
-i | 表示執行容器 |
-t | 表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。 |
--name | 表示給建立的容器命名 |
-v | 表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。 |
-d | 在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器) |
-p | 表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映 |
互動式方式建立容器
1 docker run -it --name=容器名稱 映象名稱:標籤 /bin/bash
退出當前容器。
1 exit
守護式方式建立容器
1 docker run -di --name=容器名稱 映象名稱:標籤
登入守護式容器。
1 docker exec -it 容器名稱 (或者容器ID) /bin/bash
1 docker stop 容器名稱或者容器ID
啟動容器。
1 docker start 容器名稱或者容器ID
1 docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄
將容器內的檔案拷貝到宿主機。
1 docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄
建立容器時,新增-v引數,後邊為宿主機目錄:容器目錄。
例如:
1 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多級的目錄,可能會出現許可權不足的提示。
這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要新增引數--privileged=true來解決掛載的目錄沒有許可權的問題。
1 docker inspect 容器名稱或容器ID
也可以直接執行下面的命令直接輸出IP地址。
1 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱或容器ID
1 docker rm 容器名稱或容器ID
1 docker pull mysql:5.7
- 建立容器。
1 # docker run -di --name=容器名字 -p 宿主機埠:容器埠 -e MYSQL_ROOT_PASSWORD=mysql密碼 容器名稱 2 docker run -di --name=mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-
遠端登入mysql:連線宿主機的IP ,指定埠為3306。
1 docker pull tomcat:7-jre7
- 建立容器。
1 # 建立tomcat容器,並掛載了webapps目錄 2 # -p表示地址對映 -v 表示目錄掛載 3 docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
1 docker pull nginx
- 建立容器。
1 docker run -di --name=mynginx -p 80:80 nginx
1 docker pull redis
- 建立容器。
1 docker run -di --name=myredis -p 6379:6379 redis
其中涉及到的命令有:
- docker commit:將容器儲存為映象
- docker save:將映象備份為tar檔案
- docker load:根據tar檔案恢復為映象
1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
如:
1 [root@a ~]# docker ps 2 CONTAINER ID IMAGE 3 5d9b684c8c64 nginx:latest 4 [root@a ~]# docker commit 5d9b684c8c64 my-nginx-image 5 sha256:32a0031127bc12826c0bc8e4292b8a38b98c5ab0158fd0189d59dbc27dadceec 6 [root@a ~]# docker images 7 REPOSITORY TAG IMAGE ID CREATED SIZE 8 my-nginx-image latest 32a0031127bc 4 seconds ago 133MB
1 docker save [OPTIONS] IMAGE [IMAGE...] -o, --output string Write to a file, instead of STDOUT
如:
1 [root@a ~]# docker save -o my-nginx-image.tar my-nginx-image:latest 2 [root@a ~]# ll 3 總用量 133708 4 -rw-------. 1 root root 136857088 9月 15 11:13 my-nginx-image.tar
1 docker load [OPTIONS] -i, --input string Read from tar archive file, instead of STDIN
如:
1 docker load -i my-nginx-image-3.tar
命令 | 作用 |
---|---|
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 | 和ADD相似,但是如果有壓縮檔案並不能解壓 |
WORKDIR path_dir | 設定工作目錄 |
1 mkdir –p /usr/local/docker-jdk
- 下載jdk-8u171-linux-x64.tar.gz並上傳到伺服器(虛擬機器)中的/usr/local/dockerjdk8目錄。
- 建立Dockerfile檔案。
1 vim /usr/local/docker-jdk/Dockerfile
- 將以下內容寫入Dockerfile檔案。
1 # 指定來源映象 2 FROM centos:7 3 4 # 指定映象作者姓名 5 MAINTAINER tankang 6 7 # 指定工作目錄:容器工作時相對路徑的基準 8 WORKDIR /usr 9 10 # 建立映象時執行指令建立/usr/local/java目錄 11 RUN mkdir /usr/local/java 12 13 # 將壓縮檔案新增到映象中,是相對路徑jar,會自動解壓 14 ADD jdk-8u121-linux-x64.tar.gz /usr/local/java 15 16 # 設定Java環境變數 17 ENV JAVA_HOME=/usr/local/java/jdk1.8.0_121 18 ENV PATH=$JAVA_HOME:$PATH
- 構建映象。
1 # 格式 2 docker build [OPTIONS] PATH | URL | - 3 # 例如 4 docker build -t='jdk1.8' . 5 # -t後面指定的是映象的名字,當然也可以在後面用冒號附加tag。最後的點表示宿主機中的當前目錄,讓構建程式在當前目錄下找到Dockerfile。
- 檢視映象是否建立完成。
1 docker images
- 拉取私有倉庫映象。
1 docker pull registry
- 啟動私有倉庫容器。
1 docker run -di --name=registry -p 5000:5000 registry
- 開啟瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":[]},表示私有倉庫搭建成功並且內容為空。
- 修改daemon.json。
1 vim /etc/docker/daemon.json
- 新增以下內容(此步用於讓Docker信任私有倉庫地址)。
1 {"insecure-registries":["宿主機IP:5000"]}
- 重啟Docker服務。
1 systemctl restart docker
1 docker tag jdk1.8 宿主機IP:5000/jdk1.8
- 再次啟動私服容器。
1 docker start registry
- 上傳標記的映象。
1 docker push 宿主機IP:5000/jdk1.8
- 開啟瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":["jdk1.8"]},表示上傳成功。
從私有倉庫拉取映象
大多數情況下,都是某臺伺服器部署了私有映象倉庫之後,到其它伺服器上從私有倉庫中拉取映象,若要拉取私有倉庫映象需要去修改docker的配置檔案,設定啟動時候的倉庫地址。
1 # 開啟配置檔案 2 vi /usr/lib/systemd/system/docker.service 3 # 在開啟的上述檔案中按照下面的圖,新增如下的內容;注意修改下面內容中的ip地址 4 --add-registry=宿主機IP:5000 --insecure-registry=宿主機IP:5000 \ 5 # 修改完後需要重新載入docker配置檔案並重啟docker 6 systemctl daemon-reload 7 systemctl restart docker
配置完成之後,需要重啟docker服務,重啟後就可以從私有倉庫拉取映象。