第四章 使用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. sql语句_分页查询

    1.查询数据库中存在某一列名的表 use [db] go SELECT name FROM sysobjects WHERE id IN (SELECT id FROM syscolumns WHER ...

  2. memcached tomcat maven 学习记录

    2016.12.11 maven 快速搭建项目,只要有pom.xml文件配置好依赖 可以把项目切割(具体切割出来的块怎么用?) nginx 负载均衡  文件服务器 主要配置nginx.conf 文件 ...

  3. Jmeter循环控制

    Jmeter循环控制 很多时候,在做接口测试时,系统处理请求需要一段时间后才能返回信息,而下一个请求需要系统返回信息后才能进行处理,这时候通常需要加入循环控制器,来验证系统是否是否返回了处理后的信息. ...

  4. information_schema系列十二

    1: INNODB_SYS_VIRTUAL 表存储的是INNODB表的虚拟列的信息,当然这个还是比较简单的,我们直接通过SHOW CREATE TABLE 或者DESC TABLE就能看得到. Col ...

  5. pascal闪电入门系列目录

    第一章  准备工作 第二章  Hello,world! 第三章  输出.输入 第四章  变量常量.基本数据类型 第五章  格式.注释 第六章  运算符.表达式.优先级 第七章  分支结构 第八章  数 ...

  6. 安装Nexus

  7. unity3d 孤岛求生基础案例

    第二个案例,此案例主要实现了第一人称控制器,把移动从世界坐标系转化到人物平面坐标系,通过碰撞器,触发器,光线透射触发器实现交互.实现UI texture记录收集信息,ui texture是更新内容对应 ...

  8. Win7与Mint双系统安装体验

    双系统安装前的准备 1.安装前的准备 安装双系统可能会对磁盘文件带来一些影响,为了避免在安装过程中由于系统瘫痪造成不必要的损失,所以我们在准备安装双系统之前,要对PC机中的重要文件进行备份,对资料要做 ...

  9. Magento1.9批量修改产品 Attribute Set

    今天修改产品时遇到这样一个需求:重新设置产品的 Attribute Set,使用的是Magento1.9系统,Magento提供这样一个插件 Flagbit Change Attribute Set: ...

  10. 【面向对象版】HashMap(增删改查)

    前言: 关于什么是HashMap,HashMap可以用来做些什么,这些定义类的描述,请参照[简易版]HashMap(增删改查)的内容. 这章节主要是面向实例,直接进行HashMap(增删改查)的演示. ...