Docker(二)--docker容器和镜像的使用

1.Docker容器的使用

1.1 Docker 客户端

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:docker stats --help

1.2 运行一个web应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

首先载入一个镜像training/webapp

再在容器上启动一个web应用

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口映射到我们使用的主机上。

1.3 查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器

这里我们发现在PORTS这一栏中多个信息0.0.0.0:32768->5000/tcp表示docker开放了5000端口到主机的32768上,现在我们可以使用http://localhost:32768来进行访问

我们也可以指定 -p 标识来绑定指定端口。

docker run -d -p 5000:5000 training/webapp python app.py

1.4 查看WEB应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

-f:dokcer logs 像使用tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

1.5 检查WEB应用程序

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

1.6 停止WEB应用容器,重启WEB应用容器,移除WEB应用容器

分别使用docker stop docker start docker rm

2.Docker镜像的使用

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

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

2.1 列出镜像列表

我们可以使用docker images来列出本机上的所有的镜像。

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

2.2 获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

下载完成后,我们可以直接使用这个镜像来运行容器。

2.3 查找镜像

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

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

  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否docker官方发布

2.4 创建镜像

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

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用 Dockerfile 指令来创建一个新的镜像

具体操作后期会详细讲解。

2.5 更新镜像

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

在运行的容器内使用 apt-get update 命令进行更新。

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

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

docker commit -m="has update" -a="wuqinghua" 5b3413d2e84a wuqinghua/ubuntu:v2

各个参数说明:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • 5b3413d2e84a:容器ID
  • wuqinghua/ubuntu:v2:指定要创建的目标镜像名

2.6 构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

2.6.1 Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

2.6.2 Dockerfile 语法
2.6.2.1 语法示例
1
2
3
4
5
6
7
8
Dockerfile语法由两部分构成,注释和命令+参数
# Line blocks used for commenting
command argument argument ..
一个简单的例子:
# Print "Hello docker!"
RUN echo "Hello docker!"
2.6.2.2 Dockerfile命令

Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。

  • ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

1
2
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
  • CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

1
2
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
  • ENTRYPOINT

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

1
2
3
4
5
6
7
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo
  • ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

1
2
Usage: ENV key value
ENV SERVER_WORKS 4
  • EXPOSE

EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

1
2
# Usage: EXPOSE [port]
EXPOSE 8080
  • FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

1
2
# Usage: FROM [image name]
FROM ubuntu
  • MAINTAINER

我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

1
2
# Usage: MAINTAINER [name]
MAINTAINER authors_name
  • RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

1
2
# Usage: RUN [command]
RUN aptitude install -y riak
  • USER

USER命令用于设置运行容器的UID。

1
2
# Usage: USER [UID]
USER 751
  • VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

1
2
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
  • WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

1
2
# Usage: WORKDIR /path
WORKDIR ~/
2.6.2.3 Docfile示例一:创建一个MongoDB镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 定义文件和它的目的
# 让阅读者明确Dockerfile的目的永远是必要的。为此,我们通常从注释开始写Dockerfile。
############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################
# 设置基础镜像
FROM ubuntu
# 设置作者
MAINTAINER WuQinghua
# 设置命令与参数下载MongoDB
################## BEGIN INSTALLATION ######################
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
RUN apt-get update
RUN apt-get install -y mongodb-10gen
RUN mkdir -p /data/db
##################### INSTALLATION END #####################
# 设置MongoDB端口
EXPOSE 27017
CMD ["--port 27017"]
ENTRYPOINT usr/bin/mongod
2.6.2.3 Docfile示例二:创建一个Nginx镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################
FROM ubuntu
# 设置作者
MAINTAINER WuQinghua
# Install Nginx
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nano wget dialog net-tools
RUN apt-get install -y nginx
# 安装Nginx后,我们需要配置Nginx并且替换掉默认的配置文件
RUN rm -v /etc/nginx/nginx.conf
ADD nginx.conf /etc/nginx/
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD service nginx start

需要在当前目录下含有一个nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
worker_processes 1;
events { worker_connections 1024; }
http {
sendfile on;
server {
listen 80;
location / {
proxy_pass http://httpstat.us/;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
2.7 设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。