GitBook Docker —— 從入門到實踐
一張圖總結(jié) Docker 的命令
運行容器
sudo docker run -ti ubuntu:14.04 /bin/bash
14.04
是tag始藕,用于區(qū)分框往,不指定時默認使用latest
tag信息
啟動后attache進容器耸携,運行/bin/bash
-t
選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上文判, -i
則讓容器的標準輸入保持打開绘闷。加上-d
表示后臺運行物赶。
docker ps
和docker logs [container ID or NAMES]
查看運行容器和日志
運行時白指,后臺執(zhí)行的標準操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創(chuàng)建并啟動一個容器
- 分配一個文件系統(tǒng)酵紫,并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執(zhí)行用戶指定的應用程序
- 執(zhí)行完畢后容器被終止
進入容器
docker attach
或 nsenter 工具告嘲。
*注意:當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示奖地。當某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了橄唬。
終止容器
可以使用 docker stop
來終止一個運行中的容器。
此外参歹,當Docker容器中指定的應用終結(jié)時仰楚,容器也自動終止。 例如對于上一章節(jié)中只啟動了一個終端的容器犬庇,用戶通過 exit 命令或 Ctrl+d 來退出終端時僧界,所創(chuàng)建的容器立刻終止.
啟動已終止容器
可以利用 docker start
命令,直接將一個已經(jīng)終止的容器啟動運行臭挽∥娼螅或者docker restart
重啟容器。
輕量級的虛擬化
容器的核心為所執(zhí)行的應用程序欢峰,所需要的資源都是應用程序運行所必需的葬荷。除此之外涨共,并沒有其它的資源〕桎觯可以在偽終端中利用 ps
或 top
來查看進程信息举反。
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
根據(jù)當前dockerfile創(chuàng)建鏡像
commit
的方式容易創(chuàng)建鏡像但不利于分享,于是用Dockerfile
FROM pdr2.qa:5043/debug/tomcat6
ADD xxxx.conf /usr/local/tomcat/conf/xxxx.conf
# 聽云Server探針的運行和配置文件添加到tomcat根目錄
# catalina.sh里加入了-javaagent參數(shù)用于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
# 設(shè)置Java環(huán)境變量
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
指定鏡像基礎(chǔ),RUN
后的命令會在創(chuàng)建過程中執(zhí)行
ADD 命令復制本地文件到鏡像懦铺;用 EXPOSE 命令來向外部開放端口捉貌;用 CMD 命令來描述容器啟動后運行的程序等。
CMD
也可以寫成這樣的格式CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
docker build -t tomcat6-tingyun . # 用當前路徑下的dockerfile創(chuàng)建鏡像
docker images #查看鏡像
docker tag f358d5297fb7 pdr2.qa:5043/debug/tomcat6-tingyun #將鏡像重命名
docker push pdr2.qa:5043/debug/tomcat6-tingyun # 推到遠程
Dockfile 中的指令被一條一條的執(zhí)行冬念。每一步都創(chuàng)建了一個新的容器趁窃,在容器中執(zhí)行指令并提交修改(就跟之前介紹過的 docker commit 一樣)。當所有的指令都執(zhí)行完畢之后急前,返回了最終的鏡像 id醒陆。所有的中間步驟所產(chǎn)生的容器都被刪除和清理了。
*注意:一個鏡像不能超過 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
這將導入鏡像以及其相關(guān)的元數(shù)據(jù)信息(包括標簽等)刨摩。
移除本地鏡像
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版本后包含。 如果系統(tǒng)中 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 權(quán)限沐祷。 很不幸嚷闭,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誊册,并將內(nèi)容放到 .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
可以進入容器或直接在容器內(nèi)執(zhí)行命令君旦。
$ 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