1. 程式人生 > 實用技巧 >CSS基礎2--簡單應用

CSS基礎2--簡單應用

Docker簡介

什麼是虛擬化

  在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使使用者可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。

  在實際的生產環境中,虛擬化技術主要用來解決高效能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體對資源充分利用。

  虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機器等等。

什麼是Docker

  Docker 是一個開源專案,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘專案。它基於 Google 公司推出的 Go 語言實現。 專案後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案程式碼在GitHub上進行維護。

  Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支援 Docker;Google 也在其 PaaS 產品中廣泛應用。

  Docker 專案的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。

  在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。

為什麼選擇Docker

  1. 上手快:使用者只需要幾分鐘,就可以把自己的程式“Docker化”。Docker依賴於“寫時複製”(copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,程式碼即改”的境界。隨後,就可以建立容器來執行應用程式了。大多數Docker容器只需要不到1秒中即可啟動。由於去除了管理程式的開銷,Docker容器擁有很高的效能,同時同一臺宿主機中也可以執行更多的容器,使使用者儘可能的充分利用系統資源。

  2. 職責的邏輯分類:使用Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結為肯定是運維的問題)”。
  3. 快速高效的開發生命週期:Docker的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用程式具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裡面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
  4. 鼓勵使用面向服務的架構:Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只執行一個應用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或者服務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式都變得非常簡單,同時也提高了程式的內省性。(當然,可以在一個容器中執行多個應用程式)

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借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟體。

  和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麼,它不管是web伺服器,還是資料庫,或者是應用程式伺服器什麼的。所有的容器都按照相同的方式將內容“裝載”進去。

  Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的伺服器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且儘量通用。

Registry(註冊中心)

  Docker用Registry來儲存使用者構建的映象。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。使用者可以在Docker Hub註冊賬號,分享並儲存自己的映象(說明:在Docker Hub下載映象巨慢,可以自己構建私有的Registry)。

Docker安裝與啟動

安裝Docker

  Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu釋出的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支援更新最新的一些補丁包的。

  由於我伺服器環境都使用的是CentOS,因此這裡我們將Docker安裝到CentOS上。注意:這裡建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支援更新。

  1. yum包更新到最新。
    1 sudo yum update
  2. 安裝需要的軟體包,yum-util提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的。
    1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. 設定yum源為阿里雲。
    1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. 安裝Docker。
    1 sudo yum install docker-ce
  5. 安裝後檢視docker版本。
    1 docker -v

設定ustc的映象

  ustc是老牌的linux映象服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的Docker映象加速器速度很快。ustc docker mirror的優勢之一就是不需要註冊,是真正的公共服務。

  1. 編輯檔案。
    1 vim /etc/docker/daemon.json

  2. 在該檔案中輸入如下內容。
    1 {
    2   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    3 }

Docker的啟動與停止

  systemctl命令是系統服務管理器指令。

  • 啟動Docker。
    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來解決掛載的目錄沒有許可權的問題。

檢視容器IP地址

  我們可以通過以下命令檢視容器執行的各種資料。

1 docker inspect 容器名稱或容器ID

  也可以直接執行下面的命令直接輸出IP地址。

1 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱或容器ID

刪除容器

  刪除指定的容器。

1 docker rm 容器名稱或容器ID

應用部署

MySQL部署

  1. 拉取MySQL映象。
    1 docker pull mysql:5.7
  2. 建立容器。
    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
  3. 遠端登入mysql:連線宿主機的IP ,指定埠為3306。

Tomcat部署

  1. 拉取Tomcat映象。
    1 docker pull tomcat:7-jre7
  2. 建立容器。
    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

Nginx部署

  1. 拉取Nginx映象。
    1 docker pull nginx
  2. 建立容器。
    1 docker run -di --name=mynginx -p 80:80 nginx

Redis部署

  1. 拉取Redis映象。
    1 docker pull redis
  2. 建立容器。
    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

映象備份(將映象儲存為tar檔案)

  格式:

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

映象恢復與遷移(將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

Dockerfile自定義映象

什麼是Dockerfile

  Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立一個新的映象。

  對於開發人員:可以為開發團隊提供一個完全一致的開發環境。

  對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了。

  對於運維人員:在部署時,可以實現應用的無縫移植。

常用命令

命令作用
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. 建立目錄。
    1 mkdir –p /usr/local/docker-jdk
  2. 下載jdk-8u171-linux-x64.tar.gz並上傳到伺服器(虛擬機器)中的/usr/local/dockerjdk8目錄。
  3. 建立Dockerfile檔案。
    1 vim /usr/local/docker-jdk/Dockerfile
  4. 將以下內容寫入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
  5. 構建映象。
    1 # 格式
    2 docker build [OPTIONS] PATH | URL | -
    3 # 例如
    4 docker build -t='jdk1.8' .
    5 # -t後面指定的是映象的名字,當然也可以在後面用冒號附加tag。最後的點表示宿主機中的當前目錄,讓構建程式在當前目錄下找到Dockerfile。
  6. 檢視映象是否建立完成。
    1 docker images

Docker私有倉庫

簡介

Docker官方的Docker hub是一個用於管理公共映象的倉庫,我們可以從上面拉取映象到本地,也可以把我們自己的映象推送上去。但是,有時候我們的伺服器無法訪問網際網路,或者你不希望將自己的映象放到公網當中,那麼我們就需要搭建自己的私有倉庫來儲存和管理自己的映象。

私有倉庫搭建與配置

  1. 拉取私有倉庫映象。
    1 docker pull registry
  2. 啟動私有倉庫容器。
    1 docker run -di --name=registry -p 5000:5000 registry
  3. 開啟瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":[]},表示私有倉庫搭建成功並且內容為空。
  4. 修改daemon.json。
    1 vim /etc/docker/daemon.json
  5. 新增以下內容(此步用於讓Docker信任私有倉庫地址)。
    1 {"insecure-registries":["宿主機IP:5000"]} 
  6. 重啟Docker服務。
    1 systemctl restart docker

映象上傳至私有倉庫

  1. 標記此映象為私有倉庫的映象。
    1 docker tag jdk1.8 宿主機IP:5000/jdk1.8

  2. 再次啟動私服容器。
    1 docker start registry
  3. 上傳標記的映象。
    1 docker push 宿主機IP:5000/jdk1.8
  4. 開啟瀏覽器,輸入地址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服務,重啟後就可以從私有倉庫拉取映象。