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 命令,直接将一个已经终止的容器启动运行。或者docker restart重启容器。

轻量级的虚拟化

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启...
    执笔梦一场阅读 3,176评论 2 10
  • 一基本概念 1. 什么是Docker ... 2. Docker的基本概念 镜像(Image) 是一个只读模板,用...
    wesper_428f阅读 510评论 0 0
  • 近来发现docker越来越受欢迎了,而且看起来,docker的热度还远没有到达顶峰,或许在这个云服务时代的大背景下...
    尽情的嘲笑我吧阅读 514评论 0 5
  • 一、window系统下安装 win7、win8 系统 win7、win8 等需要利用 docker toolbox...
    快乐程序员阅读 1,013评论 0 1
  • 原文地址:LoveDev Docker相对于传统意义上的虚拟机最大的区别就在于传统虚拟机是虚拟出一套硬件后,再在上...
    KevinLive阅读 3,740评论 3 7