摘要:如無論哪個服務器,下載的文件內容是一樣的。如果需要啟動,通過命令執行完后,再打開文件,可以看到的了。
docker的官網:https://www.docker.com/
官方文檔:https://docs.docker.com/
github: https://github.com/docker/lab...
Docker類似虛擬機,是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上。
Docker分兩個版本,CE(Community Edition)和EE(Enterprise Edition)。CE版本是免費的,如果我們學習或者一般應用,CE足夠。EE版本在安全性上有很大提升,是收費版本,可以試用一定時間。
Docker容器和虛擬機的主要區別在于,虛擬機管理程序對整個設備進行抽象處理,而容器只是對操作系統內核進行抽象處理。相對于虛擬機,容器可以“丟棄沒有用的99.9%的虛擬機垃圾,剩下一個小巧簡潔的膠囊式容器,里面含有你的應用程序”。
主要概念5個概念:
鏡像(Docker Image)
可以看成是Java中的類。鏡像可以用來創建Docker容器。可以通過命令“dock images”查看本地的所有鏡像。
容器(Docker Container)
Image的一個運行實例就是一個Container,可以看成是Java中的對象,通過類實例化而來。一個Image可以有多個Container,每個Container都是相互隔離的。可以通過命令“docker ps”查看正在運行的Container(或者通過docker ps -a查看所有Container)。
倉庫(Docker Repository/Registry)
同maven倉庫,它用來存放第三方庫。Docker的倉庫用來存放鏡像,且也可分為公開倉庫和私有倉庫,比如公開倉庫:https://hub.docker.com/ https://store.docker.com/。
Docker客戶端(Docker client)
命令行工具,用于與Docker后臺交互。
Docker后臺(Docker daemon)
宿主機上運行的Docker后臺服務,管理容器的構建、運行、分發等。
這里以Docker CE版本和CentOS7(虛擬機)系統為例,簡單介紹Docker。
安裝安裝方式有3種,1)在線安裝;2)下載安裝包手動安裝;3)通過官方提供的自動腳本安裝。
下載安裝包手動安裝比較簡單,適合上不了網的機器。自動腳本安裝不推薦,這里舉例在線安裝。
# 首先卸載舊的版本(如果有的話)
$ sudo yum remove docker docker-common docker-selinux docker-engine
如果沒有,則會提示如下:
No Match for argument: docker No Match for argument: docker-common No Match for argument: docker-selinux No Match for argument: docker-engine No Packages marked for removal
# 安裝依賴的包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 設置Docker的repository。后續通過該repository安裝和更新
$ sudo yum-config-manager --add-repo https://download.docker.com/l...
Loaded plugins: fastestmirror, langpacks adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
*注:如果國內服務器,可以將https://download.docker.com/linux/ 替換為 https://mirrors.aliyun.com/docker-ce/linux/。如:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
無論哪個服務器,下載的docker-ce.repo文件內容是一樣的。*
生成了/etc/yum.repos.d/docker-ce.repo文件,可以查看里面的內容,默認只有[docker-ce-stable]是啟用的,即enabled=1,其他如docker-ce-edge、docker-ce-test等都是禁用的。
如果需要啟動docker-ce-edge,通過命令:
$ sudo yum-config-manager --enable docker-ce-edge
執行完后,再打開/etc/yum.repos.d/docker-ce.repo文件,可以看到docker-ce-edge的enabled=1了。
如果要禁用,通過命令:
$ sudo yum-config-manager --disable docker-ce-edge
# 安裝最新版的Docker CE(或指定版本)
$ sudo yum install docker-ce
如果在生產環境,往往不是安裝最新版本,而是安裝指定版本,那么可以先通過如下命令查看版本:
$ yum list docker-ce --showduplicates|sort -r
然后取上面輸出內容中標紅的部分,即:$ sudo yum install docker-ce-17.12.0.ce
# 啟動Docker。啟動好后,客戶端命令就和該docker daemon交互了
$ sudo systemctl start docker
# 檢查docker是否已正確安裝
$ sudo docker run hello-world
該命令會下載一個test鏡像,并在容器中運行。輸出如下,表示已正確安裝:
Unable to find image "hello-world:latest" locally ... Hello from Docker! This message shows that your installation appears to be working correctly. ...
# 查看Docker版本
$ docker -v
Docker version 17.12.0-ce, build c97c6d6
# 配置docker用戶
【linux下除非必要,否則別用root】如果不是root用戶,運行docker命令需要sudo。可以增加docker用戶至docker組。命令:
# 創建用戶組docker(如果已經創建了,則不用再創建)
$ sudo groupadd docker
# 用戶$USER替換成真實用戶,添加用戶至docker組
$ sudo usermod -aG docker $USER
然后退出重新登錄(可能需要重啟)。
# 使用國內的鏡像加速
$ sudo docker pull registry.docker-cn.com/library/redis:latest
下載latest版本。
或者按下列步驟(注:daemon.json不存在的話,則新建。該文件用來存放docker命令行選項,key-value形式):
# 1 這一步可以不要,如果/etc/docker已存在 sudo mkdir -p /etc/docker # 2 這一步將registry-mirrors內容寫入到daemon.json。如果daemon.json不存在則創建。(我的默認沒有這個文件) sudo tee /etc/docker/daemon.json <<-"EOF" { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF # 3 重新載入systemd,掃描新的或有變動的單元 sudo systemctl daemon-reload # 4 重啟docker sudo systemctl restart docker
推薦用這種方式。做了一下測試,在daemon.json中把地址改為國外registry.docker.com,速度明顯慢很多。
至此,docker已在CentOS7上安裝完成。
簡單使用注:Docker分客戶端和服務端,即C/S模式,上面步驟安裝完后,本機就有了Docker Client和Docker Daemon。我們輸入的docker命令,都是通過客戶端與Docker Daemon交互的。
# 下載一個鏡像alpine(輕量級的Linux發行版)
$ docker pull alpine
可以通過search命令查詢有哪些鏡像,比如:$ docker search alpine
# 下載完之后,查看本地已有的鏡像
$ docker images
注:可以通過 docker rmi 鏡像名或鏡像ID 刪除鏡像。如果鏡像被容器使用了,則會提示無法刪除。需要先停止并刪除容器。如果沒有容器使用,也刪除不了,比如報錯:
Error response from daemon: conflict: unable to delete 6c6084ed97e5 (cannot be forced) - image has dependent child images
可以試試用 名稱:TAG,如:
$ docker rmi alpine:3.5
# 根據鏡像創建一個鏡像的運行實例,即容器
$ docker run alpine ls -l
這里是運行alpine鏡像的一個容器,并執行ls -l命令
# 進入容器內的交互模式。可通過exit命令退出
$ docker run -it alpine /bin/sh
進入交互模式后,就可以在該Container中運行一些命令了。
# 查看容器
# 查看當前正運行的容器
$ docker ps
# 查看所有容器(包含未運行的)
$ docker ps -a
到這里,簡單使用介紹完畢。接下來,部署一個web服務。
運行一個web服務目前為止,還沒看到一個網站的例子,下面介紹。步驟如下:
注:這里仍然直接用公開庫的例子static-site
# 下載鏡像
$ docker run -d dockersamples/static-site
# 啟動該鏡像的一個容器
$ docker run --name static-site -e AUTHOR="Your Name" -d -P dockersamples/static-site
# 查看該容器服務的訪問端口
$ docker port static-site
# 打開瀏覽器,訪問服務
上圖中,可以看出80端口映射的是32773端口。隨意瀏覽器中輸入地址:http://192.168.0.12:32773(IP替換成你的實際IP),顯示如下:
# 停止和刪除容器
$ docker stop static-site
$ docker rm static-site
至此,我們訪問了一個部署在Docker容器中的簡單服務了。
部署一個Java web應用如果我們的應用采用的是微服務架構,那么可以將各個微服務通過Docker來部署,簡單又快捷。這里以一個Java Web應用部署為例說明。
# 下載一個Tomcat鏡像
$ docker pull tomcat
默認下載最新版的Tomcat
# 啟動tomcat鏡像的一個實例容器
$ docker run -p 5000:8080 --name tomcat-container1 tomcat
這里的-p 5000:8080表示將容器內的8080端口映射到宿主機的5000端口上,通過5000來訪問該tomcat服務。啟動完成后,會在當前控制臺輸出日志。會看到:
org.apache.catalina.startup.Catalina.start Server startup in 1365 ms
表示啟動成功。
# 瀏覽器中輸入地址
比如我這里:http://192.168.0.12:5000,會顯示熟悉的Tomcat界面。
# 新開一個控制臺,進入container中,準備部署war包
$ docker exec -it tomcat-container1 /bin/sh
進入之后,就可以查看tomcat的目錄了。
注意這里是docker exec,不是docker run。docker run是啟動新的容器。
# 將war包放在宿主機某個位置,然后拷貝到容器中
$ docker cp /var/ftp/pub/TestWebApp.war tomcat-container1:/usr/local/tomcat/webapps
表示將宿主機上/var/ftp/pub/TestWebApp.war拷貝到容器中的/usr/local/tomcat/webapps下。
要查看容器中的具體位置,可以在進入容器后運行pwd命令查看,比如我這里為/usr/local/tomcat
注意,docker用戶需要有war包的讀取權限,否則拷貝時會報錯:
ERRO[0000] Can"t add file /var/ftp/pub/TestWebApp.war to tar: open /var/ftp/pub/TestWebApp.war: permission denied ERRO[0000] Can"t close tar writer: archive/tar: missed writing 869 bytes Error response from daemon: Error processing tar file(exit status 1): unexpected EOF
war包放到webapp下后,會自動加載,通過瀏覽器訪問即可。如:http://192.168.0.12:5000/TestWebApp/
一個簡單的war包就部署好了。
如果我們的web應用采用了mysql, redis等,那么分別把相應的鏡像下載下來,然后配置映射端口,并啟動。我們通過宿主機的IP加端口,就可以訪問各個服務了。不建議把所有服務放到一個容器里面,升級、維護都不方便。
我們知道,一個鏡像可以啟動多個容器,容器間互不干擾。所以,在上面tomcat例子中,我們可以再啟動一個實例容器,名稱為tomcat-container2,端口號映射到宿主機的5002端口:
$ docker run -p 5002:8080 --name tomcat-container2 tomcat
啟動成功后,再開一個終端,進入tomcat-container2容器:
$ docker exec -it tomcat-container2 /bin/sh
進入容器后,cd到webapps目錄,發現并沒有剛才上傳的TestWebApp.war,這也說明,兩個容器是相互獨立的。
# 鏡像備份和恢復
# 打包鏡像為tomcat.tar,保存在當前目錄
$ docker save -o tomcat.tar tomcat
# 將tar包拷貝到另一臺機器上(也安裝了Docker),然后執行加載tar包命令
$ docker load -i tomcat.tar
# 可以通過docker images查看新加載進來的tomcat鏡像,然后創建該鏡像示例(容器)即可
$ docker run -it tomcat /bin/sh
# 容器備份和恢復
容器備份比鏡像備份多了幾個步驟。
# 查看需要備份的容器
$ docker ps -a
# 創建該容器的快照
$ docker commit -p 3f14281c89b5 tomcat-container1-backup
# 查看新的容器快照的鏡像
$ docker images
接下來,步驟同上面的鏡像備份和恢復。
# 將鏡像打包成tar包
$ docker save -o tomcat-container1-backup.tar tomcat-container1-backup
# 將tar包拷貝到另一臺機器上(也安裝了Docker),然后執行加載tar包命令
$ docker load -i tomcat-container1-backup.tar
# 可以通過docker images查看新加載進來的tomcat鏡像,然后運行該鏡像容器,進入交互模式。注意這里并沒有啟動tomcat服務
$ docker run -it tomcat-container1-backup /bin/sh
進入到webapps目錄,可以看到,之前放在容器中的TestWebApp.war也在。
# 再啟動一個新的容器,映射端口5000,來訪問一下tomcat
$ docker run -it -p 5000:8080 tomcat-container1-backup
# 通過瀏覽器訪問
我這里的地址為: http://192.168.0.13:5000/TestWebApp/
這里舉例Ubuntu容器安裝wget工具。我們先把所有的容器停止和刪除,當然也可以一個一個刪:
$ docker stop docker ps -a -q
$ docker rm docker ps -a -q
# 首先獲取一個ubuntu的docker鏡像。如果已有,則略過
$ docker pull ubuntu
# 啟動ubuntu實例容器,并進入容器
$ docker run -it ubuntu
# 輸入wget,會報命令未找到。
# 輸入apt-get install wget安裝命令,報錯E: Unable to locate package wget
出現如上錯誤,需要先執行apt-get update,然后再apt-get install wget
# wget安裝好之后,可以執行如下命令
# wget https://segmentfault.com/
會現在index.html文件至當前目錄,通過cat可查看文件內容。(未安裝vi)
wget安裝完成。
總結$ docker run -it tomcat-container1-backup /bin/sh
這個命令是啟動容器,并進入交互模式。退出交互模式后,該容器自動停止。
$ docker run -it tomcat-container1-backup
這個命令是直接啟動tomcat容器,Ctrl+c退出
$ docker start inspiring_clarke
啟動已有的容器,容器名稱為inspiring_clarke
$ docker rename jovial_wright test1
容器重命名為test1,創建容器時如果不指定名稱,會自動生成名稱,比如這里的jovial_wright
$ docker stop nostalgic_bardeen
停止正在運行的容器,容器名稱nostalgic_bardeen
$ docker rm inspiring_clarke
刪除容器,容器名稱inspiring_clarke
$ docker rmi e8301a85400c
刪除鏡像,鏡像ID為e8301a85400c
$ docker images
查看本地所有鏡像
$ docker ps
查看正在運行的容器
$ docker ps -a
查看所有創建的容器
到這里,對Docker應該有一個大致了解了。要更深入掌握,比如自己制作鏡像等,請參考網上其他資料。
不錯的資料參考:
https://blog.lab99.org/post/d...
http://www.zdnet.com/article/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27198.html
摘要:一核心組件客戶端和服務端鏡像容器二關鍵概念以鏡像為基礎,在鏡像的基礎上創建運行容器,可以簡單的理解為容器是鏡像運行時的表現。 一、docker核心組件 docker客戶端和服務端 docker鏡像 registry docker容器 二、關鍵概念 docker以鏡像為基礎,在鏡像的基礎上創建、運行容器,可以簡單的理解為容器是鏡像運行時的表現。 三、docker基本命令 容器相關 1、d...
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
閱讀 3094·2021-08-03 14:05
閱讀 2140·2019-08-29 15:35
閱讀 678·2019-08-29 13:30
閱讀 3168·2019-08-29 13:20
閱讀 2530·2019-08-23 18:15
閱讀 1796·2019-08-23 14:57
閱讀 2213·2019-08-23 13:57
閱讀 1309·2019-08-23 12:10