docker——介紹、安裝、實踐

1. Docker介紹html

  • Docker簡介

   Docker官網:http://www.docker.com。簡單的說Docker是一個可以把開發的應用程序自動部署到容器的開源引擎。使用Docker須要先了解容器、鏡像和倉庫的概念。java

  • Docker之容器

   Docker的容器就是「軟件界的集裝箱」,它能夠安裝任意的軟件和庫文件,作任何的運行環境部署。白癡點說,咱們能夠在Docker的容器中配置centos環境、安裝配置jdk、tomcat等。這功能相似虛擬機,不過Docker容器與主機共享操做系統內核,不一樣的容器之間能夠共享部分系統資源,所以容器更加輕量級,消耗的資源也更少。而虛擬機會獨佔分配給本身的資源,幾乎不存在資源共享,各個虛擬機實例之間近乎徹底隔離,所以虛擬機更加劇量級,消耗更多的資源。git

  • Docker之鏡像

   Docker的鏡像相似虛擬機的鏡像,可是能夠從鏡像倉庫下載,Docker公司提供了不少鏡像下載,咱們也能夠本身建立鏡像(很簡單)並提供給別人下載使用。Docker的鏡像是分層的,最底層的叫作基礎鏡像,而一個鏡像能夠放到另外一個鏡像的頂部(相似繼承的概念),好比咱們在內核、引導文件系統的基礎上建立一個centos系統的鏡像,又在這個centos上面建立了一個配置jdk的鏡像,又在這個jdk的鏡像上面建立了一個配置tomcat的鏡像。這些鏡像是隻讀的,當咱們從一個鏡像啓動容器時,Docker會在該鏡像的最頂層加載一個讀寫文件系統,咱們操做Docker的就是在這讀寫層中執行。程序員

  • Docker之容器和鏡像的關係

   容器和鏡像的關係相似:我先建立一個「人」類(鏡像),而後咱們來實例化這個「人」類叫作「程序員」(容器),咱們在「人」類(鏡像)的基礎上,教這個「程序員」(容器)java,並讓他輸出「hello world」。github

  • Docker之倉庫

   若是你們用過git就會很好理解,通常咱們寫完代碼都會push到git的倉庫中,提供給其餘開發人員使用,或者直接從git上pull下來其餘人寫好的代碼,而Docker的倉庫管理的不只僅是代碼,而是整個開發的環境,包括咱們的系統、環境變量、軟件包和運行時執行的命令等。web

 

2. Docker安裝redis

  安裝環境:centos7docker

  • Docker安裝及基本命令
 1 # Docker:安裝
 2 yum -y install docker
 3 # Docker:啓動服務
 4 systemctl start docker.service
 5 # Docker:查看服務狀態
 6 systemctl status docker.service
 7 # Docker:查看幫助
 8 docker --help
 9 # Docker:查看信息
10 docker info
View Code

 

3. Docker實踐shell

 1 # 運行Docker容器:Docker的命令都是docker開頭,docker run就是運行容器的命令,-i參數標誌保證容器中的STDIN是開啓的,就是持久交互(…)的標準輸入;-t參數告訴Docker爲要建立的容器分配一個僞tty終端,這樣新建立的容器就能提供一個交互式的shell,而不是一個運行在後臺服務的容器;centos是咱們要使用的鏡像名稱,它由Docker公司提供,運行該命令的時候會首先在咱們的宿主機上找centos的鏡像,若是有就直接使用,若是沒有就從Docker Hub Registry上下載該鏡像,相似的還有ubuntu、fedora甚至相似redis(配置好redis)和java(配置好java)的鏡像;/bin/bash,是咱們告訴Docker在容器中要運行/bin/bash命令啓動一個Bash shell。運行這個docker run命令後Docker就會在文件系統內部用這個鏡像建立一個新容器,該容器擁有本身的網絡、IP地址、以及一個用來和宿主機進行通訊的橋接網絡接口。
 2 docker run -it centos /bin/bash
 3 
 4 # 啓動容器以後,會進入以下("02f7b153c36c"是容器ID),至關於運行了一個新的虛擬機,以後咱們就能夠在這裏安裝軟件部署本身的環境,這就是一個"全新系統「,因此只有一些基礎的命令和配置
 5 [root@02f7b153c36c /]#
 6 # 退出已進入的容器,返回到宿主機
 7 exit
 8 
 9 # 在宿主機查看正在運行和中止的容器
10 docker ps -a
11 
12 # 在宿主機查看最後一次運行的容器
13 docker ps -l
14 
15 # 重啓容器,重啓後能夠用docker ps -l看到容器「02f7b153c36c」已經起來了
16 docker start 02f7b153c36c
17 
18 # 從新進入容器
19 docker attach 02f7b153c36c
20 
21 # 建立守護式容器,咱們也能夠建立守護式容器,也就是在後臺長期運行的容器,比較適用於運行應用程序和服務。咱們在docker run命令中的-d參數可使容器在後臺運行,–name參數給該容器指定了一個名字,這樣咱們能夠根據容器的ID或者容器的名字來獲取容器,而且咱們能夠在建立容器的時候執行運行時命令,該命令會一直循環打印hello world,執行該命令後會返回一個容器的長UUID(每次建立一個容器至關於new一個新對象,獲得不一樣的實例)
22 docker run --name hello_world -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
23 
24 # 查看容器的日誌,咱們可使用docker ps查看容器的狀態,也可使用docker logs命令查看容器的日誌,hello_world就是建立容器時指定的名字,咱們能夠加-f參數來監控Docker日誌,加-t參數爲每一條日誌加上時間戳。
25 docker logs hello_world
26 
27 # 在容器內部運行進程,咱們能夠對正在後臺運行的容器執行命令,docker exec命令能夠在容器內部額外啓動新進程,-d參數是後臺運行,也能夠指定-it參數和/bin/bash命令開啓交互式的進程,執行該命令咱們會在容器內的/etc下建立new_file文件。
28 docker exec -d hello_world touch /etc/new_file
29 
30 # 中止容器,或者使用docker kill殺死容器,docker rm刪除容器。
31 docker stop hello_world
32 
33 # 殺死全部容器(目前沒有支持殺死全部容器的命令)
34 docker kill $(docker ps -a -q)
35 
36 # 刪除全部容器(目前沒有支持刪除全部容器的命令)
37 docker rm $(docker ps -a -q)
View Code

 

4. Docker鏡像ubuntu

 1 # 查看鏡像
 2 docker images
 3 # 咱們也能夠在images後面指定查看某個鏡像的內容,好比:docker images centos
 4 
 5 # 拉去鏡像
 6 docker pull ubuntu:14.04
 7 # docker pull就是拉取鏡像了,ubuntu指定拉取哪一個鏡像,後面的「:14.04」是這個鏡像的標籤(這裏能夠理解成ubuntu的版本,固然你能夠隨便給本身建立的鏡像起名字和標籤),若是咱們沒有指定標籤,Docker會默認給咱們的鏡像一個「latest」標籤,執行該命令就是咱們從Docker倉庫拉取了一個具備14.04版本的ubuntu系統到本地。咱們也能夠直接使用docker run命令運行某個鏡像容器,若是該鏡像本地不存在,也會先從Docker的倉庫中拉取下來而後運行該鏡像的容器。
 8 
 9 # 查看docker倉庫中的java鏡像
10 docker search java
11 
12 # 建立鏡像
13 # 咱們可使用docker commit命令來建立鏡像,可是通常推薦使用更靈活的docker build命令和Dockerfile文件來建立鏡像。
14 # Dockerfile,我須要先建立一個存放Dockerfile文件的目錄,而後使用touch建立一個Dockerfiler文件
15 touch Dockerfile
16 vim Dockerfile
17 `
18 #  Version: 0.0.1
19 FROM centos
20 MAINTAINER my name <zjm9109@126.com>
21 ENV UPDATE_TINE 2016-06-29
22 
23 RUN yum -y install java-1.8.0-openjdk.x86_64
24 ENV JAVA_HOME /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/
25 ENV PATH $JAVA_HOME/bin:$PATH
26 ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
27 
28 RUN mkdir /home/webapp
29 
30 RUN yum -y install wget
31 RUN wget -P /home/webapp/ https://raw.githubusercontent.com/zjm9109/docker/master/1/beyond-center-webapp-0.0.1-SNAPSHOT.jar
32 
33 ENTRYPOINT [ "java", "-jar", "/home/webapp/beyond-center-webapp-0.0.1-SNAPSHOT.jar" ]
34 
35 EXPOSE 8080
36 `
37 
38 # Dockerfile文件的全部指令都是在開頭,而且必須爲大寫字母,Dockerfile的指令會按從上到下的順序執行,而且每條指令都會建立一個新的鏡像層(前文說過的鏡像繼承關係),對該鏡像進行提交併緩存起來,這樣咱們能夠在後期繼續使用某一個鏡像,好比咱們在Dockerfile中執行了一個下載java的指令,咱們再想下載java的時候,若是指令沒有變就不須要從新下載,而直接使用該鏡像(相似java中重用對象),也節省了內存不須要建立不少同樣的鏡像保存,也就是咱們構建同一個鏡像,若是沒有指令被修改,就會很快的構建完成,不過若是某一條指令修改了,那麼從該指令以後的全部指令都會從新執行。
39 
40 `
41 Dockerfile指令 
42 「#」用來註釋,在這裏我使用「#」在開頭標註了版本; 
43 「FROM」指令指定一個鏡像的名字,若是本地存在則能夠直接使用該鏡像,若是本地不存在會從Docker倉庫自動下載,後續的全部指令都是基於該鏡像進行,我使用的是centos鏡像; 
44 「MAINTAINER 」指令告訴Docker建立該鏡像人的名字、郵箱或者電話; 
45 「ENV」指令會在該層鏡像中設置環境變量,好比我在第三個指令中設置了「UPDATE_TINE」的環境變量,標註該鏡像的修改時間,在第五個指令中設置了 「JAVA_HOME」的環境變量; 
46 「RUN」指令會在該鏡像運行指定的命令,好比第四個指令「RUN yum -y install java-1.8.0-openjdk.x86_64」會在該層鏡像中下載一個1.8的jdk,在第八個指令中在該層鏡像的「home」目錄下建立了一個「webapp」目錄; 
47 「ENTRYPOINT」指令是在啓動的容器的時候執行的命令,我在個人Dockerfile中使用該指令運行了一個我下載的jar; 
48 「EXPOSE 」指令告訴Docker容器內的應用程序將會使用容器指定的端口,可是咱們不能任意訪問容器運行中的服務端口,出於安全考慮Docker並不會自動打開該端口,咱們須要在docker run命令中另外加參數來指定須要打開的端口,我在個人Dockerfile中打開的是8080,由於個人jar默認運行的就是8080,後面會繼續說明容器的端口問題。 
49 其餘經常使用指令 
50 「CMD」指令相似「ENTRYPOINT」,不過「CMD」指令能夠被docker run中的容器啓動命令覆蓋,而「ENTRYPOINT」只會把docker run中的容器啓動命令做爲參數不會被覆蓋; 
51 「WORKDIR」指令用於在容器內部設置一個工做目錄,「ENTRYPOINT」和「CMD」指定的程序會在這個目錄下執行; 
52 「USER」指令用於指定鏡像會以什麼樣的用戶運行; 
53 「COPY」指令用來將構建環境下的文件和目錄複製到鏡像中,好比:「COPY index.html /opt/webapp/index.html」指令用來把宿主機的index.html文件複製到鏡像中的/opt/webapp/文件夾中,而且也叫index.html,也能夠直接複製整個目錄,因此咱們能夠在宿主機上下載好個人jar,使用「COPY」複製到鏡像中使用; 
54 「ADD」指令和「COPY」指令相似,用來將構建環境下的文件和目錄複製到鏡像中,不過「ADD」指令能夠複製URL,而且複製歸檔文件時自動解壓; 
55 「VOLUME」指令用來向基於鏡像建立的容器添加捲,一個卷能夠存在於一個或多個容器內的特定的目錄。這個目錄能夠繞過聯合文件系統,能夠提供數據共享或者對數據進行持久化的功能,下文會繼續介紹卷
56 `
57 
58 # 構建鏡像
59 docker build -t webapp:v1 .
View Code

 

 

參考文檔:

https://blog.csdn.net/zjm9109/article/details/51785057

相關文章
相關標籤/搜索