Docker學習筆記

GitBook Docker —— 從入門到實踐

一張圖總結 Docker 的命令

一張圖總結 Docker 的命令

運行容器

sudo docker run -ti ubuntu:14.04 /bin/bash

14.04是tag,用于區分,不指定時默認使用latesttag信息
啟動后attache進容器,運行/bin/bash
-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上, -i則讓容器的標準輸入保持打開。加上-d表示后臺運行。
docker psdocker logs [container ID or NAMES]查看運行容器和日志

運行時,后臺執行的標準操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創建并啟動一個容器
  • 分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢后容器被終止

進入容器

docker attach或 nsenter 工具。
*注意:當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。

終止容器

可以使用 docker stop 來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。 例如對于上一章節中只啟動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創建的容器立刻終止.

啟動已終止容器

可以利用 docker start 命令,直接將一個已經終止的容器啟動運行?;蛘?code>docker restart重啟容器。

輕量級的虛擬化

容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源??梢栽趥谓K端中利用 pstop 來查看進程信息。

root@ba267838cc1b:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps

可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。

commit提交修改

可以在里面做一些更改,如
sudo apt-get install something
然后commit得到一個新的鏡像

sudo docker commit -m "I install a cool thing" -a "liuyc" 0b2616b0e5a8 ouruser/sinatra:v2

根據當前dockerfile創建鏡像

commit的方式容易創建鏡像但不利于分享,于是用Dockerfile

FROM pdr2.qa:5043/debug/tomcat6
ADD xxxx.conf /usr/local/tomcat/conf/xxxx.conf

# 聽云Server探針的運行和配置文件添加到tomcat根目錄
# catalina.sh里加入了-javaagent參數用于tomcat啟動時運行聽云探針
ADD tingyun  /usr/local/tomcat/tingyun
COPY catalina.sh /usr/local/tomcat/bin/catalina.sh

EXPOSE 8888
RUN /usr/bin/ssh-keygen -A
RUN echo 'root:oak' | chpasswd
EXPOSE 22

# 設置Java環境變量
ENV PATH ${PATH}:${JAVA_HOME}/bin/
ENV LANG en_US.UTF-8
# 將聽云證書添加到JDK證書中,詳情可見key.sh
ADD tingyunCert /tmp
WORKDIR /tmp
RUN sh key.sh

CMD  /usr/sbin/sshd && chmod +x /usr/local/tomcat/bin/catalina.sh &&  /usr/local/tomcat/bin/catalina.sh run

#注釋,FROM指定鏡像基礎,RUN后的命令會在創建過程中執行
ADD 命令復制本地文件到鏡像;用 EXPOSE 命令來向外部開放端口;用 CMD 命令來描述容器啟動后運行的程序等。
CMD也可以寫成這樣的格式CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

docker build -t tomcat6-tingyun .  # 用當前路徑下的dockerfile創建鏡像
docker images #查看鏡像
docker tag f358d5297fb7 pdr2.qa:5043/debug/tomcat6-tingyun  #將鏡像重命名
docker push pdr2.qa:5043/debug/tomcat6-tingyun # 推到遠程

Dockfile 中的指令被一條一條的執行。每一步都創建了一個新的容器,在容器中執行指令并提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執行完畢之后,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被刪除和清理了。
*注意:一個鏡像不能超過 127 層

從本地文件導入

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
docker images可以看到多了一個

存出鏡像

sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

載入鏡像

可以使用 docker load 從導出的本地文件中再導入到本地鏡像庫,例如
$ sudo docker load --input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar
這將導入鏡像以及其相關的元數據信息(包括標簽等)。

移除本地鏡像

docker rmi , 注意 docker rm 命令是移除容器
*注意:在刪除鏡像之前要先用 docker rm 刪掉依賴于這個鏡像的所有容器。

清理所有未打過標簽的本地鏡像

使用下面的命令可以清理所有未打過標簽的本地鏡像
$ sudo docker rmi $(docker images -q -f "dangling=true")
其中 -q 和 -f 是縮寫, 完整的命令其實可以寫著下面這樣,是不是更容易理解一點?
$ sudo docker rmi $(docker images --quiet --filter "dangling=true")

nsenter 命令

安裝

nsenter 工具在 util-linux 包2.23版本后包含。 如果系統中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝。

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin
使用

nsenter 可以訪問另一個進程的名字空間。nsenter 要正常工作需要有 root 權限。 很不幸,Ubuntu 14.04 仍然使用的是 util-linux 2.20。安裝最新版本的 util-linux(2.24)版,請按照以下步驟:

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin

為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通過這個 PID,就可以連接到這個容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
下面給出一個完整的例子。

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
$ PID=$(docker-pid 243c32535da7)
10981
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#

更簡單的,建議大家下載 .bashrc_docker,并將內容放到 .bashrc 中。

$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

這個文件中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以獲取某個容器的 PID;而 docker-enter 可以進入容器或直接在容器內執行命令。

$ echo $(docker-pid <container>)
$ docker-enter <container> ls

運行DockerUI

docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

打開 http://<dockerd host ip>:9000

DockerUI
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Docker 學習目標: 掌握Docker基礎知識,能夠理解Docker鏡像與容器的概念 完成Docker安裝與啟...
    執筆夢一場閱讀 3,309評論 2 10
  • 一基本概念 1. 什么是Docker ... 2. Docker的基本概念 鏡像(Image) 是一個只讀模板,用...
    wesper_428f閱讀 551評論 0 0
  • 近來發現docker越來越受歡迎了,而且看起來,docker的熱度還遠沒有到達頂峰,或許在這個云服務時代的大背景下...
    盡情的嘲笑我吧閱讀 533評論 0 5
  • 一、window系統下安裝 win7、win8 系統 win7、win8 等需要利用 docker toolbox...
    快樂程序員閱讀 1,049評論 0 1
  • 原文地址:LoveDev Docker相對于傳統意義上的虛擬機最大的區別就在于傳統虛擬機是虛擬出一套硬件后,再在上...
    KevinLive閱讀 3,772評論 3 7