第四章 使用Docker镜像和仓库(二)

回顾:

开始学习之前,我先pull下来ubuntu和fedora镜像

[#9#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull fedora

Using default tag: latest

latest: Pulling from library/fedora

9bdb5101e5fc: Pull complete

Digest: sha256:1fa98be10c550ffabde65246ed2df16be28dc896d6e370dab56b98460bd27823

Status: Downloaded newer image for fedora:latest

[#10#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull ubuntu

Using default tag: latest

latest: Pulling from library/ubuntu

ebe73f29e6e1: Pull complete

4976a0f2dc03: Pull complete

5c117067c385: Pull complete

001d664e2dd4: Pull complete

Digest: sha256:7eb6ad74ec4fbe56ac194d8760063c88ca362f05a9038f2bc4f09a51849a4a53

Status: Downloaded newer image for ubuntu:latest

4.5.6 Dockerfile 和构建缓存

想略过缓存功能,可以使用 docker build 的 --no-cache 标志

sudo docker build --no-cache -t="zhiyewang/static_web" .

4.5.7 基于构建缓存的 Dockerfile 模板

FROM ubuntu:14.04

MAINTAINER zhiyewang "zhiye_wang@yeah.net"

ENV REFRESHED_AT 2016-03-16

RUN apt-get -qq update

这里要想重新构建 Dockerfile ,只需要将第三行的日期修改以下即可。将会更新 APT 包的缓

存。

4.5.8 查看新镜像

查看镜像如何构建出来,可以使用 docker history 命令。可以看到新构建的 zhiyewang/stat

ic_web 镜像的每一层。以及创建这些层的 Dcoekrfile 命令。

4.5.9 从构建的新镜像启动容器

上一节成功使用 Dockerfile 命令构建出 zhiyewang/static_web 这个镜像。现在我们来试试

看镜像是否工作正常。z

基于新构建的镜像启动一个新容器。

[#17#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -d -p 80 --name stati

c_web zhiyewang/static_web nginx -g "daemon off;"

d4d9024c688d267761dee792e0b0686a6b2d06dcf53e656c98d95408f4894974

这条命令基于方才构建的镜像名字,启动了一个名为 static_web 的新容器。 同时指定了 -d 选

项,告诉 Docker 以分离的方式在后台运行。同时也指定了在新容器中运行的命令: nginx -g "

daemon off;"。这将以前台的方式启动 Nginx。新标志 -p 用来控制 Docker 在运行时应该公

开哪些网络端口给外部(宿主机)。

[#19#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker ps -l

CONTAINER ID        IMAGE                            COMMAND                           PORTS

d4d9024c688d        zhiyewang/static_web   "nginx -g 'daemon off"         0.0.0.0:32768->80/tcp

可以看到容器中的 80 端口被映射到宿主机的 32768 端口。

也可以使用 docker port 查看端口的情况

[#20#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker port d4d9024c688d

80/tcp -> 0.0.0.0:32768

这样的端口映射方式为随机的,我们也可以指定特定的端口映射

将容器的 80 端口绑定到本地宿主机的 80 端口

sudo docker run -d -p 80:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

将容器的 80 端口绑定到本地宿主机的 8080 端口

sudo docker run -d -p 8080:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

将容器的 80 端口绑定到本地宿主机的 127.0.0.1 这个 IP 的 80 端口

sudo docker run -d -p 127.0.0.1:80:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

将容器的 80 端口绑定到本地宿主机的 127.0.0.1 这个 IP 的随机端口

sudo docker run -d -p 127.0.0.1::80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

对外公开端口,此命令可以将容器内的 80 端口对本地宿主机公开,并且绑定要宿主机的一个

随机端口。此命令同时也会将 Dockerfile 文件中 EXPOSE 指令指定的其他端口一并公开。

sudo docker run -d -p --name static_web zhiyewang/static_web nginx -g "daemon off;"

这样我们就可以使用本地宿主机的 IP 地址或者 127.0.0.1 的 localhost 来连接到运行的容器,

查看 Web 服务器的内容了。

[#33#cloudsoar@cloudsoar-virtual-machine ~]$curl localhost:32768

Hi, I am in your container

4.5.10 Dockerfile 指令

1 CMD 指令

CMD 指令用于指定一个容器启动时候需要运行的指令。有点类似于 RUN 指令,区别是 RUN

指令是指定镜像被构建时候运行的指令,而 CMD 是容器被启动时运行的指令。

命令行启动容器的 /bin/true

[#34#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t zhiyewang/static_web /bin/true

可以使用 CMD 写在 Dockerfile 中:

CMD ["/bin/true"]

也可以为要运行的命令指定参数

CMD ["/bin/bash", "-l"]

需要注意的是 docker run 命令可以覆盖 CMD 指令。如果 dockerrun 中指定了命令,而CM

D 中也指定了相同的命令,命令行中的指令会覆盖 Dockerfile 中的 CMD 指令。

假设我们的 Dockerfile 中有如下命令

CMD [ "/bin/bash" ]

使用 docker build 命令构建一个新镜像,假设为 zhiyewang/test,并基于此镜像启动一个新

容器。

[#35#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -t -i zhiyewang/test

root@7ec0a03d41fc:/#

可以看到 docker run 命令的末尾并没有指定 /bin/bash 指令,却进入了容器的 bash。实际上

Docker 使用了 CMD 中指定的命令。

但是 Dockerfile 中只能指定一条 CMD 指令。如果制定多个,只有最后一个会被调用。

2 ENTRYPOINT

ENTRYPONIT 指令提供的命令不会再容器启动时被命令行覆盖。

ENTRYPONIT ["/usr/sbin/nginx"]

为 ENTRYPOINT 指定参数

ENTRYPONIT ["/usr/sbin/nginx", "-g", "daemon off;"]

如果需要 也可以在运行时通过 docker run 的 --entrypoint 标志覆盖 ENTRYPOINT 指令。

3 WORKDIR

WORKDIR /opt/webapp/db

RUN bundle install

WORKDIR /opt/webapp

ENTRYPOINT [ "rackup" ]

把目录切换到 /opt/webapp/db 指定了 bundle install 命令,然后又将工作目录切换为 /opt

/webapp 最后这只了 ENTRYPOINT 指令来启动 rackup 命令。

4 ENV

ENV 可以用来在镜像构建过程中设置环境变量

ENV RMV_PATH /home/rvm/

这个环境变量设置后在后续的任何 RUN 中都可以使用

也可以在其他指令中直接使用这些环境变量

RVM_PATH=/home/rvm/ gem install unicorn

ENV 创建的环境变量也会被持久保存到从我们的镜像创建的任何容器中。比如在容器中运行

env 查看:

root@7ec0a03d41fc:/# env

...

RVM_PATH=/home/rvm/

运行时环境变量

sudo docker run -ti -e  "WEB_PORT=8080" ubuntu env

可以讲容器的 WEB_PORT 环境变量设置为 8080

5 USER

user 指令用来指定该镜像会以什么样的用户去执行

USER nginx

我们可以指定用户名或者 UID 以及组或者 GID,甚至是两者的组合。也可以在 docker run 命

令中通过 -u 选项来覆盖该指令的值。如果不通过 USER 指定特定用户,默认是 root 。

6 VOLUME

VOLUME ["/opt/project"]

这条指令将会为基于此镜像创建的任何容器创建一个名为 /opt/projiect 的挂载点。也可以通过

数组的方式指定多个卷。

VOLUME ["/opt/project", "/data"]

7 ADD

ADD 命令用来将构建环境下的文件和目录复制到镜像中。也可以指定URL。Docker 通过目的地

址的参数末尾的字符来判断文件源是目录还是文件。如果目的地址以 / 结尾,Docker 认为是一个

目录,如果不是的话,认为是文件。

ADD http://wordpress.org/latest.zip /root/wordpress.zip

ADD 在处理本地的归档文件(包括 gzip,bzip2,xv)指定为源文件时候,会自动将归档解压。

ADD latest.tar.gz /var/www/wordpress/

8 COPY

COPY 和 ADD 的本质区别是 COPY 只关心在构建上下文中复制本地文件,而不会去做文件提

取和解压的工作。COPY 的文件源路径必须是一个与当前构建环境相对的文件或目录,本地文

件都放到和 Dockerfile 同一个目录下。不能复制该目录之外的任何文件。目的为止必须是容器

内部的一个绝对路径。该指令创建的文件或者目录的 UID 和 GID 都会被设置为 0 。

COPY conf.d/ /etc/apache2/

9 ONBUILD

4.6 将镜像退送到 Docker Hub

[#37#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker push zhiyewang/static_web

The push refers to a repository [docker.io/zhiyewang/static_web] (len: 1)

e97eb7ef0136: Pushed

6a7a53f6e78a: Pushed

ddc8935b098a: Pushed

40fa5cd1c3d2: Pushed

c5aed3a8ff95: Pushed

0b427fcc4cbb: Pushed

9d89fd8f8a3e: Pushed

073de23ee32b: Pushed

latest: digest: sha256:152eb2d70e0f795fbe1b8f8c9eea09e7832a8b01e953cc051cd07832732da0ed size: 14731

现在可以在 Docker Hub 上看到我们的镜像了。

自动构建

4.7 删除镜像

如果不需要一个镜像了 可以使用 docker rmi 来删除

[#41#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rmi zhiyewang/static_web

Error response from daemon: conflict: unable to remove repository reference "zhiyewang/static_web" (must force) - container 7ec0a03d41fc is using its referenced image e97eb7ef0136

Error: failed to remove images: [zhiyewang/static_web]

可以看到这个镜像被一个容器 7ec0a03d41fc 使用着,首先删除掉容器即可。

[#53#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rm 7ec0a03d41fc

7ec0a03d41fc

[#62#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rmi e97eb7ef0136

Deleted: e97eb7ef013619e503bd729596a06e46ee85786619d95950e54f5a74c6fc2694

Deleted: 6a7a53f6e78a802ea932a5914e63d217acf4a47ddbedb80dab042d55297573a5

Deleted: ddc8935b098a0b449a3335286b2b0e555b3d44bd5d92dea305c57f6f7c846fae

Deleted: 40fa5cd1c3d2ae9c80763e9b787c5c9b4848a34164fc2138d2c160830505466d

Deleted: c5aed3a8ff9508b42644cef59c2b44c249628c54130fa1a030f3f2b299124ecc

这里删除的是本地的镜像。每一个 Deleted: 行都代表一个镜像层被删除。

4.8 运行自己的 Docker Registry

这个可以自己试试了。

到此为止,第四章学习完毕。

下一篇学习在测试中使用 Docker,用Docker 测试一个静态网站,用 Docker 创建并测试一个

WEB 应用,用 Docker 用于持续集成。

第四章 使用Docker镜像和仓库(二)的更多相关文章

  1. 第四章 使用Docker镜像和仓库

    第4章 使用Docker镜像和仓库 回顾: 回顾如何使用 docker run 创建最基本的容器 $sudo docker run -i -t --name another_container_mum ...

  2. 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记

    docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...

  3. 《第一本Docker书》学习笔记——第4章 使用Docker镜像和仓库

    4.2 列出镜像 使用docker images命令: sudo docker images 本地镜像都保存在Docker宿主机的/var/lib/docker目录下. 也可以在/var/lib/do ...

  4. Docker镜像与仓库(二)Dockerfile

    Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...

  5. Docker基本命令与使用 —— Docker镜像与仓库(二)

    一.查看和删除镜像 1.Docker Image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount) (存储位置 /var/lib/docker) docker info 2.列 ...

  6. Docker之- 使用Docker 镜像和仓库

    目录 使用Docker 镜像和仓库 什么是 Docker 镜像 列出 Docker 镜像 tag 标签 Docker Hub 拉取镜像 查找镜像 构建镜像 创建Docker Hub 账号 使用 Doc ...

  7. Docker镜像的仓库及底层依赖的核心技术(3)

    一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...

  8. Docker镜像与仓库(一)

    Docker镜像与仓库(一) Docker镜像与仓库(一) 如何查找镜像? Docker Hub https://registry.hub.docker.com docker search [OPTI ...

  9. 04_Docker入门(下)之docker镜像和仓库的使用

    docker镜像和仓库 镜像介绍 docker镜像是由文件系统叠加而成的.最低端是一个引导文件系统,即bootfs.当一个容器启动后,它会将被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存以 ...

随机推荐

  1. 通过innobackupex实现对MySQL的完整备份与还原

    备份 新建一个用于存放备份的目录 mkdir /backup 执行以下命令: innobackupex --password=test /backup/ 执行完后你会看到“completed OK!” ...

  2. zookeeper dubbo 问题解决录

    问题1: 运行起来不报错,不过在Console没有zookeeper的心跳信息,也就是说没有配置上zookeeper,而出错的原因是下面蓝色这段解析不了 spring-dubbo-provider.x ...

  3. 初尝 JFinal 项目(二)

    这里以Roles角色表修改功能做一个例子 RolesController /** * 角色管理控制类 * @author 御手洗红豆 */public class RolesController ex ...

  4. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

  5. spring+junit单元测试

    <1>读取文件: 配置文件在classes下:locations = {"classpath*:/spring/applicationContext.xml"} 配置文 ...

  6. Python—函数的参数组合

    参数组合 在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数,这5种参数都可以组合使用.但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字 ...

  7. LDAP客户端

    LDAP客户端通过与服务端关联起来,就可以使用服务端的系统账号登录系统,通过useradd 添加用户是在ldap里是没有显示的,ldap添加用户,在/etc/passwd里也是没有显示的,ldap添加 ...

  8. js escape

    JS转义 escape().encodeURI().encodeURIComponent()区别详解 JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,e ...

  9. 修改Arduino串口缓冲区大小(转)

    本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区       在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...

  10. 比较两个NSDate类型的参数相差的时间差

    +(NSInteger)getDaysFrom:(NSDate *)serverDate To:(NSDate *)endDate { NSCalendar *gregorian = [[NSCale ...