初探Docker及使用Docker執行第一個JavaWeb程式
1 什麼是Docker
1-1 Docker歷史
2010 dotCloud PAAS
2013 Docker開源
2014.6 Docker 1.0
2014.7 C輪 $4000萬
2015.4 D輪 $9500萬
1-2 什麼是Docker?
Docker是一個裝應用的容器,就像杯子可以裝水,筆筒可以放筆,書包可以放書一樣,你可以把Hello World放在Docker裡,你可以把網站放在Docker裡,你可以把任何你想得到的程式放在Docker裡。
官方解釋:Docker is the world's leading software containerization platform。
Docker開源,程式碼託管在GitHub。
跨平臺,支援Windows,MacOS,Linux。
2 瞭解Docker
2-1 Docker思想
1.集裝箱
在沒有集裝箱之前,運輸貨物零散,沒有規矩。有了集裝箱後,貨物裝在集裝箱,箱子很大,不容易丟失。保證貨物安全原樣送到目的地。把貨物想象成程式,現在要把執行的程式部署到另外一臺新的機器上去,如果有過相關經驗的人可能會想到少拷了一些配置檔案等會啟動不起來。這些大部分都是認為的疏忽導致的錯誤,有了Docker的集裝箱,就解決了這些問題。它會保證程式不管放在哪,執行時候不會缺少東西。
2.標準化
運輸方式標準化:Docker運輸程式有一個超級碼頭,任何一個地方需要貨物的時候,都由鯨魚把貨物先送到超級碼頭,再由鯨魚從超級碼頭送到目的地。例如想要從桌上型電腦將程式發到筆記本,之前可以使用QQ、U盤等方法。有了Docker之後,就標準化了這個過程:需要做的就是在臺式機上執行一個Docker命令,將鯨魚派過來,把程式送到超級碼頭去。再在筆記本上執行一個Docker命令,讓鯨魚把程式從超級碼頭送到筆記本上。
儲存方式標準化:把程式拷貝到筆記本上時,得指定一個目錄,還得記住這個目錄。而有了Docker後,就不需要關心你的應用儲存在什麼地方,要想執行或者停止它的時候,只需要執行Docker命令即可。
API介面的標準化:Docker提供了一系列REST的介面,包含了對Docker應用的控制,包含啟動,檢視,進入,刪除等。有了介面標準化,只需要執行同樣的命令,就能控制所有的應用。
3.隔離
在使用虛擬機器時,它有自己的記憶體、CPU、硬碟,完全感覺不到外面主機的存在。Docker類似,不過它的技術更加輕量,能夠快速的建立和銷燬,比如建立一個虛擬機器需要幾分鐘,而建立一個Docker只需要一秒。底層的技術實際上是Linux的一種核心限制機制,叫做LXC,LXC是一種輕量級的容器虛擬化技術,最大效率隔離了程序和資源。通過cgroup、namespace限制隔離程序組使用的物理資源,比如CPU、memory等等。其實這個機制早在8、9年前已經加入Linux核心中,直到2013年Docker出世時候才火起來。Docker成功更像是時勢造英雄,如果沒有云計算,沒有敏捷開發,沒有高頻度的彈性伸縮需求,沒有IT行業的這麼多年的長期發展,就沒有Docker。
2-2 Docker解決了什麼問題
--“我本地執行沒問題啊!”
Docker解決了執行環境不一致所帶來的問題。
--“系統好卡,哪個哥們又寫死迴圈了?!”
Docker啟動時候就已經限定好了最大能夠使用的CPU、硬碟等資源,如果超過,只會自己掛掉,絲毫不影響其他的程式。
--“雙11來了,伺服器撐不住啦!”
一到這種節日,運維需要在各臺機器上部署各種各樣的服務,比如要裝Java、Tomcat等等,還要除錯。有了Docker後,這個過程就很輕鬆。
Docker的標準化讓快速擴充套件及彈性伸縮變得非常簡單。
3 走進Docker
3-1 Docker核心技術
Docker裡三大核心:映象、容器、倉庫。
可以理解為:
倉庫→超級碼頭
映象→集裝箱→Java類
容器→執行映象的地方→Java類new出來的物件
用Docker執行一個程式的過程就是:去倉庫把映象拉到本地,然後用一條命令把映象執行起來,變成容器。
Build:構建映象
Ship:運輸映象(從倉庫和主機)
Run:執行映象,成為一個容器
3-2 Docker映象
映象本質上就是一系列檔案,既包括應用程式的檔案,也可以包括應用執行環境的檔案。
利用了聯合檔案系統
最底層是作業系統的引導,第二層是具體的Linux作業系統,上面是相關的軟體。
Docker映象每一層檔案系統都是隻讀的。把每一層載入完成之後,這些檔案都會被看做是同一個目錄,相當於是一個檔案系統。Docker的這種檔案系統就被稱為映象。
3-3 Docker容器
容器的本質就是一個鏡子,可以把容器想象是一個虛擬機器。和虛擬機器的區別是,容器裡面的檔案系統是一層一層的,並且最下面的N層都是隻讀的,只有最上面的一層是可寫的。
3-4 Docker倉庫
先把本地的映象傳到Docker倉庫,再由目的地從Docker倉庫把映象拉過去。
由Docker中央伺服器提供:
hub.docker.com(國外,速度慢)
網易雲倉庫訪問步驟:
1.註冊後,在主介面的產品與服務一欄找到映象倉庫:
2.在映象倉庫中找到映象中心:
3.在映象中心找到映象庫,進去後就可以找到各種已經生成好的映象了:
4 在CentOS安裝Docker
5 Docker初體驗
5-1 第一個Docker映象
sudo service docker start
啟動docker服務
docker pull [OPTIONS] NAME [:TAG]
從遠端庫拉取映象
NAME:映象名稱
TAG:版本
OPTIONS:拉取引數
docker images [OPTIONS] [REPOSITORY[:TAG]]
檢視本機都有哪些映象,也可以用來驗證pull是否成功
REPOSITORY:指定映象名稱
TAG:版本
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
執行映象
COMMAND:執行時,執行哪些命令
ARG...:執行時,執行哪些引數
docker ps
檢視正在這臺機器上執行的容器
docker stop 容器id名(簡寫也行)
停止容器
5-2 第一個Docker容器
出現如下語句,說明映象執行成功
docker pull&docker run流程:
Client:本機Docker Client
Docker_host:也是本機Docker daemon來管理
Registry:Docker遠端倉庫
docker pull:客戶端client向docker daemon傳送一條命令讓其拉取某一個映象,deamon先去本機去檢查是否存在映象是否存在及版本是否一致,如果存在,deamon不會執行任何操作;如果不存在,deamon會從遠端倉庫去找該映象,如果找到,就從遠端倉庫將其拉到本地。
docker run:同樣,客戶端client向docker daemon傳送一條命令,deamon會先檢查映象在本地是否已經存在,如果不存在,此時執行docker pull操作,從遠端將映象拉取到本地,然後將映象通過一定的方式執行起來,變成docker容器。
6 Docker執行Nginx靜態網站
6-1 執行Nginx映象
實踐前奏
持久執行的容器
前臺掛起&後臺執行
進入容器內部
使用pull命令把Nginx映象拉取下來:
docker pull hub.c.163.com/library/nginx
檢視映象:
docker images
執行Nginx映象(前臺啟動):
docker run hub.c.163.com/library/nginx
執行Nginx映象(後臺啟動):
docker run -d hub.c.163.com/library/nginx
進入容器:
docker exec -it 容器id bash
6-2 Docker網路
網路型別:
Bridge:使用的網路有獨立的namespace
Host:如果啟動容器時指定使用host模式,那麼該容器將不會獲得一個獨立的network namespace,而是和主機共同使用一個。這時容器將不會虛擬出自己的網絡卡、配置自己的IP等等,而是會使用宿主機的IP和埠
None:docker不會和外界進行任何通訊
埠對映:
使用Bridge模式時,涉及到一個問題:既然使用的網路有獨立的namespace,這就需要一種技術,使容器內的埠可以在主機上訪問到,這種技術就是埠對映。訪問主機上的埠,就是訪問Docker容器內的埠
-p:開放一個容器埠給主機
啟動一個映象,並將容器的80埠對映到主機的8080埠:
docker run -d -p 8080:80 映象名
-P:開放所有的埠給一個隨機埠
docker run -d -P 映象名:
可以看到,Docker容器的80埠對映到了主機的32768埠
7 第一個Java Web應用
7-1 製作自己的映象
Dockerfile:用來告訴Docker我要如何製作我的映象,每一步操作分別是什麼
docker build命令:來執行Dockerfile裡所描述的每一件事情,最終會把Docker映象構建出來
2.將下載好的war包放到/app目錄
3.將tomcat下載到本地
docker pull hub.c.163.com/library/tomcat:latest
4.編輯Dockerfile檔案,讓應用隨tomcat啟動就載入:
vi Dockerfile
新增如下程式碼:
from hub.c.163.com/library/tomcat
MAINTAINER jiangfan [email protected]
COPY jpress.war /usr/local/tomcat/webapps/
每一步做的事:
第一步:執行from hub.c.163.com/library/tomcat命令,作為基礎映象
第二步:把所有者資訊寫進去
第三步:把jpress.war拷貝到tomcat的webapps路徑下
最後build成功
(如果報錯not a directory,檢查下在webapps後面的/是否存在)
使用命令來生成映象:
docker build -t jpress:latest .
-t:指定REPOSITORY及TAG
.:當前目錄
7-2 執行自己的容器
使用指令
docker run -d -p 8888:8080 jpress
執行jpress映象,並將tomcat的8080埠對映到8888,通過瀏覽器訪問tomcat主頁:
訪問jpress專案:
在Docker中安裝mysql資料庫:
docker pull hub.c.163.com/library/mysql:latest
啟動mysql映象:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress -p 3306:3306 -d hub.c.163.com/library/mysql:latest
其中指定mysql的密碼為123456,資料庫的名字為jpress
可能出現的錯誤:
1.修改mysql編碼,否則jpress報錯:
2. host IP地址錯誤,用docker exec -it 容器ID bash 進入到容器,之後用cat /etc/hosts 即可看到系統mysql的host IP,用這個IP才能連線。172.17.0.26
相關推薦
初探Docker及使用Docker執行第一個JavaWeb程式
1 什麼是Docker 1-1 Docker歷史 2010 dotCloud PAAS 2013 Docker開源 2014.6 Docker 1.0 2014.7 C輪 $4000萬 2015.4 D輪 $9500萬 1-2 什麼是Docker? Doc
Docker安裝以及執行第一個HelloWorld
在安裝Docker之前我們先來了解一下什麼是Docker?觀察Docker圖示,其實很形象的解釋了什麼是Docker。在沒有使用集裝箱的情況下,我們需要考慮不同形狀、尺寸的貨物怎麼安放,貨物與貨物之間是否能堆疊,這無疑是很繁瑣的事情。現在有了集裝箱(容器),我們就能將不同的貨
OpenCV學習筆記 - 安裝及執行第一個OpenCV程式
1、下載及安裝 OpenCV是一套開源免費的圖形庫,主要有C/C++語言編寫,官網: http://opencv.org/ 。在 http://opencv.org/downloads.html 可以找到個版本和各種平臺的程式包。OpenCV的Windows平臺安
java基礎(1)-----編寫並執行第一個java程式
下面是一個簡單的java程式,將在控制檯輸出hello world public class HelloWorld { public static void main(String[] args) { System.out.println("Hello Wor
執行第一個Spark程式
我們這裡使用官方的Spark自帶的一個程式來體驗一下Spark的執行 Spark自帶的例子是利用蒙特·卡羅演算法求PI 在Spark目錄下執行下面命令 bin/spark-submit \ >--master spark://cdh0:7077 \ >--class org.
1-系統方案A(系統方案演示和執行第一個Android程式,ListView顯示資料,刪除資料)
系統教程初步要做到的就是12節和13節所演示的 12節: https://www.cnblogs.com/yangfengwu/p/9966702.html 13節: https://www.cnblogs.com/yangfengwu/p/9966901.html
spark本地環境的搭建到執行第一個spark程式
搭建spark本地環境 搭建Java環境 (1)到官網下載JDK 官網連結:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (2)解壓縮到指定的目錄 >sudo t
Spark 執行第一個Scala程式WordCount
安裝 首先去官網下載Spark。注意Spark和Hadoop之間版本對應關係,我自己裝的Hadoop 2.7.5版本,按照下面方式下載即可。 下載完成後,解壓安裝包至路徑/usr/local tar -zxf ./spark-2.3.0-bin-had
編寫並執行第一個Lisp程式
我覺得接觸一門新的程式語言的時候第一個程式的編寫至關重要,這能夠讓我快速瞭解到簡單的語法以及執行方法。而執行方法基本上是我更為關注的,因為這將是後期學習過程中不斷打交道的東西。 為了能夠彌補工作中那種浪費時間的懊悔感,我決定學習一個新的程式語言,
在VMware虛擬機器下安裝Android Studio(AS)以及執行第一個HelloWorld程式
1、JDK 1.1下載 百度一下“JDK”即可 1.2安裝 選擇安裝目錄 C:\java JAVA_HOME→C:\java PATH→C:\java\bin 2、android studio (AS) 2.2安裝 遇到的問題: 1.新建
Opencv學習1: 在Linux下編譯執行第一個opencv程式
前一段在安裝Caffe時候把Opencv2.4.11版本安裝在redhat6.4系統上,為了測試在Linux下如何編譯執行opencv程式碼,特意查詢了網上相關資料(主要參考三個網頁)。本文主要給出三種編譯執行的方式:命令列的方式;Makefile(兩種)方式;
建立並執行第一個OSGi程式-HelloWorld
還記得我們在學習Java語言、C語言、或C++語言等各個計算機語言時都寫過的 HelloWorld 嗎?那些 HelloWorld 程式都是在執行後輸出一個“Hello World”,然後就結束了程式,我們今天來看看OSGi中的HelloWorld 程式,該程式
NDK實戰教程(一) 在Android Studio執行第一個NDK程式
1、新建一個Android工程,這一步就不多說了; 2、在AndroidStudio中配置NDK路徑,方法是: (1)先下載NDK並安裝(這句基本是廢話); (2)點選單欄的File->ProjectStructure…->在開啟的視窗中左側選中SDKLocat
Docker入門學習(4)----Dockerfile製作第一個映象和容器中的第一個javaweb應用
我們可以通過編寫Dockerfile來製作自己的映象,下面先動手來操作一下,製作一個映象,然後基於該映象執行一個容器,在容器裡執行我們自己的javaweb應用。 <1>拉取tomcat映象 docker pull tomcat 檢視映象: roo
Docker執行第一個Java應用
上篇部落格我們介紹瞭如何安裝Docker以及執行HelloWorld,這篇我們介紹一下如何執行第一個Java應用。在這裡我們用網上的JPress來做測試。首先我們去終端拉取tomcat映象將JPress.war放到指定目錄建立並編輯Dockerfile檔案通過docker b
IDEA2017.3.3創建第一個javaweb項目及tomcat部署實戰
new serve 缺少 file tput font tomcat dex 簡單 一、創建簡單web項目 file --- New --- Project 1. 選擇jdk(這裏有點小問題不是很理解,通過java -verbose查找出來的jdk路徑在C盤,這裏並不
docker:搭建年輕人第一個LNMP網站平臺
docker docker lnmp docker nginx docker php 1.背景 ?LNMP為(linux系統、nginx服務、mysql服務、php服務)組合而成,本次練習所使用的鏡像均為docker官方鏡像源 https://hub.docker.com ,鏡像介紹如下:
Java開發環境的安裝配置及在Eclipse上第一個Java程式的執行
首先,我們需要下載IDE開發環境,下面的網址 https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2018-09/Ra/eclipse-inst-win64.exe 下載完成後,執行我們會看到下面的畫面 如果預設
Microsoft Visual Studio 2017:第一個C++程式的建立及執行
VS2017用的比較少,以防忘記怎麼用,就寫寫步驟 1 新建 1.1 選單欄:檔案 –> 新建 –>專案,如圖: 1.2 如圖,選擇Visual C++,接著選擇空專案,然後修改專案名稱和專案路徑,在選確定 1.3 在右側面板中可
計算機理論基礎+常用DOS命令+JAVA語言發展與特性+JDK安裝與解除安裝+第一個java程式的編寫與執行+環境變數配置的意義及步驟
————作為一個沒有天賦的人,當初入門時可謂經歷許多磨難,釋出此文只為想入門學習java開發的人能更輕鬆的起步一 。計算機理論基礎:計算機,計算機硬體,計算機軟體,軟體開發,計算機語言,人機互動方式 常用快捷鍵,常用DOS命令