Docker是一種容器技術,它的存在就是為了解決容器技術本身的復雜性。Docker容器擁有很高的性能,同時同一臺宿主機中可以運行更多的容器,是用戶盡可能的充分利用系統(tǒng)資源。
概念
1.什么是虛擬化?
在計算機中,虛擬化(Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器、網(wǎng)絡、內存及儲存等,予以抽象、轉換后呈現(xiàn)出來,打破實體結構間的不可切割的障礙,是用戶可以比原來的組態(tài)更好的方式來應用這些資源。這些資源的新虛擬部分是不受現(xiàn)有資源的架設方式、地域或物理組態(tài)所限制。
全虛擬化架構
虛擬機的監(jiān)視器(hypervisor)是類似于用戶的應用程序運行在主機的OS之上,如VMware的workstation,這種虛擬化產(chǎn)品提供了虛擬的硬件。
2.容器技術
容器和管理程序虛擬化(hypervisor virtualization, HV)不同,管理程序虛擬化通過中間層將一臺或多臺獨立的機器虛擬運行在物理硬件之上,而容器是直接運行在操作系統(tǒng)內核之上的用戶空間。因此,容器虛擬化也被稱為“操作系統(tǒng)級虛擬化”,容器技術可以讓多個獨立的用戶空間運行在同一臺宿主機上。
限制
由于“客居”與操作系統(tǒng),容器只能運行與底層主機相同或相似的操作系統(tǒng),比如在Ubuntu服務中運行CentOS,但無法運行Windows。
相對于徹底隔離的管理程序虛擬化,容器被認為是不安全的。
最新的容器技術引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用這些新技術,容器不再僅僅是一個單純的運行環(huán)境。在自己的權限類內,容器更像一個完整宿主機。和傳統(tǒng)虛擬化及半虛擬化想比,容器不需要模擬層(emulation layer)和管理層(hypervisor layer),而使用操作系統(tǒng)的系統(tǒng)調用接口。
Docker特點
上手快
用戶可以很容易的把自己的程序Docker化。Docker依賴于“寫時復制”(copy-on-write)模型,開箱即用。
快速高效的開發(fā)聲明周期
Docker組件
Docker客戶端和服務器
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只需要向Docker服務器或守護進程發(fā)出請求,服務器或守護進程將完成所有工作并返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。
1.png
Docker 鏡像
鏡像是構建Docker的基石。用戶及基于鏡像來運行自己的容器。鏡像也是Docker聲明周期中的“構建”部分。獎項是基于聯(lián)合文件系統(tǒng)的一種層式結構,由一系列指令一步一步構建出來。
Registry 注冊中心
Docker用Registry來保存用戶構建的鏡像。Registry分為共有和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。
Docker容器
Docker可以幫助你構建和部署容器,你只需要把你的程序打包放進容器即可。容器是基于鏡像啟動的,容器找那個可以運行一個或多個進程。我們可以認為,鏡像是Docker生命周期中構建和打包階段,而容器則是啟動或執(zhí)行階段。容器基于鏡像啟動。
2.png
Docker的安裝與啟動
本例中使用了CentOS7作為服務器,有關VMware安裝CentOS7的教程請看我的這篇文章:FastDFS系統(tǒng)搭建。
通過以下命令在線在CentOS7中安裝Docker:
yum install docker
3.png
查看Docker版本
[root@localhost ~]# docker -vDocker version1.13.1, build8633870/1.13.1
啟動與停止Docker
systemctl命令是系統(tǒng)服務管理器指令,它是service和chkconfig兩個命令組合。
啟動Docker
systemctl start docker
停止Docker
systemctl stop docker
重啟Docker
systemctl restart docker
查看Docker狀態(tài)
systemctl status docker
開機啟動Docker
systemctlenabledocker
查看Docker概要信息
docker info
查看Docker幫助文檔
docker -help
Docker鏡像操作
Docker鏡像由文件系統(tǒng)堆疊而成(是一種文件的儲存形式)。最低端是一個文件引導系統(tǒng),即bootfs。實際上,當一個容器啟動后,它將會被移動到內存中,而引導文件系統(tǒng)則會被卸載,以留出更多的內存供磁盤鏡像使用。Docker容器啟動是需要一些文件的,而這些文件就可以被稱為Docker鏡像。
4.png
列出鏡像
[root@localhost ~]# docker images
5.png
REPOSITORY: 鏡像所在的倉庫名稱
TAG: 鏡像標簽
IMAGE ID:鏡像ID
CREATED:鏡像的創(chuàng)建日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都儲存在Docker宿主機的/var/lib/docker目錄下。
搜索鏡像
[root@localhost ~]# docker search 鏡像名稱
6.png
從Docker Hub拉取鏡像
去Docker Hub官網(wǎng)查找所需的Docker鏡像:https://hub.docker.com/explore/,然后通過以下命令在線pull:
[root@localhost ~]# docker pull 鏡像名稱[root@localhost ~]# docker pull 鏡像名稱:版本
因為官方提供的Docker鏡像加速服務很慢,我們可以配置ustc的鏡像。輸入以下命令配置ustc鏡像:
[root@localhost ~]# vi /etc/docker/daemon.json
沒有就創(chuàng)建,向其中寫入:
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
重啟Docker服務:
[root@localhost ~]# systemctl restart docker
刪除鏡像
刪除指定鏡像
[root@localhost ~]# docker rmi $IMAGE_ID? #這個$IMAGE_ID數(shù)值可以根據(jù)`docker images`命令查看
刪除所有鏡像
[root@localhost ~]# docker rmi `docker images -q`
Docker容器操作
查看正在運行的容器
[root@localhost ~]# docker ps
查看所有的容器(啟動過的歷史容器)
[root@localhost ~]# docker ps -a
查看最后一次運行的容器
[root@localhost ~]# docker ps -|
查看停止的容器
[root@localhost ~]# docker ps -f status=exited
刪除容器
刪除指定容器:
[root@localhost ~]# docker rm $CONTAINER_ID/NAME
刪除所有容器:
[root@localhost ~]# docker rm `docker ps -a -q`
創(chuàng)建和啟動容器
創(chuàng)建容器常用的參數(shù)說明
創(chuàng)建容器命令:docker run
-i: 表示運行容器
-t: 表示容器啟動后會進入其命令行,加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端。
—name: 為創(chuàng)建的容器命名
-v: 表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上修改,然后共享到容器上。
-d: 在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i-t兩個參數(shù),創(chuàng)建后就會自動進去容器)。
-p: 表示端口映射,前者是宿主機端口,后者是容器內的映射端口。可以使用多個-p做多個端口映射。
交互式容器
創(chuàng)建一個交互式容器并取名為mycentos5:
[root@localhost ~]# docker run -it --name=mycentos5 centos:7 /bin/bash[root@53f33e279914 /]#
此時我們可以新建一個連接,通過docker ps命令看到剛才創(chuàng)建的容器正在啟動中:
7.png
通過exit命令可以退出當前容器:
[root@53f33e279914 /]# exitexit[root@localhost ~]#
此時再通過docker ps命令查看剛才啟動的容器也停止了。
守護式容器
輸入以下命令創(chuàng)建一個名字為mycentos6的容器:
[root@localhost ~]# docker run -di --name=mycentos6 centos:7
創(chuàng)建后這個容器會在后臺運行,而不是直接進入到這個容器中。可以通過docker ps命令查看。
登錄守護式容器:
[root@localhost ~]# docker exec -it mycentos6 /bin/bash
可以通過exit命令退出,但是容器不會停止。
停止和啟動容器
停止正在運行的容器
[root@localhost ~]# docker stop 容器名稱
啟動已運行過的容器:
[root@localhost ~]# docker start 容器名稱
其他操作
文件拷貝
將文件拷貝到容器內可以用如下命令:
[root@localhost ~]# docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
將文件從容器中拷貝出來
[root@localhost ~]# docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
目錄掛載
在創(chuàng)建容器的時候,將宿主機的目錄和容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而影響容器。格式為:
[root@localhost ~]# docker run -di -v 宿主機目錄:容器目錄
查看容器
[root@localhost ~]# docker inspect mycentos5
部署應用
Mysql部署
拉取MySQL鏡像
[root@localhost ~]# docker pull mysql:5.7
創(chuàng)建MySQL容器
[root@localhost ~]# docker run -di --name docker_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
如上我們創(chuàng)建一個名稱為docker_mysql的MySQL5.7版本的守護式容器,且配置MySQL登錄密碼是root。
-p代表端口映射,格式為宿主機映射端口:容器運行端口
-e代表添加環(huán)境變量,MYSQL_ROOT_PASSWORD是root用戶的登錄密碼
進入MySQL容器,登錄MySQL
[root@localhost ~]# docker exec -it docker_mysql /bin/bash
登錄MySQL
mysql -u root -p
遠程連接MySQL
8.png
Tomcat部署
拉取Tomcat-8 && JDK-8 鏡像
[root@localhost ~]# docker pull tomcat:8-jre8
部署Web應用
為了更好的演示Docker部署Tomcat的使用方式,我們可以先將需要部署的web項目發(fā)送到服務器的某個路徑下,我這里在/root/目錄下創(chuàng)建了/root/site/目錄作為項目的根目錄,在其中創(chuàng)建index.html文件并寫入:
Hello
Hello Docker-Tomcat!
創(chuàng)建Tomcat容器
[root@localhost ~]# docker run -di --name=docker_tomcat -p 9000:8080 -v /root/site/:/usr/local/tomcat/webapps/ROOT --privileged=true tomcat:8-jre8
以上就創(chuàng)建一個Tomcat容器,其容器名稱Wiedocker_tomcat,-di表示是一個守護式容器;-p 9000:8080表示此容器端口映射為9000->8080,即對外的端口是9000,映射到容器里Tomcat服務器的端口8080,--privileged是以root權限運行。
9.png
通過命令看到,當我們啟動了容器,其中的Tomcat服務器也自動啟動了。當然對于部署Nginx或MySQL的Docker容器,當啟動容器時都會啟動對應的服務。
注意
上面我們指定了宿主機的/root/site/目錄映射到docker_tomcat容器的/usr/local/tomcat/webapps/ROOT目錄,為什么是這個目錄呢?
Docker虛擬化,它會在內部虛擬一個操作系統(tǒng),是在其宿主機內核上的一層空間,所有有一定的目錄結構,我們可以通過docker exec -it docker_tomcat /bin/bash命令進入到docker_tomcat容器內部,通過ls命令查看目錄會發(fā)現(xiàn)其Tomcat服務器確實安裝在docker_tomcat容器的/usr/local/tomcat目錄下。
最后,我們在瀏覽器上訪問:http://192.168.148.132:9000/,即發(fā)現(xiàn)頁面展示了我們剛才在/root/site/目錄下創(chuàng)建的index.html網(wǎng)頁:
10.png
所以,如果你想要修改容器中Tomcat的端口號,直接進入容器的/usr/local/tomcat/conf/server.xml自改即可。
Nginx部署
拉取Nginx鏡像
docker pull nginx
創(chuàng)建Nginx容器
docker run -di --name=docker_nginx -p 80:80 nginx
測試
11.png
在瀏覽器上訪問:http://192.168.148.132/可以進入到Nginx的歡迎頁。
其他
以上我們介紹了MySQL、Tomcat、Nginx容器的創(chuàng)建,對于其他的服務,如Redis等操作基本相同,不再闡述。
備份與遷移
容器保存為鏡像
可以通過以下命令將我們已創(chuàng)建(配置好的)容器打包為鏡像,這樣我們以后就能用該鏡像再次創(chuàng)建新的容器了:
docker commit docker_tomcat my_tomcat
docker_tomcat是容器名稱;my_tomcat是新的鏡像名稱。
鏡像備份
通過以下命令可以將鏡像打包為tar文件:
dockersave-omy_tomcat.tarmy_tomcat
-o輸出到的文件
鏡像恢復與
當我們刪除了docker_tomcat鏡像后,可以通過以下命令將剛才打包備份的.tar鏡像文件恢復成一個Docker鏡像:
dockerload-imy_tomcat.tar
-i輸入的文件。
作者:TyCoding
鏈接:http://www.lxweimin.com/p/20c9e3d52854
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處。