www.docker.comjava
Docker 是什麼?linux
Docker 是一個開源的應用容器引擎,基於Go語言並聽從Apache協議的開源,讓開發者能夠打包他們的應用以及依賴包到一個可移植的鏡像中,而後發佈到任何流行的 Linux或Windows 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。git
若是沒有Dockerweb
環境和配置變更,致使項目等不能簡單的部署成功,咱們將須要的配置、系統、數據等等總體打包成咱們須要的鏡像,簡單啓動就能夠了,docker
Securely build and share any application, anywhere一次構建,到處運行。json
虛擬機:整套安裝環境的一種解決方案,它能夠在一種操做系統裏面運行另外一個操做系統,好比在Windows系統裏面運行Linux系統。應用程序對此沒有感知,由於虛擬機看上去就和真實的操做系統如出一轍,可以使應用程序,操做系統和硬件三者之間的邏輯不變,而對於底層系統來講,虛擬機就是一個普通文件,不須要了就刪掉。ubuntu
虛擬機佔用的資源多、步驟多,啓動是分鐘級的太慢。vim
容器化技術:由於如上的問題,Linux發展出了另外一種虛擬化技術,Linux容器(Linux Containers縮寫LXC)。Linux容器不是模擬一個完整的操做系統,而是對程序進行隔離。有了容器,就能夠將軟件運行所須要的全部資源打包到一個隔離的容器中,容器和虛擬機不一樣,不須要捆綁一整套的操做系統,只須要軟件工做所須要的庫資源和設置。系統所以而變得高效輕量並保證部署在任何環境中的軟件都能始終如一的運行。centos
Docker | 面向對象 |
---|---|
鏡像 | 類 |
容器 | 對象 |
概念 | 說明 |
---|---|
Docker 鏡像(Images) | Docker 鏡像是用於建立 Docker 容器的模板,好比 Ubuntu 系統。 |
Docker 容器(Container) | 容器是獨立運行的一個或一組應用,是鏡像運行時的實體。 |
Docker 客戶端(Client) | Docker 客戶端經過命令行或者其餘工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護進程通訊。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。 |
Docker Registry | Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。一個 Docker Registry 中能夠包含多個倉庫(Repository);每一個倉庫能夠包含多個標籤(Tag);每一個標籤對應一個鏡像。一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,經過一個簡單的命令行便可在相應的平臺上安裝Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。 |
yum -y remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-logrotate \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ yum-utils \ device-mapper-persistent-data \ lvm2
#更新yum yum -y update yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
#指定版本安裝 yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io #最新版本安裝 yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
#版本 docker version
設置密碼儘可能簡單如:docker123tomcat
#1 mkdir -p /etc/docker #2 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["http://hub-mirror.c.163.com"] } EOF #3 systemctl daemon-reload #4 systemctl restart docker
docker run hello-world
docker help
docker images
-a:顯示全部的鏡像
-q:僅顯示id
REPOSITORY | 鏡像倉庫源 |
---|---|
TAG | 鏡像標籤 |
IMAGE ID | 鏡像ID |
CREATED | 鏡像建立時間 |
SIZE | 鏡像大小 |
同一個REPOSITORY(倉庫源)能夠有多個TAG,表明這個倉庫源的不一樣版本,使用REPOSITORY:TAG來定義不一樣的鏡像。
若是不指定一個鏡像的版本標籤,例如:使用hello-world,docker將默認使用hello-world:latest鏡像
docker search 須要的鏡像
docker pull 須要的鏡像:須要的版本tag
#刪除單個 docker rmi -f 鏡像ID #刪除多個 docker rmi -f 鏡像名1:TAG 鏡像名2:TAG #刪除所有 docker rmi -f ${docker images -qa}
docker ps
-a:顯示全部的容器
-l:顯示最近一條容器
-n:顯示最近幾條容器
-q:僅顯示id
#新建容器並啓動,若是沒有鏡像,會先去hubdocker上pull鏡像 docker run 可選參數 鏡像名(或ID) #重啓容器 docker restart 容器名(或ID) #中止容器(普通<==>強制) docker stop 容器名(或ID) <==> docker kill 容器名(或ID) #啓動以前建立的容器 docker start 容器名(或ID) #刪除以前建立的容器<==>批量 docker rm -f 容器ID <==> docker ps -aq | xargs docker rm
-d:守護式後臺運行容器,並返回容器ID(如使用tomcat)
-v:數據卷,指定主機的某個目錄爲容器的某個目錄(如使用tomcat-> /root/tomcat/:/usr/local/tomcat/webapps/)
-i:交互式運行容器,一般-t一塊兒使用(如使用linux中的linux)
-t:爲容器從新分配一個僞輸入終端,一般與-i一塊兒使用(如使用linux中的linux)
--name="新容器名字":爲容器指定一個名稱
-P:隨機端口映射
-p:指定端口映射,有如下4種格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
#新建啓動容器 docker run --name="tomcat1" -dp 8888:8080 tomcat:8.0.52
#1 新建啓動容器,以下圖中目錄變動爲容器ID docker run --name='centos1' -it centos
#2 退出容器 exit -->容器中止退出 ctrl+p+q -->容器不中止退出(注意有前後順序)
#3 進入一個運行的容器 docker exec -it 容器名(或ID) /bin/bash
docker commit -a='做者' -m='修改內容' 容器名(或ID) 容器前綴/容器名:TAG號
#進入容器目錄 docker exec -it tomcat1 /bin/bash #替換index.jsp內容 cat > webapps/ROOT/index.jsp << EOF Hello Tomcat EOF
#提交容器 docker commit -a='Heaton' -m='my tomcat test' tomcat1 heaton/tomcat:0.0.1
#刪除現有的運行容器 docker rm -f $(docker ps -q) #運行以前本身構建的鏡像容器 docker run --name="tomcat1" -dp 8888:8080 heaton/tomcat:0.0.1
#登陸阿里雲docker倉庫,輸入密碼 dockerlogin --username=70xx@qq.com registry.cn-hangzhou.aliyuncs.com
#標記tag docker tag b60d74c216b8 registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1 #上傳 docker push registry.cn-hangzhou.aliyuncs.com/docker-tzy/rep1:0.0.1
Docker容器產生的數據,若是不經過commit生成新的鏡像,持久化,那麼容器刪除之後,數據就沒有了。
爲了能保存數據在docker中咱們使用數據卷。
docker inspect 容器ID --> 返回Docker對象的信息(查看掛載狀況)
#建立可讀可寫 docker run -it -v /my_root:/my_docker centos #建立可讀不可寫(Read-only) #docker run -it -v /my_root:/my_docker:ro centos
#進入綁定文件夾,主機創建新文件 touch root.txt
#進入綁定文件夾,容器修改文件 echo "docker add" > root.txt
#中止容器,主機修改文件 echo "root add" > root.txt #在從新啓動容器 docker start -i 34fe34e36ada
#建立Dockerfile文件 vim dockerFile,寫入以下內容 #效果爲docker run -it -v /my_root:/my_docker centos FROM centos VOLUME ["my_docker1","my_docker2"] CMD echo "success" CMD /bin/bash
#構建鏡像 docker build -f /Dockerfile -t mybuild/centos:0.0.1 .
#運行,發現有2個容器卷 docker run -it mybuild/centos:0.0.1
如例1進行數據卷測試,發現數據共享
容器間數據共享
#運行容器1 docker run -it --name docker1 mybuild/centos:0.0.1 #運行容器2 docker run -it --name docker2 --volumes-from docker1 mybuild/centos:0.0.1 #運行容器3 docker run -it --name docker3 --volumes-from docker2 mybuild/centos:0.0.1
如例1進行數據卷測試
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
Java | HelloWord.java | HelloWord.class |
---|---|---|
Docker | images | DockerFile |
基礎注意點
#
爲註釋執行流程
保留字
FROM | 基礎鏡像,當前鏡像是基於那個鏡像的。 |
---|---|
MAINTAINER | 做者 郵箱。 |
RUN | 容器構建時須要運行的命令。 |
EXPOSE | 暴露端口號 啓動容器的時候還需使用 –p 指定端口。 |
WORKDIR | 指定在建立容器後,終端默認登陸後進來的工做目錄,一個落腳點,默認根目錄,一般絕對路徑,CMD ENTRYPOINT 都會在這個目錄下執行。 |
ENV | 構建鏡像的過程當中設置環境變量, 構建和運行時都有效可使用$引用。 |
ADD | 將宿主機目錄下的文件拷貝到鏡像且會自動處理URL和 解壓tar 壓縮包。ADD 支持 URL 和 COPY後解壓縮包。 |
COPY | 拷貝文件和目錄到鏡像中,將從構建上下文目錄中<源路徑>的文件/複製到新的一層鏡像內<目標路徑>的位置。通常都用ADD |
VOLUME | 容器數據卷, 數據保存和持久化。 |
USER | 指定該鏡像由什麼用戶運行 不指定由root 運行。 |
CMD | 指定容器啓動時要運行默認的命令,Dockerfile中能夠有多個cmd , 但只有最後一個生效。CMD 會被docker run 以後的參數替換。 |
ENTERPOINT | 指定容器啓動時要運行的命令。ENTERPOINT docker run 以後的參數會被當作參數傳遞給ENTRYPOINT , 以後造成新的命令組合,追加 |
ONBUILD | 觸發器, 當構建一個被繼承的dockerfile時運行命令, 父鏡像在被子繼承後的父鏡像的onbuild 被觸發。 |
- CMD
如 tomcat中,在Dockerfile最後有CMD ["catalina.sh","run"],意思爲啓動容器後執行tomcat啓動命令,若是使用命令
docker run -it -p 8888:8080 tomcat:8.0.52 ls -l
,就會將ls -l這個查詢指令經過參數傳給CMD,這時容器運行就不會啓動,而是查詢目錄。
- ENTERPOINT
若是是CMD ["ls","-l"]指令,咱們須要在加入一個 -a 的參數,那麼CMD將不能完成在構建鏡像後增長參數,這個時候能夠把指令改爲ENTERPOINT ["ls","-l"] ,咱們就能夠在後面繼續追加參數而不會替換原來的參數。
- 自建centos
- 修改運行後路徑
- 使之可使用vim,ifconfig等命令
#繼承自centos FROM centos #做者-郵箱 MAINTAINER Heaton #建立環境變量mypath ENV mypath /usr/local/src #指定建立容器後終端路徑 WORKDIR $mypath #構建容器時運行命令 RUN yum -y install vim RUN yum -y install net-tools #暴露端口號 EXPOSE 80 #容器啓動時要運行默認的命令 CMD echo "success" CMD /bin/bash
docker build -f /root/Dockerfile -t heaton/centos:0.0.1 .
docker run -it heaton/centos:0.0.1
#繼承自centos FROM centos ONBUILD RUN echo "father onbuild----------------------------->"
docker build -f /root/Dockerfile1 -t heaton/father .
#繼承自heaton/father FROM heaton/father RUN echo "son------>success"
docker build -f /root/Dockerfile2 -t heaton/son .