docker应用

docker应用

docker简介

fei2636 2018-02-27 10:55:20 61903 收藏 103

Docker 是一个开源项目,为开发者和系统管理员提供了一个开放的平台,在任何地方通过打包和运行应用程序作为一个轻量级的容器。Docker 在软件容器内自动部署应用程序。Docker 最开始由 Solomon Hykes 作为 dotCloud 一个内部开发项目,一个企业级的 PaaS (platform as a service 服务平台),该软件现在由 Docker 社区和 Docker 公司维护,更多 Docker 信息你可以访问:https://docs.docker.com/。
我们可以通过 Docker 官方提供的 KVM 与 Docker 的图片更加形象的知道什么是 Dock:
在这里插入图片描述
安装 Docker 所需条件:需要 64 位架构的系统和Linux 3.10 内核或更高版本。

Docker Images

Docker image 是 Docker container 最基本的模板。image 通用容器使系统和应用易于安装,Docker image 是用来运行的容器,你可以找到许多 images (多种操作系统和软件已经被安装好了的 Docker)在这里 https://hub.docker.com/.

Docker Container

Docker 容器(Docker Container)是一个 Image,在运行的 Docker image 上读取和写入。Docker 是一个联合的文件系统作为容器后台,容器的任何变化,都将被保存在一个基本 image 新的层上。我们安装应用程序的层就是容器。每个在主机机上运行的容器都是独立的,因此,提供了一个安全的应用平台。

Docker Registry

Docker registry 是为 Docker images 提供的库。它提供了公共和私有库。公共 Docker 库被叫做 Docker Hub。这里我们能够上传 push 和 pull 我们自己的 images.

Ubuntu 安装Docker

在安装之前我们需要检查 kernel 版本和操作系统架构。运行命令:

uname -a

卸载旧版本

sudo apt-get remove docker docker-engine docker.io containerd runc

/var/lib/docker的内容,包括镜像、容器、卷和网络,可以保留也可以删除。

执行之后,输入docker --version仍能看到docker版本

采用另一种方式:

sudo apt-get purge docker

sudo apt-get purge docker-ce

sudo apt-get remove -y docker-*

sudo rm -rf /var/lib/docker(慎重:这是镜像和容器的默认存储位置,不要误删)

安装 Docker

#配置阿里云的gpg

sudo apt-get install gnupg

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

#配置阿里云的docker镜像,这里的[arch=armhf]根据自己的ubuntu版本

sudo add-apt-repository “deb [arch=armhf] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable”

#更新

sudo apt-get update

#执行安装命令

sudo apt-get install docker-cedocker

等待安装完毕,现在我们使用下面的命令启动 Docker:

systemctl start docker

运行系统引导时启用 docker,命令:

systemctl enable docker

你可能想核对一下 docker 版本:

docker version

Docker安装 image

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

查看本地镜像列表

docker images

各个选项说明:

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。注意使用镜像的时候用带标签的名字。所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

docker run -t -i ubuntu:15.10 /bin/bash

root@d77ccb2e5cca:/#

查找镜像

可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

也可以使用 docker search 命令来搜索镜像。比如我们需要一个 ubuntu 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 ubuntu 来寻找适合我们的镜像。

docker search ubuntu

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

拖取镜像

我们决定使用上图中的 ubuntu官方版本的镜像,使用命令 docker pull 来下载镜像。

docker pull ubuntu

下载完成后,我们就可以使用这个镜像了。

删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 ubuntu 镜像:

docker rmi -f ubuntu #-f 强制删除

创建自己的镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

先按照第3节下载基础镜像到本地。

从已经创建的容器中更新镜像,并且提交这个镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash

root@e218edb10161:/#

在运行的容器内使用 apt-get update 命令进行更新。或者安装一些软件等。

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

runoob@runoob:~$ docker commit -m=“has update” -a=“runoob” e218edb10161 runoob/ubuntu:v2

sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:

-m: 提交的描述信息

-a: 指定镜像作者

e218edb10161:容器 ID

runoob/ubuntu:v2: 指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:

runoob@runoob:~$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

runoob/ubuntu v2 70bf1840fd7c 15 seconds ago 158.5 MB

ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB

使用我们的新镜像 runoob/ubuntu 来启动一个容器

runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash

root@1a9fbdeb5da3:/#

使用 Dockerfile 指令来创建一个新的镜像

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

简单实例:使用 Dockerfile 定制镜像

下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

(1) 编写Dockerfile文件

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

FROM nginx

RUN echo ‘这是一个本地构建的nginx镜像’ > /usr/share/nginx/html/index.html

FROM 和 RUN 指令的作用:

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:RUN [“可执行文件”, “参数1”, “参数2”]

# 例如:

# RUN ["./test.php", “dev”, “offline”] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的RUN指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos

RUN yum install wget

RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"

RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos

RUN yum install wget \

&& wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz” \

&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

(2) 开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。

$ docker build -t nginx:v3 .

以上显示,说明已经构建成功。

(3) 上下文路径

$ docker build -t nginx:v3 .

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

**解析:**由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

**注意:**上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

Dockerfile的书写规则及指令使用方法

garyond 简书

Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

(1) **FROM(指定基础image)**构建指令

必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。

该指令有两种格式:

**FROM <image> #**指定基础image为该image的最后修改的版本。或者:

**FROM <image>:<tag> #**指定基础image为该image的一个tag版本。

(2) **MAINTAINER(用来指定镜像创建者信息)**构建指令

用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。

指令格式:

MAINTAINER <name>

(3) RUN(安装软件用)构建指令

RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。

RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。

层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。

RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。

指令格式:

RUN <command> (the command is run in a shell - /bin/sh -c)

RUN [“executable”, “param1”, “param2” … ] (exec form)

注意:Dockerfile 的RUN指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

(4) CMD(设置container启动时执行的操作)设置指令

用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。

该指令有三种格式:

CMD [“executable”,“param1”,“param2”] (like an exec, this is the preferred form)

CMD command param1 param2 (as a shell)

当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:

CMD [“param1”,“param2”] (as default parameters to ENTRYPOINT)

ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1和param2作为参数执行。所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT。

(5) ENTRYPOINT(设置container启动时执行的操作)设置指令

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",…]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx

ENTRYPOINT [“nginx”, “-c”] # 定参

CMD ["/etc/nginx/nginx.conf"] # 变参

1、不传参运行

$ docker run nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

(6) USER(设置container容器的用户)设置指令

设置启动容器的用户,默认是root用户。

# 指定memcached的运行用户

ENTRYPOINT [“memcached”]

USER daemon

ENTRYPOINT [“memcached”, “-u”, “daemon”]

(7) EXPOSE(指定容器需要映射到宿主机器的端口)设置指令

仅仅只是声明端口。

该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

指令格式:

EXPOSE <port> [<port>…]

# 映射一个端口

EXPOSE port1

# 相应的运行容器使用的命令

docker run -p port1 image

# 映射多个端口

EXPOSE port1 port2 port3

# 相应的运行容器使用的命令

docker run -p port1 -p port2 -p port3 image

# 还可以指定需要映射到宿主机器上的某个端口号

docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image

端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。

(8) ENV(用于设置环境变量)设置指令

ENV指令可以用于为docker容器设置环境变量

ENV设置的环境变量,可以使用docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。

格式:

ENV <key> <value>

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。

假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:

ENV JAVA_HOME /path/to/java/dirent

(9) ADD(从src复制文件到container的dest路径)构建指令

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

格式:

ADD <src> <dest>

<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;

<dest> 是container中的绝对路径

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

**ADD 的优点:**在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

**ADD 的缺点:**在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

(10) VOLUME (指定挂载点) 设置指令

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

Volume设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

格式:

VOLUME ["<mountpoint>"]

例如:

FROM base

VOLUME ["/tmp/data"]

运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动一个容器:

docker run -t -i -rm -volumes-from container1 image2 bash

说明:container1为第一个容器的ID,image2为第二个容器运行image的名字。

(11) WORKDIR(切换目录)设置指令

可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。

格式:

WORKDIR /path/to/workdir

示例:

# 在 /p1/p2 下执行 vim a.txt

WORKDIR /p1

WORKDIR p2

RUN vim a.txt

(12) ONBUILD(在子镜像中执行)

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

格式:

ONBUILD <Dockerfile关键字>

(13) COPY(复制本地主机的src文件为container的dest)

复制本地主机的src文件(为Dockerfile所在目录的相对路径、文件或目录 )到container的dest。目标路径不存在时,会自动创建。

格式:

COPY <src> <dest>

当使用本地目录为源目录时,推荐使用COPY

(14) ARG(设置构建镜像时变量) 构建参数

与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

格式:

ARG <参数名>[=<默认值>]ABEL(定义标签)

(15) HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令

HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

(16) ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格式:

ONBUILD <其它指令>

(17) LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。

语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> …

比如我们可以添加镜像的作者:

LABEL org.opencontainers.image.authors=“runoob”

Dckerfile示例

示例1:构建Wordpress + nginx运行环境
在这里插入图片描述在这里插入图片描述
示例2:构建Ruby on Rails环境
在这里插入图片描述

示例3: 构建Nginx运行环境
在这里插入图片描述
示例4:构建Postgres镜像
在这里插入图片描述

创建Dockerfile,构建运行环境

(1) Dockerfile文件

# 指定基于的基础镜像

FROM ubuntu:13.10

# 维护者信息

MAINTAINER zhangjiayang “zhangjiayang@sczq.com.cn”

# 镜像的指令操作

# 获取APT更新的资源列表

RUN echo “deb http://archive.ubuntu.com/ubuntu precise main universe”> /etc/apt/sources.list

# 更新软件

RUN apt-get update

RUN apt-get -y install curl # Install curl

RUN cd /tmp && curl -L ‘http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz’ -H ‘Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile’ | tar -xz # Install JDK 7

RUN mkdir -p /usr/lib/jvm

RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/

RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300

RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300 # Set Oracle JDK 7 as default Java

# 设置系统环境

ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/

# Install tomcat7

RUN cd /tmp && curl -L ‘http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz’ | tar -xz

RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/

ENV CATALINA_HOME /opt/tomcat7

ENV PATH $PATH:$CATALINA_HOME/bin

# 复件tomcat7.sh到容器中的文件

ADD tomcat7.sh /etc/init.d/tomcat7

RUN chmod 755 /etc/init.d/tomcat7

# Expose ports. 指定暴露的端口

EXPOSE 8080

# Define default command.

ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out

(2) tomcat7.sh命令文件

export JAVA_HOME=/usr/lib/jvm/java-7-oracle/

export TOMCAT_HOME=/opt/tomcat7

case $1 in

start)

sh $TOMCAT_HOME/bin/startup.sh

;;

stop)

sh $TOMCAT_HOME/bin/shutdown.sh

;;

restart)

sh $TOMCAT_HOME/bin/shutdown.sh

sh $TOMCAT_HOME/bin/startup.sh

;;

esac

exit 0

(3) 构建镜像、启动容器

根据配置完的dockerfile构建Docker镜像,并启动docker容器。

docker build -t wechat-tomcat.

docker run -d -p 8090:8080 wechat-tomcat

默认情况下,tomcat会占用8080端口,所以在启动container的时候,指定了 -p 8090:8080,映射到宿主机端口就是8090。

Dockerfile最佳实践

(1) 使用.dockerignore文件

为了在docker build过程中更快上传和更加高效,应该使用一个.dockerignore文件用来排除构建镜像时不需要的文件或目录。例如,除非.git在构建过程中需要用到,否则你应该将它添加到.dockerignore文件中,这样可以节省很多时间。

(2) 避免安装不必要的软件包

为了降低复杂性、依赖性、文件大小以及构建时间,应该避免安装额外的或不必要的包。例如,不需要在一个数据库镜像中安装一个文本编辑器。

(3) 每个容器都跑一个进程

在大多数情况下,一个容器应该只单独跑一个程序。解耦应用到多个容器使其更容易横向扩展和重用。如果一个服务依赖另外一个服务,可以参考 Linking Containers Together。

(4) 最小化层

我们知道每执行一个指令,都会有一次镜像的提交,镜像是分层的结构,对于 Dockerfile,应该找到可读性和最小化层之间的平衡。

(5) 多行参数排序

如果可能,通过字母顺序来排序,这样可以避免安装包的重复并且更容易更新列表,另外可读性也会更强,添加一个空行使用 \ 换行:

RUN apt-get update && apt-get install -y \

bzr \

cvs \

git \

mercurial \

subversion

(6) 创建缓存

镜像构建过程中会按照 Dockerfile 的顺序依次执行,每执行一次指令 Docker 会寻找是否有存在的镜像缓存可复用,如果没有则创建新的镜像。如果不想使用缓存,则可以在docker build 时添加–no-cache=true选项。

从基础镜像开始就已经在缓存中了,下一个指令会对比所有的子镜像寻找是否执行相同的指令,如果没有则缓存失效。在大多数情况下只对比 Dockerfile 指令和子镜像就足够了。ADD 和 COPY 指令除外,执行 ADD 和 COPY 时存放到镜像的文件也是需要检查的,完成一个文件的校验之后再利用这个校验在缓存中查找,如果检测的文件改变则缓存失效。RUN apt-get -y update命令只检查命令是否匹配,如果匹配就不会再执行更新了。

为了有效地利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改。

Docker 容器互联

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py

43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 命令来查看容器名称。

runoob@runoob:~$ docker ps -l

CONTAINER ID IMAGE COMMAND … PORTS NAMES

43780a6eabaa training/webapp “python app.py” … 0.0.0.0:32769->5000/tcp runoob

新建网络

下面先创建一个新的 Docker 网络。

$ docker network create -d bridge test-net

参数说明:

-d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

连接容器

运行一个容器并连接到新建的 test-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

apt-get update-get update

apt install iputils-ping-ping

这样,test1 容器和 test2 容器建立了互联关系。

如果你有多个容器之间需要互相连接,推荐使用 Docker Compose,后面会介绍。

配置 DNS

我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{

“dns” : [“dns” : [

“114.114.114.114”,“114.114.114.114”,

"8.8.8.8"“8.8.8.8”

]]

}}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

配置完,需要重启 docker 才能生效。

查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

$ docker run -it --rm ubuntu cat etc/resolv.conf

手动指定容器的配置

如果只想在指定的容器设置 DNS,则可以使用以下命令:

$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

–rm:容器退出时自动清理容器内部的文件系统。

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

docker命令

容器生命周期管理:

Docker run 命令

docker run :创建一个新的容器并运行一个命令

(1) 语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

–name=“nginx-lb”: 为容器指定一个名称;

–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h “mars”: 指定容器的hostname;

-e username=“ritchie”: 设置环境变量;

–env-file=[]: 从指定文件读入环境变量;

–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

–link=[]: 添加链接到另一个容器;

–expose=[]: 开放一个端口或一组端口;

–volume , -v: 绑定一个卷,文件夹映射

(2) 实例

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

docker run -P -d nginx:latest

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

runoob@runoob:~$ docker run -it nginx:latest /bin/bash

root@b8573233d675:/#

Docker start/stop/restart 命令

docker start :启动一个或多个已经被停止的容器

docker stop :停止一个运行中的容器

docker restart :重启容器

(1) 语法

docker start [OPTIONS] CONTAINER [CONTAINER…]

docker stop [OPTIONS] CONTAINER [CONTAINER…]

docker restart [OPTIONS] CONTAINER [CONTAINER…]

(2) 实例

启动已被停止的容器myrunoob

docker start myrunoob

停止运行中的容器myrunoob

docker stop myrunoob

重启容器myrunoob

docker restart myrunoob

Docker kill 命令

docker kill :杀掉一个运行中的容器。

(1) 语法

docker kill [OPTIONS] CONTAINER [CONTAINER…]

OPTIONS说明:

-s :向容器发送一个信号

(2) 实例

杀掉运行中的容器mynginx

runoob@runoob:~$ docker kill -s KILL mynginx

mynginx

Docker rm 命令

docker rm :删除一个或多个容器。

(1) 语法

docker rm [OPTIONS] CONTAINER [CONTAINER…]

OPTIONS说明:

-f :通过 SIGKILL 信号强制删除一个运行中的容器。

-l :移除容器间的网络连接,而非容器本身。

-v :删除与容器关联的卷。

(2) 实例

强制删除容器 db01、db02:

docker rm -f db01 db02

移除容器 nginx01 对容器 db01 的连接,连接名 db:

docker rm -l db

删除容器 nginx01, 并删除容器挂载的数据卷:

docker rm -v nginx01

删除所有已经停止的容器:

docker rm $(docker ps -a -q)

Docker pause/unpause 命令

docker pause :暂停容器中所有的进程。

docker unpause :恢复容器中所有的进程。

(1) 语法

docker pause CONTAINER [CONTAINER…]

docker unpause CONTAINER [CONTAINER…]

(2) 实例

暂停数据库容器db01提供服务。

docker pause db01

恢复数据库容器 db01 提供服务。

docker unpause db01

Docker create 命令

docker create :创建一个新的容器但不启动它

用法同 docker run

(1) 语法

docker create [OPTIONS] IMAGE [COMMAND] [ARG…]

语法同 docker run

(2) 实例

使用docker镜像nginx:latest创建一个容器,并将容器命名为myrunoob

runoob@runoob:~$ docker create --name myrunoob nginx:latest

09b93464c2f75b7b69f83d56a9cfc23ceb50a48a9db7652ee4c27e3e2cb1961f

Docker exec 命令

docker exec :在运行的容器中执行命令

(1) 语法

docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

OPTIONS说明:

-d :分离模式: 在后台运行

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端

(2) 实例

在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

runoob@runoob:~$ docker exec -it mynginx /bin/sh /root/runoob.sh

在容器 mynginx 中开启一个交互模式的终端:

runoob@runoob:~$ docker exec -i -t mynginx /bin/bash

root@b1a0703e41e7:/#

也可以通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID 进入容器。

查看已经在运行的容器 ID:

# docker ps -a

9df70f9a0714 openjdk “/usercode/script.sh…”

第一列的 9df70f9a0714 就是容器 ID。

通过 exec 命令对指定的容器执行 bash:

# docker exec -it 9df70f9a0714 /bin/bash

容器操作:

Docker ps 命令

docker ps : 列出容器

(1) 语法

docker ps [OPTIONS]

OPTIONS说明:

-a :显示所有的容器,包括未运行的。

-f |–filter:根据条件过滤显示的内容。

–format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

–no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。

(2) 实例

列出所有在运行的容器信息。

runoob@runoob:~$ docker ps

CONTAINER ID IMAGE COMMAND … PORTS NAMES

09b93464c2f7 nginx:latest “nginx -g 'daemon off” … 80/tcp, 443/tcp myrunoob

96f7f14e99ab mysql:5.6 “docker-entrypoint.sh” … 0.0.0.0:3306->3306/tcp mymysql

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

created(已创建)

restarting(重启中)

running(运行中)

removing(迁移中)

paused(暂停)

exited(停止)

dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

Docker inspect 命令

docker inspect : 获取容器/镜像的元数据。

(1) 语法

docker inspect [OPTIONS] NAME|ID [NAME|ID…]

OPTIONS说明:

-f :指定返回值的模板文件。

-s :显示总的文件大小。

–type :为指定类型返回JSON。

(2) 实例

获取镜像mysql:5.6的元信息。

runoob@runoob:~$ docker inspect mysql:5.6

[

{

“Id”: “sha256:2c0964ec182ae9a045f866bbc2553087f6e42bfc16074a74fb820af235f070ec”,

“RepoTags”: [

“mysql:5.6”

],

“RepoDigests”: [],

“Parent”: “”,

“Comment”: “”,

“Created”: “2016-05-24T04:01:41.168371815Z”,

“Container”: “e0924bc460ff97787f34610115e9363e6363b30b8efa406e28eb495ab199ca54”,

“ContainerConfig”: {

“Hostname”: “b0cf605c7757”,

“Domainname”: “”,

“User”: “”,

“AttachStdin”: false,

“AttachStdout”: false,

“AttachStderr”: false,

“ExposedPorts”: {

“3306/tcp”: {}

},

获取正在运行的容器mymysql的 IP。

runoob@runoob:~$ docker inspect --format=’{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ mymysql

172.17.0.3

Docker top 命令

docker top :查看容器中运行的进程信息,支持 ps 命令参数。

(1) 语法

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。

(2) 实例

查看容器mymysql的进程信息。

runoob@runoob:~/mysql$ docker top mymysql

UID PID PPID C STIME TTY TIME CMD

999 40347 40331 18 00:58 ? 00:00:02 mysqld

查看所有运行容器的进程信息。

for i in `docker ps |grep Up|awk ‘{print $1}’`;do echo \ &&docker top $i; done

Docker attach 命令

docker attach :连接到正在运行中的容器。

(1) 语法

docker attach [OPTIONS] CONTAINER

要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。

(2) 实例

容器mynginx将访问日志指到标准输出,连接到容器查看访问信息。

runoob@runoob:~$ docker attach --sig-proxy=false mynginx

192.168.239.1 - - [10/Jul/2016:16:54:26 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36” “-”

Docker events 命令

docker events : 从服务器获取实时事件

(1) 语法

docker events [OPTIONS]

OPTIONS说明:

-f :根据条件过滤事件;

–since :从指定的时间戳后显示所有事件;

–until :流水时间显示到指定的时间为止;

(2) 实例

如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如–since=“2016-07-01”。

Docker logs 命令

docker logs : 获取容器的日志

(1) 语法

docker logs [OPTIONS] CONTAINER

OPTIONS说明:

-f : 跟踪日志输出

–since :显示某个开始时间的所有日志

-t : 显示时间戳

–tail :仅列出最新N条容器日志

(2) 实例

跟踪查看容器mynginx的日志输出。

docker wait : 阻塞运行直到容器停止,然后打印出它的退出代码。

语法

docker wait [OPTIONS] CONTAINER [CONTAINER…]

实例

docker wait CONTAINER

Docker export 命令

docker export :将文件系统作为一个tar归档文件导出到STDOUT。

(1) 语法

docker export [OPTIONS] CONTAINER

OPTIONS说明:

-o :将输入内容写到文件。

(2) 实例

将id为a404c6c174a2的容器按日期保存为tar文件。

runoob@runoob:~$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2

runoob@runoob:~$ ls mysql-`date +%Y%m%d`.tar

mysql-20160711.tar

Docker port 命令

docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。

语法

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

实例

查看容器mynginx的端口映射情况。

runoob@runoob:~$ docker port mymysql

3306/tcp -> 0.0.0.0:3306

容器rootfs命令:

Docker commit 命令

docker commit :从容器创建一个新的镜像。

(1) 语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停。

(2) 实例

将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。

runoob@runoob:~$ docker commit -a “runoob.com” -m “my apache” a404c6c174a2 mymysql:v1

sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057

runoob@runoob:~$ docker images mymysql:v1

REPOSITORY TAG IMAGE ID CREATED SIZE

mymysql v1 37af1236adef 15 seconds ago 329 MB

Docker cp 命令

docker cp :用于容器与主机之间的数据拷贝。

(1) 语法

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS说明:

-L :保持源目标中的链接

(2) 实例

将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。

docker cp /www/runoob 96f7f14e99ab:/www/

将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。

docker cp /www/runoob 96f7f14e99ab:/www

将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。

docker cp 96f7f14e99ab:/www /tmp/

Docker diff 命令

docker diff : 检查容器里文件结构的更改。

语法

docker diff [OPTIONS] CONTAINER

实例

查看容器mymysql的文件结构更改。

runoob@runoob:~$ docker diff mymysql

A /logs

A /mysql_data

C /run

C /run/mysqld

A /run/mysqld/mysqld.pid

A /run/mysqld/mysqld.sock

C /tmp

镜像仓库:

Docker login/logout 镜像仓库命令

docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

(1) 语法

docker login [OPTIONS] [SERVER]

docker logout [OPTIONS] [SERVER]

OPTIONS说明:

-u :登陆的用户名

-p :登陆的密码

(2) 实例

登陆到Docker Hub

docker login -u 用户名 -p 密码

登出Docker Hub

docker logout

Docker push 命令

docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

语法

docker push [OPTIONS] NAME[:TAG]

OPTIONS说明:

–disable-content-trust :忽略镜像的校验,默认开启

实例

上传本地镜像myapache:v1到镜像仓库中。

docker push myapache:v1

Docker search 命令

docker search : 从Docker Hub查找镜像

(1) 语法

docker search [OPTIONS] TERM

OPTIONS说明:

–automated :只列出 automated build类型的镜像;

–no-trunc :显示完整的镜像描述;

-f <过滤条件>:列出收藏数不小于指定值的镜像。

(2) 实例

从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像

runoob@runoob:~$ docker search -f stars=10 java

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

java Java is a concurrent, class-based… 1037 [OK]

anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC … 115 [OK]

develar/java 46 [OK]

isuper/java-oracle This repository contains all java… 38 [OK]

lwieske/java-8 Oracle Java 8 Container - Full + … 27 [OK]

nimmis/java-centos This is docker images of CentOS 7… 13 [OK]

参数说明:

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

Docker pull 命令

docker pull : 从镜像仓库中拉取或者更新指定镜像

(1) 语法

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明:

-a :拉取所有 tagged 镜像

–disable-content-trust :忽略镜像的校验,默认开启

(2) 实例

从Docker Hub下载java最新版镜像。

docker pull java

从Docker Hub下载REPOSITORY为java的所有镜像。

docker pull -a java

本地镜像管理:

Docker images 命令

docker images : 列出本地镜像。

(1) 语法

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

–digests :显示镜像的摘要信息;

-f :显示满足条件的镜像;

–format :指定返回值的模板文件;

–no-trunc :显示完整的镜像信息;

-q :只显示镜像ID。

(2) 实例

查看本地镜像列表。

runoob@runoob:~$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mymysql v1 37af1236adef 5 minutes ago 329 MB

runoob/ubuntu v4 1c06aa18edee 2 days ago 142.1 MB

<none> <none> 5c6e1090e771 2 days ago 165.9 MB

httpd latest ed38aaffef30 11 days ago 195.1 MB

alpine latest 4e38e38c8ce0 2 weeks ago 4.799 MB

mongo 3.2 282fd552add6 3 weeks ago 336.1 MB

redis latest 4465e4bcad80 3 weeks ago 185.7 MB

php 5.6-fpm 025041cd3aa5 3 weeks ago 456.3 MB

python 3.5 045767ddf24a 3 weeks ago 684.1 MB

列出本地镜像中REPOSITORY为ubuntu的镜像列表。

root@runoob:~# docker images ubuntu

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu 14.04 90d5884b1ee0 9 weeks ago 188 MB

ubuntu 15.10 4e3b13c8a266 3 months ago 136.3 MB

Docker rmi 命令

docker rmi : 删除本地一个或多个镜像。

(1) 语法

docker rmi [OPTIONS] IMAGE [IMAGE…]

OPTIONS说明:

-f :强制删除;

–no-prune :不移除该镜像的过程镜像,默认移除;

(2) 实例

强制删除本地镜像 runoob/ubuntu:v4。

root@runoob:~# docker rmi -f runoob/ubuntu:v4

Untagged: runoob/ubuntu:v4

Deleted: sha256:1c06aa18edee44230f93a90a7d88139235de12cd4c089d41eed8419b503072be

Deleted: sha256:85feb446e89a28d58ee7d80ea5ce367eebb7cec70f0ec18aa4faa874cbd97c73

Docker tag 命令

docker tag : 标记本地镜像,将其归入某一仓库。

语法

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

实例

将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。

root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3

root@runoob:~# docker images runoob/ubuntu:v3

REPOSITORY TAG IMAGE ID CREATED SIZE

runoob/ubuntu v3 4e3b13c8a266 3 months ago 136.3 MB

Docker build 命令 Dockerfile

docker build 命令用于使用 Dockerfile 创建镜像。

(1) 语法

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

–build-arg=[] :设置镜像创建时的变量;

–cpu-shares :设置 cpu 使用权重;

–cpu-period :限制 CPU CFS周期;

–cpu-quota :限制 CPU CFS配额;

–cpuset-cpus :指定使用的CPU id;

–cpuset-mems :指定使用的内存 id;

–disable-content-trust :忽略校验,默认开启;

-f :指定要使用的Dockerfile路径;

–force-rm :设置镜像过程中删除中间容器;

–isolation :使用容器隔离技术;

–label=[] :设置镜像使用的元数据;

-m :设置内存最大值;

–memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;

–no-cache :创建镜像的过程不使用缓存;

–pull :尝试去更新镜像的新版本;

–quiet, -q :安静模式,成功后只输出镜像 ID;

–rm :设置镜像成功后删除中间容器;

–shm-size :设置/dev/shm的大小,默认值是64M;

–ulimit :Ulimit配置。

–squash :将 Dockerfile 中所有的操作压缩为一层。

–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

–network: 默认 default。在构建期间设置RUN指令的网络模式

(2) 实例

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。

docker build -t runoob/ubuntu:v1 .

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

docker build github.com/creack/docker-firefox

也可以通过 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .

在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:

$ docker build -t test/myapp .

Sending build context to Docker daemon 2.048 kB

Error response from daemon: Unknown instruction: RUNCMD

Docker history 命令

docker history : 查看指定镜像的创建历史。

(1) 语法

docker history [OPTIONS] IMAGE

OPTIONS说明:

-H :以可读的格式打印镜像大小和日期,默认为true;

–no-trunc :显示完整的提交记录;

-q :仅列出提交记录ID。

(2) 实例

查看本地镜像runoob/ubuntu:v3的创建历史。

root@runoob:~# docker history runoob/ubuntu:v3

IMAGE CREATED CREATED BY SIZE COMMENT

4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B

<missing> 3 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.863 kB

<missing> 3 months ago /bin/sh -c set -xe && echo ‘#!/bin/sh’ > /u 701 B

<missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB

Docker save 命令 tar打包

docker save : 将指定镜像保存成 tar 归档文件。

(1) 语法

docker save [OPTIONS] IMAGE [IMAGE…]

OPTIONS 说明:

-o :输出到的文件。

(2) 实例

将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

runoob@runoob:~$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

runoob@runoob:~$ ll my_ubuntu_v3.tar

-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.ta

Docker load 命令 tar导入

docker load : 导入使用 docker save 命令导出的镜像。

(1) 语法

docker load [OPTIONS]

OPTIONS 说明:

–input , -i : 指定导入的文件,代替 STDIN。

–quiet , -q : 精简输出信息。

(2) 实例

导入镜像:

$ docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE

$ docker load < busybox.tar.gz

Loaded image: busybox:latest

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

busybox latest 769b9341d937 7 weeks ago 2.489 MB

$ docker load --input fedora.tar

Loaded image: fedora:rawhide

Loaded image: fedora:20

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

busybox latest 769b9341d937 7 weeks ago 2.489 MB

fedora rawhide 0d20aec6529d 7 weeks ago 387 MB

fedora 20 58394af37342 7 weeks ago 385.5 MB

fedora heisenbug 58394af37342 7 weeks ago 385.5 MB

fedora latest 58394af37342 7 weeks ago 385.5 MB

Docker import 命令 tar导入创建

docker import : 从归档文件中创建镜像。

(1) 语法

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS说明:

-c :应用docker 指令创建镜像;

-m :提交时的说明文字;

(2) 实例

从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4

runoob@runoob:~$ docker import my_ubuntu_v3.tar runoob/ubuntu:v4

sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39

runoob@runoob:~$ docker images runoob/ubuntu:v4

REPOSITORY TAG IMAGE ID CREATED SIZE

runoob/ubuntu v4 63ce4a6d6bc3 20 seconds ago 142.1 MB

info|version:

Docker info 命令

docker info : 显示 Docker 系统信息,包括镜像和容器数。。

(1) 语法

docker info [OPTIONS]

(2) 实例

查看docker系统信息。

$ docker info

Containers: 12

Images: 41

Storage Driver: aufs

Root Dir: /var/lib/docker/aufs

Backing Filesystem: extfs

Dirs: 66

Dirperm1 Supported: false

Execution Driver: native-0.2

Logging Driver: json-file

Kernel Version: 3.13.0-32-generic

Operating System: Ubuntu 14.04.1 LTS

CPUs: 1

Total Memory: 1.954 GiB

Name: iZ23mtq8bs1Z

ID: M5N4:K6WN:PUNC:73ZN:AONJ:AUHL:KSYH:2JPI:CH3K:O4MK:6OCX:5OYW

Docker version 命令

docker version :显示 Docker 版本信息。

(1) 语法

docker version [OPTIONS]

OPTIONS说明:

-f :指定返回值的模板文件。

(2) 实例

显示 Docker 版本信息。
ZE

$ docker load < busybox.tar.gz

Loaded image: busybox:latest

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

busybox latest 769b9341d937 7 weeks ago 2.489 MB

$ docker load --input fedora.tar

Loaded image: fedora:rawhide

Loaded image: fedora:20

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

busybox latest 769b9341d937 7 weeks ago 2.489 MB

fedora rawhide 0d20aec6529d 7 weeks ago 387 MB

fedora 20 58394af37342 7 weeks ago 385.5 MB

fedora heisenbug 58394af37342 7 weeks ago 385.5 MB

fedora latest 58394af37342 7 weeks ago 385.5 MB

Docker import 命令 tar导入创建

docker import : 从归档文件中创建镜像。

(1) 语法

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS说明:

-c :应用docker 指令创建镜像;

-m :提交时的说明文字;

(2) 实例

从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为runoob/ubuntu:v4

runoob@runoob:~$ docker import my_ubuntu_v3.tar runoob/ubuntu:v4

sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39

runoob@runoob:~$ docker images runoob/ubuntu:v4

REPOSITORY TAG IMAGE ID CREATED SIZE

runoob/ubuntu v4 63ce4a6d6bc3 20 seconds ago 142.1 MB

info|version:

Docker info 命令

docker info : 显示 Docker 系统信息,包括镜像和容器数。。

(1) 语法

docker info [OPTIONS]

(2) 实例

查看docker系统信息。

$ docker info

Containers: 12

Images: 41

Storage Driver: aufs

Root Dir: /var/lib/docker/aufs

Backing Filesystem: extfs

Dirs: 66

Dirperm1 Supported: false

Execution Driver: native-0.2

Logging Driver: json-file

Kernel Version: 3.13.0-32-generic

Operating System: Ubuntu 14.04.1 LTS

CPUs: 1

Total Memory: 1.954 GiB

Name: iZ23mtq8bs1Z

ID: M5N4:K6WN:PUNC:73ZN:AONJ:AUHL:KSYH:2JPI:CH3K:O4MK:6OCX:5OYW

Docker version 命令

docker version :显示 Docker 版本信息。

(1) 语法

docker version [OPTIONS]

OPTIONS说明:

-f :指定返回值的模板文件。

(2) 实例

显示 Docker 版本信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种开源的容器化平台,可以帮助开发者将应用程序及其依赖项打包成一个独立的容器,实现应用程序的快速部署和跨平台运行。下面是Docker应用部署的一般步骤: 1. 安装Docker:首先需要在目标机器上安装Docker引擎,可以根据不同的操作系统选择相应的安装方式。 2. 编写Dockerfile:Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。在Dockerfile中,你可以指定基础镜像、安装依赖、复制文件、设置环境变量等。 3. 构建镜像:使用Docker命令行工具执行`docker build`命令,根据Dockerfile构建镜像。该命令会根据Dockerfile中的指令逐步执行,并生成一个可运行的镜像。 4. 运行容器:使用`docker run`命令来创建并运行一个容器。在运行容器时,可以指定端口映射、环境变量、数据卷等参数。 5. 配置网络:如果应用程序需要与其他容器或主机进行通信,可以使用Docker网络功能进行配置。可以选择使用默认的桥接网络,或者创建自定义网络。 6. 监控和管理:Docker提供了一系列命令和工具来监控和管理容器。例如,可以使用`docker ps`命令查看正在运行的容器,使用`docker logs`命令查看容器的日志。 7. 扩展和更新:如果需要扩展应用程序的规模或更新应用程序的版本,可以使用Docker Swarm或Kubernetes等容器编排工具来管理多个容器的部署和调度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值