Docker學(xué)習(xí)筆記(一)Docker初體驗(yàn)
什么是Docker
Docker是一個(gè)虛擬環(huán)境容器,可以將開發(fā)環(huán)境、代碼、配置文件等一并打包到這個(gè)容器中,并發(fā)布應(yīng)用到任意平臺(tái)中
Docker的安裝
在Doker的官方網(wǎng)站 點(diǎn)擊Download from Docker Store,在docker store中點(diǎn)擊GetDocker即可下載mac的dmg文件
下載完成后,正常安裝運(yùn)行
錯(cuò)誤
打開Docer發(fā)現(xiàn)如下錯(cuò)誤
Docker does not rely on VirtualBox but may not work properly on systems with VirtualBox v4.3.28 is currently installed.
Please upgrade or uninstall VirtualBox
大致的意思就是說 雖然Docker不依賴于VirtualBox,但是在VirtualBox版本太低的電腦上無法運(yùn)行,可以選擇寫在VirtualBox或者更新VirtualBox,嘗試卸載ViertualBox后問題依舊,最后在VirtualBox官網(wǎng)更新了最新版本的VirtualBox之后 問題解決,打開Docker,Docker正常運(yùn)行
安裝完成后,可以使用
docker version
來查看版本信息安裝完成后,再注冊(cè)一個(gè)Docker的賬號(hào)
第一個(gè)docker鏡像
基本命令
docker pull [options] name[:tag]
- 該命令會(huì)從docker的遠(yuǎn)程倉(cāng)庫(kù)拉取docker的鏡像
- name : 表示鏡像的名稱
- tag : 表示鏡像的版本,如果不填寫,默認(rèn)是最新版本的docker
docker images [options][repository[:tag]]
- 該命令會(huì)查看本機(jī)都有哪些鏡像,可以用來驗(yàn)證pull是否成功
- repository : 指定鏡像名稱
- tag : 版本
docker倉(cāng)庫(kù)(Repository)
官方倉(cāng)庫(kù),該倉(cāng)庫(kù)是官方倉(cāng)庫(kù),但是訪問速度比較慢
網(wǎng)易蜂巢鏡像中心,需要登錄后訪問該網(wǎng)址
docker也支持自己搭建鏡像倉(cāng)庫(kù)
HelloWord
下載
輸入命令,該命令會(huì)從官方倉(cāng)庫(kù)去下載鏡像
docker pull hello-world
運(yùn)行
命令:
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
- IMAGE : 鏡像的名字
- options :
-d
在后臺(tái)運(yùn)行
doker ps
可查看當(dāng)前機(jī)器上所啟動(dòng)的鏡像
docker exec # 進(jìn)入容器內(nèi)部
exit #退出
執(zhí)行
docker run hello-world
docker 網(wǎng)絡(luò)
下載nginx
- 下載Nginx鏡像 : hub.c.163.com/library/nginx
- 在后臺(tái)運(yùn)行鏡像
- 使用
docker run -d hub.c.163.com/library/nginx
來在后臺(tái)啟動(dòng)nginx鏡像,會(huì)返回容器的ID
- 進(jìn)入容器內(nèi)部
docker exec -it 容器id bash
-i : 可以保證輸入有效
-t : 容器會(huì)分配給我們一個(gè)終端
容器id 可以只寫前幾個(gè)字母
docker網(wǎng)絡(luò)
Docker網(wǎng)絡(luò)類型
docker中有3中網(wǎng)絡(luò)類型
- Bridge : docker中每一個(gè)容器默認(rèn)都是獨(dú)立的網(wǎng)絡(luò),默認(rèn)選項(xiàng)
- Host : 和主機(jī)使用同一個(gè)網(wǎng)絡(luò)
- None : 沒有網(wǎng)絡(luò)
端口映射
在容器中的端口和主機(jī)中的端口建立一個(gè)映射
使用命令
docker run -d -p 8080:80 hub.c.163.com/library/nginx
來啟動(dòng)容器,-p的參數(shù)表示主機(jī)的8080端口映射到容器的80端口,訪問主機(jī)的8080端口即可放完到nginx了
Docker中關(guān)于鏡像的基本操作
利用鏡像啟動(dòng)一個(gè)容器后進(jìn)行修改 ==> 利用commit提交更新后的副本
下載centos鏡像并啟動(dòng),進(jìn)入容器
docker pull hub.c.163.com/library/centos:latest
docker run -it hub.c.163.com/library/centos
root@307bb1848b9e:/# git --version
bash: git: command not found
發(fā)現(xiàn)沒有安裝git,使用yum命令安裝git,安裝完成后再檢查git命令:
執(zhí)行commit操作將容器轉(zhuǎn)換為一個(gè)鏡像
docker commit -m "centos with git" -a "cfy" 307bb1848b9e cfy/centos:git
其中, -m指定說明信息;-a 指定用戶信息307bb1848b9e為容器的id;使用docker ps -a
命令查詢得到;cfy/centos:git指定目標(biāo)鏡像的用戶名,倉(cāng)庫(kù)名和tag信息
操作完成后使用docker images查看:
此時(shí)我們?cè)谶M(jìn)入該docker,檢查git
~ docker run -it cfy/centos:git bash
[root@f952d74b63af /]# git --version
git version 1.8.3.1
制作自己的鏡像
- Dockerfile : 告訴docker如何制作鏡像,每一個(gè)步驟是什么
- docker build : 根據(jù)Dockerfile來制作鏡像
- JPress : 一個(gè)開源的Java博客平臺(tái)(jpress.io)
創(chuàng)建DockerFile
說明
Dockerfile可以理解為一種配置文件,用來告訴docker build命令應(yīng)該執(zhí)行哪些操作,一個(gè)建議的Dockerfile文件如下所示
# 說明該鏡像以哪個(gè)鏡像為基礎(chǔ)
FROM centos:latest
# 構(gòu)建者的基本信息
MAINTAINER cfy
# 在build這個(gè)鏡像時(shí)執(zhí)行的操作
RUN yum update
RUN yum install -y git
# 拷貝本地文件到鏡像中
COPY ./* /usr/share/gitdir/
創(chuàng)建Tomcat的鏡像
首先下載tomcat的鏡像
docker pull hub.c.163.com/library/tomcat:latest
編寫鏡像的Dockerfile
form hub.c.163.com/library/tomcat
MAINTAINER liuguoguo 734481463@qq.com
# 將本地的war包拷貝到tomcat的目錄中
COPY jpress.war /usr/local/tomcat/webapps
使用build命令來構(gòu)建鏡像
docker build -t jpress:latest .
-t表示來為鏡像起一個(gè)名字和標(biāo)簽,最后的點(diǎn)表示在當(dāng)前目錄尋找Dockerfile文件,這里要注意該命令會(huì)默認(rèn)將Dockerfill所在目錄下的所有文件發(fā)送到Daemon,這就會(huì)導(dǎo)致內(nèi)容非常多,盡量使用空目錄來存放dockerfile和所需要的資源文件
運(yùn)行自己的TomCat
啟動(dòng)容器
docker run -d -p 8888:8080 jpress
在瀏覽器輸入 http://localhost:8888/jpress/ 出現(xiàn)如下信息:
證明我們的tomcat運(yùn)行成功了,可以看到j(luò)press需要一個(gè)mysql數(shù)據(jù)庫(kù),來下載一個(gè)mysql的容器
docker pull hub.c.163.com/library/mysql:latest
在頁(yè)面中可以找到mysql的使用命令,-e為docker的命令,表示要輸入一個(gè)環(huán)境變量,參數(shù)為鍵值對(duì),可以指定數(shù)據(jù)庫(kù)的密碼,接著運(yùn)行mysql
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=A_000000 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest
將mysql映射到3307端口,并設(shè)定MYSQL的密碼為A_000000,數(shù)據(jù)庫(kù)名為jpress,這樣mysql就能成功運(yùn)行了,檢查一下3307端口是否正常監(jiān)聽:
netstat -na|grep 3307
可以看到3307端口已經(jīng)開啟監(jiān)聽了
配置JPress
數(shù)據(jù)庫(kù)名和用戶名密碼填寫mysql的設(shè)置用戶名及密碼,而數(shù)據(jù)庫(kù)的主機(jī)不能填寫localhost,因?yàn)閠omcat在容器內(nèi)部如果填寫localhost則代表是容器自己,需要填寫我們電腦的ip地址,端口號(hào)則填寫我們做映射的端口號(hào),點(diǎn)擊下一步
設(shè)置網(wǎng)站的用戶名和密碼,下一步
jPress告訴我們需要重啟web服務(wù)器
docker restart 4b0e395d1cbc # 輸入id重啟容器,該命令不會(huì)改變?nèi)萜鞯膇d
再看一下網(wǎng)站
發(fā)現(xiàn)我們的網(wǎng)站已經(jīng)起來了
容器連接
在測(cè)試之前可以使用docker stop 容器ID
指令來將之前的容器停止,而容器停止之后,之前設(shè)置的東西就全部會(huì)小時(shí)
使用主機(jī)ip進(jìn)行轉(zhuǎn)發(fā)的這種連接tomcat和mysql方式顯然不好,如果我們的主機(jī)ip地址發(fā)生了變化,那么配置就會(huì)失效,而docker允許容器之間課件并安全的創(chuàng)建連接,首先我們創(chuàng)建數(shù)據(jù)庫(kù)容器
docker run -d --name db -p 3307:3306 -e MYSQL_ROOT_PASSWORD=A_000000 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest
與之前不同的是,我們使用--name指令,為數(shù)據(jù)庫(kù)容器起了一個(gè)名字叫db
可以看到數(shù)據(jù)庫(kù)容器已經(jīng)有了一個(gè)名字叫db,然后運(yùn)行tomcat容器
docker run -d -p 8888:8080 --name jpress --link db:db jpress
同樣的將tomcat容器映射到8888端口,然后為容器起一個(gè)名字叫jpress,并通過--link指令來連接容器,link指令:
--link name:alias
name是我們連接容器的名字,alias是連接的別名,
回到我們jpress的設(shè)置頁(yè)面,其他項(xiàng)都不變,注意數(shù)據(jù)庫(kù)主機(jī)這里填寫我們連接的別名,即可連接到數(shù)據(jù)庫(kù)
總結(jié)
Docker思想
想要把程序部署到另外一臺(tái)計(jì)算機(jī)中,把所有的相關(guān)程序利用docker打包,這里面包含了程序所有的開發(fā)環(huán)境,可以做到開發(fā)環(huán)境與生產(chǎn)環(huán)境的同一,并標(biāo)準(zhǔn)化的運(yùn)輸,其實(shí)Docker與虛擬機(jī)差不多,但是Docker要比虛擬機(jī)小快很多,例如啟動(dòng)一個(gè)虛擬機(jī)可能需要幾分鐘,但是啟動(dòng)一個(gè)docker只需要幾秒
Docker的三個(gè)基本概念
1. 鏡像(Image)
類似于虛擬機(jī)中的鏡像,是一個(gè)包含有文件系統(tǒng)的面向Docker引擎的只讀模板。任何應(yīng)用程序運(yùn)行都需要環(huán)境,而鏡像就是用來提供這種運(yùn)行環(huán)境的。例如一個(gè)Ubuntu鏡像就是一個(gè)包含Ubuntu操作系統(tǒng)環(huán)境的模板,同理在該鏡像上裝上Apache軟件,就可以稱為Apache鏡像
2. 容器(Container)
類似于一個(gè)輕量級(jí)的沙盒,可以將其看作一個(gè)極簡(jiǎn)的Linux系統(tǒng)環(huán)境(包括root權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等),以及運(yùn)行在其中的應(yīng)用程序。Docker引擎利用容器來運(yùn)行、隔離各個(gè)應(yīng)用。容器是鏡像創(chuàng)建的應(yīng)用實(shí)例,可以創(chuàng)建、啟動(dòng)、停止、刪除容器,各個(gè)容器之間是是相互隔離的,互不影響。注意:鏡像本身是只讀的,容器從鏡像啟動(dòng)時(shí),Docker在鏡像的上層創(chuàng)建一個(gè)可寫層,鏡像本身不變。而容器可以理解為一個(gè)操作系統(tǒng)的進(jìn)程
3. 倉(cāng)庫(kù)(Repository)
類似于代碼倉(cāng)庫(kù),這里是鏡像倉(cāng)庫(kù),是Docker用來集中存放鏡像文件的地方。注意與注冊(cè)服務(wù)器(Registry)的區(qū)別:注冊(cè)服務(wù)器是存放倉(cāng)庫(kù)的地方,一般會(huì)有多個(gè)倉(cāng)庫(kù);而倉(cāng)庫(kù)是存放鏡像的地方,一般每個(gè)倉(cāng)庫(kù)存放一類鏡像,每個(gè)鏡像利用tag進(jìn)行區(qū)分,比如Ubuntu倉(cāng)庫(kù)存放有多個(gè)版本(12.04、14.04等)的Ubuntu鏡像。