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