摘要:和區別讓用戶可以進入查看輸出等等操作,但是并不會另外啟動一個進程如果你用來退出,同時這個信號會默認情況會啟動另外一個進程來進入,這里的操作是在這個進程下的。
走在通往docker的大道上——docker基礎知識匯總
最后編輯時間:2017年03月09日
Docker是一種新的容器化技術,為應用開發和部署提供“一站式”容器解決方案,能幫助開發者高效快速的構建應用,實現“Build,Ship and Run Any App, Anywhere”,從而達到“一次構建,到處運行”的目的。
2.為什么Docker相信大家都有這樣的遭遇,每次要開發新軟件或者換環境的時候,需要安裝配置一大堆的依賴。雖然有yum或者apt這類的包管理軟件幫忙,但是如果出現的包沖突,或者找不到包的情況,或者需要源碼編譯卻缺失依賴,這種環境部署簡直就是噩夢。
Docker就是解決上述噩夢的利器。同時,Docker也解決了跨平臺部署的問題,你可以在MacOS, Windows, Linux上安裝Docker,然后下載你所需要的Docker鏡像(image)進行程序開發。當你的程序需要發布的時候,僅僅需要將你的Docker鏡像打包發布,不再需要搭建新環境,讓軟件開發流程變得快速簡單。
3.Docker的特色包括但不僅限于:
物美價廉
輕量級和便攜化
低CPU 和內存使用
啟動、運行、關閉速度快
可以用來作為云計算的基礎
對于開發和部署來說,Docker可以:
更快速的交付和部署應用環境
更高效的資源利用率
更便捷的遷移和擴展性
更便捷的應用更新管理
4.Docker與虛擬機Docker和虛擬機都是基于軟件的平臺虛擬化技術,其中:
虛擬機屬于完全虛擬化,即模擬完整的底層硬件環境特權指令的執行,客戶操作系統無需進行修改。比如我們常用的VirtualBox,VMWare Workstation和Parallels Desktop等虛擬化軟件。
Docker和其它容器技術便是操作系統級虛擬化,即直接通過內核創建虛擬的操作系統實例(內核和庫),來隔離不同的進程和資源。
也就是說,Docker容器不需要額外的虛擬機管理軟件和虛擬機操作系統層,直接在宿主機操作系統層面上實現虛擬化,從而達到輕量級,高效的目的。
5.Docker核心概念 Docker底層組成:Namespace:隔離技術的第一層,確保 Docker 容器內的進程看不到也影響不到 Docker 外部的進程。
Control Groups:LXC 技術的關鍵組件,用于進行運行時的資源限制。
UnionFS(文件系統):容器的構件塊,創建抽象層,從而實現 Docker 的輕量級和運行快速的特性。
Docker的主要構成:Docker Client:用戶和 Docker 守護進程進行通信的接口,也就是 docker 命令。
Docker Daemon:宿主機上用于用戶應答用戶請求的服務。
Registry:注冊服務器,注冊服務器是存放倉庫(Repository)的具體服務器。
Docker的三元素:Container:用于運行應用程序的容器,包含操作系統、用戶文件和元數據,相當于鏡像Images的一個運行實例。。
Images:只讀的 Docker 容器模板,簡言之就是系統鏡像文件。
DockerFile:進行鏡像創建的指令文件。
簡單來說,Docker 鏡像就是一個只讀的模板。例如:一個鏡像可以包含一個完整的 ubuntu 操作系統環境,里面僅安裝了 Apache 或用戶需要的其它應用程序。
6.Docker安裝Docker是建立在Linux內核基礎上的,在目前的主流Linux系統中,都已經原生支持了Docker且使用體驗也最好,當然,在Windows平臺和MacOS系統中也支持Docker,只是需要使用類似Boot2Docker等虛擬化工具來提供Linux支持。
關于在各種平臺上安裝Docker的方法參考 官網 的Docker Docs,這里不再贅述。
7.Docker基礎命令Docker提供了很多命令來管理鏡像、容器和倉庫。包括:
從Docker Hub倉庫中查找search、上傳push、下載pull鏡像。
查看本地已有鏡像、容器信息的images、inspect和ps命令。
刪除本地鏡像和容器的rmi和rm命令。
基于已有容器創建鏡像的commit命令和基于Dockerfile創建鏡像build命令。
運行、進入容器的run、exec和attach命令。
鏡像的保存和導入命令save和load,容器的導出導入命令export和import
具體命令的使用方法使用命令docker --help查看所有命令列表,使用docker COMMAND --help查看具體命令的信息
8.基礎命令詳解 1.檢查安裝 docker info如果 Docker 沒有安裝,會提示command not found,如果 Docker 已經成功安裝,則會有類似如下的提示:
輸入 docker info 輸出 Containers: 2 Images: 2 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 6 Dirperm1 Supported: false Execution Driver: native-0.2 Kernel Version: 3.13.0-24-generic Operating System: Ubuntu 14.04 LTS CPUs: 1 Total Memory: 979.6 MiB Name: ubuntu ID: PRLX:CY3O:TZ6P:4UAS:VDWM:MHWB:FB3V:TJBJ:GQ4J:Q453:GPOY:WZSI WARNING: No swap limit support2. 查看本地鏡像 docker images
鏡像是Docker生命周期中的“構建”部分,可以用來創建 Docker 容器。
輸入 docker images 輸出 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 91c95931e552 5 days ago 910 B3. 下載鏡像 docker pull
輸入 docker pull busybox 輸出 latest: Pulling from busybox cf2616975b4a: Pull complete 6ce2e90b0bc7: Pull complete 8c2e06607696: Already exists busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d Status: Downloaded newer image for busybox:latest
busybox 是一個 Linux 工具集,包括各種常用命令,例如 cat、echo ,也有各種高級命令,例如 grep、mount 等。執行完 docker pull busybox 之后,Docker 會自動從 Docker 官方下載 busybox 的鏡像文件。
這個過程中可以執行 Ctrl+C,docker pull 不會因為 Ctrl+C 打斷,而回轉為后臺執行。
4. 運行鏡像 docker run輸入 docker run busybox /bin/echo Hello Docker 輸出 Hello Docker
這條命令是運行 busybox 鏡像中的 /bin/echo 命令,參數是 Hello Docker
其他標志:
-i 保證容器的stdin開啟 -t 為容器生成一個tty終端 -d 表示后臺運行 --rm=true 容器終止后刪除 --name name 表示 container 的名稱 -v 將目錄掛載到 container --privileged=true 防止沒有權限訪問掛載的目錄 -p 9998:80 指定端口映射 --link name:container 與其他 container 鏈接. --icc=true 去除 container 之間不互通. 需要放在 run 前面. 注意,--rm 和 -d 參數不能同時使用。5.刪除鏡像 docker rmi
docker rmi/
刪除所有未打 tag 的鏡像
docker rmi $(docker images -q | awk "/^/ { print $3 }")
刪除所有鏡像
docker rmi $(docker images -q)6. 查看本地容器 docker ps
docker ps 查看正在運行的容器
輸入 docker ps 輸出 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 91c95931e552 1 days ago 910 B
docker ps -a 查看所有的容器,-q 返回 id
docker ps -a -q
docker ps -n x 該命令會顯示最后x個容器,不論這些容器是運行還是停止的。
7. 查詢輸出docker logs查詢容器的輸出內容:
例如:通過 docker logs 命令查詢 sample_job 對應的容器的輸出內容。
sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done")
輸入 docker logs $sample_job 輸出 Docker Docker Docker Docker
只要這個容器運行的時間足夠長,就會輸出足夠多行的 Docker。
8. 啟動容器docker startdocker start9. 停止容器docker stop/
docker stop10. 重啟容器docker restart/
docker restart11.刪除容器 docker rm/
docker rm/
刪除所有 Docker 容器
docker rm $(docker ps -a -q)12.保存容器docker commit
docker commit -m="A new image" --author="Aomine" 614122c0aabb aoct/apache2
將當前的 Docker 容器保存為一個名為 aoct/apache2 的鏡像。-m指定創建鏡像的提交信息,--author指定鏡像作者,接著是容器ID、目標鏡像倉庫、鏡像名。
13. 鏡像上傳docker push創建docker hub賬戶,將本地的image push 到hub上,這樣其他人也可以使用了。首先我們先tag 一個image,然后將其push到我們的repo里。
docker tag id {username}/{images_name}:v1 docker push {username}/{images_name}14. 獲取鏡像歷史docker history
docker history
只能對本地存在的 Docker 鏡像執行這個命令。
15.進入容器當我們使用 -d參數運行了一個Container的時候,有時候我們需要進入這個容器進行一些操作。例如有這樣的一個情況,我們運行了一個app在一個容器里,我們想進入容器看看,這個app運行的狀態,查看log。那們如何進入呢?其實有很多種方法,這里介紹兩種。
$ docker run -d --name demo ubuntu /usr/bin/top -b $ docker attach demo
docker exec -i -t webapp /bin/bash
docker attach 和 docker exec區別
docker attach讓用戶可以進入Container查看輸出等等操作,但是并不會另外啟動一個進程! 如果你用CTRL-c來退出,同時這個信號會kill Container(默認情況)
docker exec 會啟動另外一個進程來進入Container,這里的操作是在這個進程下的。如果你用CTRL-c來退出,不會kill 原來的Container
16.鏡像的導入與導出load & save使用 load 從 stdin 導入一個 tar 格式的鏡像或者倉庫,然后用 save 將 tar 鏡像輸出到 stdout。
docker save -o
這兩個命令常用于多節點部署。
例如:
命令 # docker save -o a.tar suse 命令 # docker load -i a.tar17.容器導入import
用于導入 URL / 文件,從本地導入需要 - 參數。docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]、URL/-二選一。
命令# docker import http://mirrors.ustc.edu.cn/openvz/template/precreated/suse-13.1-x86-minimal.tar.gz suse:minimal #這里使用的是ustc鏡像源。 Downloading from http://mirrors.ustc.edu.cn/openvz/template/precreated/suse-13.1-x86-minimal.tar.gz 127a9e7b9f87e4fc280c96bee9fad0a19057de38d307fe7fc1f6d35c86f1aff657.89 MB/57.89 MB 命令# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE suse minimal 127a9e7b9f87 2 minutes ago 149.1 MB
導入本地鏡像:
cat suse-13.1-x86-minimal.tar.gz |docker import - suse:minmal18.容器導出export
和 import 相反,export 將容器導出成 tar 壓縮包。
例如
命令 # docker run -i -t -d suse:minimal /bin/bash 060f6e6c877af01313363b6506107438b9eb5ba87a7ef0625577e348a554ecca
命令 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 060f6e6c877a suse:minimal "/bin/bash" 2 seconds ago Up 2 seconds fervent_ritchie 命令 # docker export -o a.tar 060f 命令 # docker export 060f > a.tar #也可以這樣。
Dockerfile實際上是由一行行命令組成的,讓用戶可以方便的創建自定義鏡像。
Dockerfile大體由四部分組成:
指明基礎鏡像指令FROM
維護者信息指令MAINTAINER
鏡像操作指令RUN、EVN、ADD和WORKDIR等
容器啟動時的執行指令CMD、ENTRYPOINT和USER等
下邊就是一個Dockerfile的例子
FROM python:2.7 MAINTAINER yumengzhong <760042201@qq.com> COPY . /app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 5000 ENTRYPOINT ["python"] CMD ["app.py"]
1. 從dockerhub上pull下python 2.7的基礎鏡像。 2. 維護者的信息 3. copy當前目錄到容器中的 /app目錄下 復制本地主機的(Dockerfile所在目錄的相對路徑)到容器里 4. 指定工作路徑為/app 5. 安裝依賴 6. 暴露5000端口 7. 啟動app
這個例子是啟動一個python flask app的Dockerfile(flask是python的一個輕量的web框架)。
下邊我就來介紹下dockerfile里常用的指令。
格式
Dockerfile 中所有的命令都是以下格式:INSTRUCTION argument
指令(INSTRUCTION)不分大小寫,但是推薦大寫。
FROM
用于指定基礎的images
格式為 FROM
所有的 Dockerfile 都用該以 FROM 開頭,FROM 命令指明 Dockerfile 所創建的鏡像文件以什么鏡像為基礎,FROM 以后的所有指令都會在 FROM 的基礎上進行創建鏡像;可以在同一個 Dockerfile 中多次使用 FROM 命令用于創建多個鏡像。
MAINTAINER
格式為 MAINTAINER
MAINTAINER yumengzhong <760042201@qq.com>
RUN
格式為 RUN
用于容器內部執行命令。每個 RUN 命令相當于在原有的鏡像基礎上添加了一個改動層,原有的鏡像不會有變化。
ADD
格式為 ADD
該命令將復制指定的
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
COPY
格式為 COPY
復制本地主機的
當使用本地目錄為源目錄時,推薦使用 COPY
CMD
CMD 命令有三種格式:
CMD ["executable","param1","param2"]:推薦使用的 exec 形式。
CMD ["param1","param2"]:無可執行程序形式
CMD command param1 param2:shell 形式。
CMD 命令用于啟動容器時默認執行的命令,CMD 命令可以包含可執行文件,也可以不包含可執行文件:不包含可執行文件的情況下就要用 ENTRYPOINT 指定一個,然后 CMD 命令的參數就會作為ENTRYPOINT的參數。
一個 Dockerfile 中只能有一個CMD,如果有多個,則最后一個生效。
CMD 的 shell 形式默認調用 /bin/sh -c 執行命令。
CMD 命令會被 Docker 命令行傳入的參數覆蓋:docker run busybox /bin/echo Hello Docker 會把 CMD 里的命令覆蓋。
ENTRYPOINT
ENTRYPOINT 命令也有兩種格式:
ENTRYPOINT ["executable", "param1", "param2"] :推薦使用的 exec 形式
ENTRYPOINT command param1 param2 :shell 形式
ENTRYPOINT 命令的字面意思是進入點,而功能也恰如其意:他可以讓你的容器表現得像一個可執行程序一樣。
一個 Dockerfile 中只能有一個 ENTRYPOINT,如果有多個,則最后一個生效。
關于 CMD 和 ENTRYPOINT 的聯系請看下面的例子
僅僅使用 ENTRYPOINT:
FROM ubuntu ENTRYPOINT ls -l
docker build -t yumengzhong/lstest .
執行 docker run 306cd7e8408b /etc/fstab 和 docker run 306cd7e8408b 結果并不會有什么差別:
命令 # docker run 306cd7e8408b /etc/fstab total 64 drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin drwxr-xr-x 2 root root 4096 Apr 10 2014 boot drwxr-xr-x 5 root root 360 Apr 24 02:52 dev drwxr-xr-x 64 root root 4096 Apr 24 02:52 etc drwxr-xr-x 2 root root 4096 Apr 10 2014 home ……
但是我們通常使用 ENTRYPOINT 作為容器的入口,使用 CMD 給 ENTRYPOINT 增加默認選項:
FROM ubuntu CMD ["-l"] ENTRYPOINT ["ls"]
然后執行這個容器:
不加參數便會默認有 -l參數:
命令 # docker run 89dc7e6d0ac1 total 64 drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin drwxr-xr-x 2 root root 4096 Apr 10 2014 boot drwxr-xr-x 5 root root 360 Apr 24 02:47 dev drwxr-xr-x 64 root root 4096 Apr 24 02:47 etc drwxr-xr-x 2 root root 4096 Apr 10 2014 home drwxr-xr-x 12 root root 4096 Mar 20 05:21 lib drwxr-xr-x 2 root root 4096 Mar 20 05:20 lib64 drwxr-xr-x 2 root root 4096 Mar 20 05:19 media drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt drwxr-xr-x 2 root root 4096 Mar 20 05:19 opt dr-xr-xr-x 386 root root 0 Apr 24 02:47 proc drwx------ 2 root root 4096 Mar 20 05:22 root drwxr-xr-x 7 root root 4096 Mar 20 05:21 run drwxr-xr-x 2 root root 4096 Apr 21 22:18 sbin drwxr-xr-x 2 root root 4096 Mar 20 05:19 srv dr-xr-xr-x 13 root root 0 Apr 24 02:47 sys drwxrwxrwt 2 root root 4096 Mar 20 05:22 tmp drwxr-xr-x 11 root root 4096 Apr 21 22:18 usr drwxr-xr-x 12 root root 4096 Apr 21 22:18 var
加了 /etc/fstab 參數便會覆蓋原有的 -l 參數:
命令 # docker run 89dc7e6d0ac1 /etc/fstab /etc/fstab
EXPOSE
EXPOSE
例如 EXPOSE 80 3306,開放 80 和 3306 端口。
WORKDIR
WORKDIR /path/to/work/dir 配合 RUN,CMD,ENTRYPOINT 命令設置當前工作路徑。
可以設置多次,如果是相對路徑,則相對前一個 WORKDIR 命令。默認路徑為/。
例如:
FROM ubuntu WORKDIR /etc WORKDIR .. WORKDIR usr WORKDIR lib ENTRYPOINT pwd
docker run ID 得到的結果為:/usr/lib
USER
USER
VLOUME
VOLUME ["/data"] 允許容器訪問容器的目錄、允許容器之間互相訪問目錄。
VOLUME 僅僅是允許將某一個目錄暴露在外面,更多的操作還需要依賴 Docker 命令實現。
ENV
參考 export 的用法咧:
ENV LC_ALL en_US.UTF-8
Dockerfile 的寫法已經講述完畢,來看示例:
實例一
mkdir static_web cd static_web touch Dockerfile 然后 vi Dockerfile 開始編輯該文件 輸入 i 開始編輯 FROM nginx MAINTAINER yumengzhong "760042201@qq.com" ENV REFRESHED_AT 2017-03-03 RUN echo "hello, /usr/share/nginx/html/index.html 編輯完后 按 esc 退出編輯 然后 :wq 寫入 退出
補充
:q! 強行退出(不存盤)
:wq 強制性寫入文件并退出。即使文件沒有被修改也強制寫入,并更新文件的修改時間。
:x 寫入文件并退出。僅當文件被修改時才寫入,并更新文件修改時間,否則不會更新文件修改時間。
用ESC鍵只能切換到命令狀態
:x 和 :wq 的真正區別
:wq 強制性寫入文件并退出。即使文件沒有被修改也強制寫入,并更新文件的修改時間。
:x 寫入文件并退出。僅當文件被修改時才寫入,并更新文件修改時間,否則不會更新文件修改時間。
這兩者一般情況下沒什么不一樣,但是在編程方面,對編輯源文件可能會產生重要影響。因為文件即使沒有修改,:wq 強制更新文件的修改時間,這樣會讓 make 編譯整個項目時以為文件被修改過了,然后就得重新編譯鏈接生成可執行文件。這可能會產生讓人誤解的后果,當然也產生了不必要的系統資源花銷。
docker build -t yumengzhong/nginx_web:v1 .
-t是為新鏡像設置倉庫和名稱,其中yumengzhong為倉庫名,nginx_web為鏡像名,:v1為標簽(不添加為默認latest)
docker run --name nginx_web -d -p 82:80 yumengzhong/nginx_web:v1
游覽器 192.168.99.100:82或localhost:82
實例二
#Dockerfile FROM centos6-base #指定centos6系統 MAINTAINER zhou_mfk11.升級Docker#我抄的他的 Dockerfile RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key #創建私鑰 RUN sed "s@sessions*requireds*pam_loginuid.so@session optional pam_loginuid.so@g" -i /etc/pam.d/sshd #修復SSH登錄,否則登陸后的用戶會被秒退。 RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh #創建root用戶的ssh文件夾 EXPOSE 22 #開放端口 RUN echo "root:redhat" | chpasswd #root用戶改密碼為redhat RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 RUN yum install tar gzip gcc vim wget screen -y #安裝epel和安裝一些軟件 ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 #系統環境變量 CMD ["/usr/sbin/sshd", "-D"] #啟動sshd #End
如果想升級到最新版的Docker,就用 apt-get:
$ apt-get upgrade docker-engine12.卸載Docker
$ apt-get purge docker-engine $ apt-get autoremove # 自動刪除依賴 $ rm -rf /var/lib/docker參考&引用
1.Docker學習與和應用系列
2.Flux7 Docker 系列教程
3.Docker 實踐系列
4.我的Docker筆記(補全ing)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26796.html
摘要:本文從定義,作用,技術架構,安裝和使用等全方位帶你看懂。最后,于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的標準化部署流程。顯示上圖內容就表明安裝完成。 作者丨唐文廣:騰訊工程師,負責無線研發部地圖測試。 導語:Docker,近兩年才流行起來的超輕量級虛擬機,它可以讓你輕松完成持續集成、自動交付、自動部署,并且實現開發環境、測試環...
摘要:的核心是以容器為中心的管理環境。命名空間提供了名稱范圍。換句話說,確保或同類組始終可用。用于管理有狀態應用程序,它管理一組的部署和擴展,并提供有關這些的排序和唯一性的保證。 條分縷析帶你充分理解Kubernetes的各個細節與部分:它是什么,它如何解決容器編排問題,它包含哪些你必須掌握的關鍵對象,以及如何快速上手部署使用Kubernetes。 showImg(https://segme...
摘要:導讀本文由及聯合創始人梁勝博士寫于前往參加之前。從各家容器編排方案均很不成熟的初期,到三足鼎立的編排之戰,到如今似已全面勝利,作為整個發展歷程的參與者與見證者,回顧這幾年容器領域發展和的發展與選擇,梁勝博士分享了他的一些看法。 導讀 本文由Rancher Labs CEO及聯合創始人梁勝博士寫于前往參加DockerCon之前。從各家容器編排方案均很不成熟的初期,到三足鼎立的編排之戰,到...
閱讀 3203·2021-09-06 15:02
閱讀 2248·2019-08-30 15:48
閱讀 3446·2019-08-29 11:08
閱讀 3289·2019-08-26 13:55
閱讀 2448·2019-08-26 13:35
閱讀 3166·2019-08-26 12:11
閱讀 2602·2019-08-26 11:48
閱讀 888·2019-08-26 11:42