系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上
版本:社區版,企業版(包含了一些收費服務)
官方版安裝教程(英文)html
網絡版安裝教程:mysql
# 安裝docker yum install docker # 啓動docker systemctl start/status docker # 查看docker啓動狀態 docker version
配置加速器linux
簡介:DaoCloud 加速器 是廣受歡迎的 Docker 工具,解決了國內用戶訪問 Docker Hub 緩慢的問題。DaoCloud 加速器結合國內的 CDN 服務與協議層優化,成倍的提高了下載速度。git
DaoCloud官網:github
https://www.daocloud.io/mirror#accelerator-docweb
# 一條命令加速(記得重啓docker) curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
docker --help(中文註解)sql
Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files #客戶端配置文件的位置 -D, --debug=false Enable debug mode #啓用Debug調試模式 -H, --host=[] Daemon socket(s) to connect to #守護進程的套接字(Socket)鏈接 -h, --help=false Print usage #打印使用 -l, --log-level=info Set the logging level #設置日誌級別 --tls=false Use TLS; implied by--tlsverify # --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書籤名CA --tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書文件路徑 --tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰文件路徑 --tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程 -v, --version=false Print version information and quit #打印版本信息並退出 Commands: attach Attach to a running container #當前shell下attach鏈接指定運行鏡像 build Build an image from a Dockerfile #經過Dockerfile定製鏡像 commit Create a new image from a container's changes #提交當前容器爲新的鏡像 cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機中 create Create a new container #建立一個新的容器,同run 但不啓動容器 diff Inspect changes on a container's filesystem #查看docker容器變化 events Get real time events from the server#從docker服務獲取容器實時事件 exec Run a command in a running container#在已存在的容器上運行命令 export Export a container's filesystem as a tar archive #導出容器的內容流做爲一個tar歸檔文件(對應import) history Show the history of an image #展現一個鏡像造成歷史 images List images #列出系統當前鏡像 import Import the contents from a tarball to create a filesystem image #從tar包中的內容建立一個新的文件系統映像(對應export) info Display system-wide information #顯示系統相關信息 inspect Return low-level information on a container or image #查看容器詳細信息 kill Kill a running container #kill指定docker容器 load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save) login Register or log in to a Docker registry#註冊或者登錄一個docker源服務器 logout Log out from a Docker registry #從當前Docker registry退出 logs Fetch the logs of a container #輸出當前容器日誌信息 pause Pause all processes within a container#暫停容器 port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應的容器內部源端口 ps List containers #列出容器列表 pull Pull an image or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像 push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器 rename Rename a container #重命名容器 restart Restart a running container #重啓運行的容器 rm Remove one or more containers #移除一個或者多個容器 rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才能夠刪除,不然須要刪除相關容器才能夠繼續或者-f強制刪除) run Run a command in a new container #建立一個新的容器並運行一個命令 save Save an image(s) to a tar archive#保存一個鏡像爲一個tar包(對應load) search Search the Docker Hub for images #在docker hub中搜索鏡像 start Start one or more stopped containers#啓動容器 stats Display a live stream of container(s) resource usage statistics #統計容器使用資源 stop Stop a running container #中止容器 tag Tag an image into a repository #給源中鏡像打標籤 top Display the running processes of a container #查看容器中運行的進程信息 unpause Unpause all processes within a container #取消暫停容器 version Show the Docker version information#查看容器版本號 wait Block until a container stops, then print its exit code #截取容器中止時的退出狀態值 Run 'docker COMMAND --help' for more information on a command. #運行docker命令在幫助能夠獲取更多信息 docker search hello-docker # 搜索hello-docker的鏡像 docker search centos # 搜索centos鏡像 docker pull hello-docker # 獲取centos鏡像 docker run hello-world #運行一個docker鏡像,產生一個容器實例(也能夠經過鏡像id前三位運行) docker image ls # 查看本地全部鏡像 docker images # 查看docker鏡像 docker image rmi hello-docker # 刪除centos鏡像 docker ps #列出正在運行的容器(若是建立容器中沒有進程正在運行,容器就會當即中止) docker ps -a # 列出全部運行過的容器記錄 docker save centos > /opt/centos.tar.gz # 導出docker鏡像至本地 docker load < /opt/centos.tar.gz #導入本地鏡像到docker鏡像庫 docker stop `docker ps -aq` # 中止全部正在運行的容器 docker rm `docker ps -aq` # 一次性刪除全部容器記錄 docker rmi `docker images -aq` # 一次性刪除全部本地的鏡像記錄
3.1 啓動容器的兩種方式docker
容器是運行應用程序的,因此必須得先有一個操做系統爲基礎shell
一、基於鏡像新建一個容器並啓動
# 1. 後臺運行一個docker docker run -d centos /bin/sh -c "while true;do echo 正在運行; sleep 1;done" # -d 後臺運行容器 # /bin/sh 指定使用centos的bash解釋器 # -c 運行一段shell命令 # "while true;do echo 正在運行; sleep 1;done" 在linux後臺,每秒中打印一次正在運行 docker ps # 檢查容器進程 docker logs -f 容器id/名稱 # 不間斷打印容器的日誌信息 docker stop centos # 中止容器 # 2. 啓動一個bash終端,容許用戶進行交互 docker run --name mydocker -it centos /bin/bash # --name 給容器定義一個名稱 # -i 讓容器的標準輸入保持打開 # -t 讓Docker分配一個僞終端,並綁定到容器的標準輸入上 # /bin/bash 指定docker容器,用shell解釋器交互
當利用docker run來建立容器時,Docker在後臺運行的步驟以下:
# 1. 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載 # 2. 利用鏡像建立並啓動一個容器 # 3. 分配一個文件系統,並在只讀的鏡像層外面掛在一層可讀寫層 # 4. 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去 # 5. 從地址池配置一個ip地址給容器 # 6. 執行用戶指定的應用程序 # 7. 執行完畢後容器被終止
二、將一個終止狀態(stopped)的容器從新啓動
[root@localhost ~]# docker ps -a # 先查詢記錄 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee92fcf6f32d centos "/bin/bash" 4 days ago Exited (137) 3 days ago kickass_raman [root@localhost ~]# docker start ee9 # 再啓動這個容器 ee9 [root@localhost ~]# docker exec -it ee9 /bin/bash # 進入容器交互式界面 [root@ee92fcf6f32d /]# # 注意看用戶名,已經變成容器用戶名
3.2 提交建立自定義鏡像
# 1.咱們進入交互式的centos容器中,發現沒有vim命令 docker run -it centos # 2.在當前容器中,安裝一個vim yum install -y vim # 3.安裝好vim以後,exit退出容器 exit # 4.查看剛纔安裝好vim的容器記錄 docker container ls -a # 5.提交這個容器,建立新的image docker commit 059fdea031ba chaoyu/centos-vim # 6.查看鏡像文件 docker images REPOSITORY TAG IMAGE ID CREATED SIZE chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB
3.3 外部訪問容器
容器中能夠運行網絡應用,可是要讓外部也能夠訪問這些應用,能夠經過-p或-P參數指定端口映射。
docker run -d -P training/webapp python app.py # -P 參數會隨機映射端口到容器開放的網絡端口 # 檢查映射的端口 docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi #宿主機ip:32768 映射容器的5000端口 # 查看容器日誌信息 docker logs -f cfd # #不間斷顯示log # 也能夠經過-p參數指定映射端口 docker run -d -p 9000:5000 training/webapp python app.py
打開瀏覽器訪問服務器的9000端口, 內容顯示 Hello world!表示正常啓動
(若是訪問失敗的話,檢查本身的防火牆,以及雲服務器的安全組)
鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎。咱們以前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,就得自定製這些鏡像。
# 鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。 # Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。
參數詳解
FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋 LABEL maintainer=「yc_uuu@163.com" #對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」 WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd WORKDIR /test # 若是沒有就自動建立 WORKDIR demo # 再進入demo文件夾 RUN pwd # 打印結果應該是/test/demo ADD and COPY ADD hello / # 把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz / # 添加到根目錄並解壓 WORKDIR /root ADD hello test/ # 進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ # 等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程文件/目錄使用curl或wget ENV # 環境變量,儘量使用ENV增長可維護性 ENV MYSQL_VERSION 5.6 # 設置一個mysql常量 RUN yum install -y mysql-server=「${MYSQL_VERSION}」
進階知識(瞭解)
VOLUME and EXPOSE 存儲和網絡 RUN and CMD and ENTRYPOINT RUN:執行命令並建立新的Image Layer CMD:設置容器啓動後默認執行的命令和參數 ENTRYPOINT:設置容器啓動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo 」hello docker」 ENTRYPOINT echo 「hello docker」 Exec格式 RUN [「apt-get」,」install」,」-y」,」vim」] CMD [「/bin/echo」,」hello docker」] ENTRYPOINT [「/bin/echo」,」hello docker」] 經過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變量 ENTRYPOINT [「/bin/bash」,」-c」,」echo hello $name"] CMD 容器啓動時默認執行的命令 若是docker run指定了其餘命令(docker run -it [image] /bin/bash ),CMD命令被忽略 若是定義多個CMD,只有最後一個執行 ENTRYPOINT 讓容器以應用程序或服務形式運行 不會被忽略,必定會執行 最佳實踐:寫一個shell腳本做爲entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [「docker-entrypoint.sh] EXPOSE 27017 CMD [「mongod」] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name」]
5.1 docker hub共有鏡像發佈
docker提供了一個相似於github的倉庫docker hub,官方網站(需註冊使用)
# 註冊docker id後,在linux中登陸dockerhub docker login # 注意要保證image的tag是帳戶名,若是鏡像名字不對,須要改一下tag docker tag chaoyu/centos-vim peng104/centos-vim # 語法是: docker tag 倉庫名 peng104/倉庫名 # 推送docker image到dockerhub docker push peng104/centps-cmd-exec:latest # 去dockerhub中檢查鏡像 # 先刪除本地鏡像,而後再測試下載pull 鏡像文件 docker pull peng104/centos-entrypoint-exec
docker hub 是公開的,其餘人也是能夠下載,並不安全,所以還可使用docker registry官方提供的私有倉庫
用法詳解:
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
# 1.下載一個docker官方私有倉庫鏡像 docker pull registry # 2.運行一個docker私有容器倉庫 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry -d 後臺運行 -p 端口映射 宿主機的5000:容器內的5000 -v 數據卷掛載 宿主機的 /opt/data/registry :/var/lib/registry registry 鏡像名 /var/lib/registry 存放私有倉庫位置 # Docker 默認不容許非 HTTPS 方式推送鏡像。咱們能夠經過 Docker 的配置選項來取消這個限制 # 3.修改docker的配置文件,讓他支持http方式,上傳私有鏡像 vim /etc/docker/daemon.json # 寫入以下內容 { "registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries":["192.168.11.37:5000"] } # 4.修改docker的服務配置文件 vim /lib/systemd/system/docker.service # 找到[service]這一代碼區域塊,寫入以下參數 [Service] EnvironmentFile=-/etc/docker/daemon.json # 5.從新加載docker服務 systemctl daemon-reload # 6.重啓docker服務 systemctl restart docker # 注意:重啓docker服務,全部的容器都會掛掉 # 7.修改本地鏡像的tag標記,往本身的私有倉庫推送 docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-hello # 瀏覽器訪問http://192.168.119.10:5000/v2/_catalog查看倉庫 # 8.下載私有倉庫的鏡像 docker pull 192.168.11.37:5000/peng-hello
編寫dockerfile,構建本身的鏡像,運行flask程序。
確保app.py和dockerfile在同一個目錄!
# 1.準備好app.py的flask程序 [root@localhost ~]# cat app.py from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) [root@master home]# ls app.py Dockerfile # 2.編寫dockerfile [root@localhost ~]# cat Dockerfile FROM python:2.7 LABEL maintainer="溫而新" RUN pip install flask COPY app.py /app/ WORKDIR /app EXPOSE 8080 CMD ["python","app.py"] # 3.構建鏡像image,找到當前目錄的Dockerfile,開始構建 docker build -t peng104/flask-hello-docker . # 4.查看建立好的images docker image ls # 5.啓動此flask-hello-docker容器,映射一個端口供外部訪問 docker run -d -p 8080:8080 peng104/flask-hello-docker # 6.檢查運行的容器 docker container ls # 7.推送這個鏡像到私有倉庫 docker tag peng104/flask-hello-docker 192.168.11.37:5000/peng-flaskweb docker push 192.168.11.37:5000/peng-flaskweb