Docker使用(2)

runoob-docker教程

命令小结

// 运行一个docker
[root@VM_0_7_centos hitchhiker]# docker run ubuntu:15.10 /bin/echo "Hello world"
// 停止容器
docker stop 容器ID或容器名称
// 启动容器
docker start 容器id或容器名称
// 重新启动容器
docker restart 容器id或容器名称
// 查询最后一次创建的容器
docker ps -l
// 我们可以使用 docker rm 命令来删除不需要的容器
docker rm 容器id或容器名称
// 运行交互式的容器【-t:在新容器内指定一个伪终端或终端。-i:允许你对容器内的标准输入 (STDIN) 进行交互。】
[root@VM_0_7_centos hitchhiker]# docker run -i -t ubuntu:15.10 /bin/bash
// 启动容器(后台模式)
[root@VM_0_7_centos hitchhiker]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
// 查看日志【-f:可选, 让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。】
docker logs -f 容器ID或容器名称
// 查看命令的使用
docker command --help
// 载入镜像并运行它【-d:让容器在后台运行。-P:将容器内部使用的网络端口映射到我们使用的主机上。】
runoob@runoob:~# docker pull training/webapp  # 载入镜像【当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。】
runoob@runoob:~# docker run -d -P training/webapp python app.py
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
可以指定容器绑定的网络地址,比如绑定127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

// 容器的端口映射
docker port 容器id或名称
// docker port 命令可以让我们快捷地查看端口的绑定情况。
docker port 容器id或容器名称 容器端口(不是本机端口)
// 查看容器内部运行的进程
docker top 容器id或名称
// 使用 `docker inspect 容器id或名称` 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect 容器id或名称
// 列出镜像列表
docker images
// 查找镜像
docker search 镜像名
// 更新镜像【通过命令 docker commit来提交容器副本。】
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
【-m:提交的描述信息, -a:指定镜像作者, e218edb10161:容器ID, runoob/ubuntu:v2:指定要创建的目标镜像名】
// 构建镜像
1. vim Dockerfile
2. docker build -t runoob/centos:6.7 .【-t :指定要创建的目标镜像名】
// 设置镜像标签, 我们可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag 860c279d2fec runoob/centos:dev
// 容器命名, 当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:
docker run -d -P --name runoob training/webapp python app.py

docker使用

Docker Hello World

Docker Hello World

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

输出 Hello world

[root@VM_0_7_centos hitchhiker]# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
Trying to pull repository docker.io/library/ubuntu ... 
15.10: Pulling from docker.io/library/ubuntu
7dcf5a444392: Pull complete 
759aa75f3cee: Pull complete 
3fa871dc8a2b: Pull complete 
224c42ae46e7: Pull complete 
Digest: sha256:cc767eb612212f9f5f06cd1f4e0821d781a5f83bc24d1182128a1088907d3825
Status: Downloaded newer image for docker.io/ubuntu:15.10
Hello world

各个参数解析:

  • docker: Docker 的二进制执行文件。

  • run:与前面的 docker 组合来运行一个容器。

  • ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  • /bin/echo "Hello world": 在启动的容器里执行的命令

以上命令完整的意思可以解释为:Dockerubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现 "对话" 的能力

[root@VM_0_7_centos hitchhiker]# docker run -i -t ubuntu:15.10 /bin/bash
root@f170a17caf1f:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f170a17caf1f:/# cat /proc/version
Linux version 3.10.0-514.26.2.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 15:04:05 UTC 2017
root@f170a17caf1f:/# 

各个参数解析:

  • -t:在新容器内指定一个伪终端或终端。

  • -i:允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10系统的容器

我们尝试在容器中运行命令 cat /proc/versionls 分别查看当前系统的版本信息和当前目录下的文件列表

我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

[root@VM_0_7_centos hitchhiker]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
9b34d5ca1d2dc51160eaf1bda610b765ee922e2b58532972480fcdaf3cd84615

在输出中,我们没有看到期望的 "hello world",而是一串长字符

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

这个长字符串叫做 容器ID,对每个容器来说都是唯一的,我们可以通过 容器ID 来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看

[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9b34d5ca1d2d        ubuntu:15.10        "/bin/sh -c 'while..."   51 seconds ago      Up 51 seconds                           kickass_goldwasser
  • CONTAINER ID:容器ID

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

在容器内使用 docker logs 容器ID或容器名称 命令,查看容器内的标准输出

[root@VM_0_7_centos hitchhiker]# docker logs 9b34d5ca1d2d
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

或者

[root@VM_0_7_centos hitchhiker]# docker logs kickass_goldwasser
hello world
hello world
hello world
hello world
hello world
hello world
hello world

停止容器

我们使用 docker stop 容器ID或容器名称 命令来停止容器:

[root@VM_0_7_centos hitchhiker]# docker stop kickass_goldwasser
kickass_goldwasser

通过 docker ps 查看,容器已经停止工作:

Docker 容器使用

Docker 客户端

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

[root@VM_0_7_centos hitchhiker]# docker

Usage:  docker COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -D, --debug              Enable debug mode
      --help               Print usage
  -H, --host list          Daemon socket(s) to connect to (default [])
  -l, --log-level string   Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes

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

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

[root@VM_0_7_centos hitchhiker]# docker stats --help

Usage:  docker stats [OPTIONS] [CONTAINER...]

Display a live stream of container(s) resource usage statistics

Options:
  -a, --all             Show all containers (default shows just running)
      --format string   Pretty-print images using a Go template
      --help            Print usage
      --no-stream       Disable streaming stats and only pull the first result

运行一个web应用

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

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

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

[root@VM_0_7_centos hitchhiker]# docker pull training/webapp # 载入镜像
Using default tag: latest
Trying to pull repository docker.io/training/webapp ... 
latest: Pulling from docker.io/training/webapp
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for docker.io/training/webapp:latest

[root@VM_0_7_centos hitchhiker]# docker run -d -P training/webapp python app.py
6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118

参数说明:

-d:让容器在后台运行。

-P:将容器内部使用的网络端口映射到我们使用的主机上。

查看 WEB 应用容器

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

[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                    NAMES
6d22d16d383b        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:1024->5000/tcp   festive_williams

这里多了端口信息。

PORTS
0.0.0.0:1024->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 1024 上。

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

[root@VM_0_7_centos hitchhiker]# docker run -d -p 8080:5000 training/webapp python app.py
73075bcba2c93d739f5db57c735985217ee4fed5624a195a1afa1b8c78b93806
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     8 seconds ago       Up 8 seconds        0.0.0.0:8080->5000/tcp   compassionate_carson
6d22d16d383b        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:1024->5000/tcp   festive_williams

容器内部的 5000 端口映射到我们本地主机的 1024 端口上。

网络端口的快捷方式

通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式:docker port ,使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。

上面我们创建的web应用容器ID为:6d22d16d383b, 名字为:festive_williams

[root@VM_0_7_centos hitchhiker]# docker port 6d22d16d383b
5000/tcp -> 0.0.0.0:1024
[root@VM_0_7_centos hitchhiker]# docker port festive_williams
5000/tcp -> 0.0.0.0:1024

查看WEB应用程序日志

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

[root@VM_0_7_centos hitchhiker]# docker logs 6d22d16d383b
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[root@VM_0_7_centos hitchhiker]# docker logs festive_williams
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[root@VM_0_7_centos hitchhiker]# docker logs -f compassionate_carson
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
36.24.24.126 - - [16/Apr/2018 09:10:26] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:10:26] "GET /favicon.ico HTTP/1.1" 404 -
36.24.24.126 - - [16/Apr/2018 09:14:38] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:14:45] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:15:20] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:15:22] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:00] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:09] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:10] "GET / HTTP/1.1" 200 -

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

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

查看WEB应用程序容器的进程

我们还可以使用 docker top 容器id或容器名称 来查看容器内部运行的进程

[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     14 minutes ago      Up 14 minutes       0.0.0.0:8080->5000/tcp   compassionate_carson
6d22d16d383b        training/webapp     "python app.py"     19 minutes ago      Up 19 minutes       0.0.0.0:1024->5000/tcp   festive_williams
[root@VM_0_7_centos hitchhiker]# docker top 73075bcba2c9
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                20161               20146               0                   17:09               ?                   00:00:00            python app.py

检查WEB应用程序

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

[root@VM_0_7_centos hitchhiker]# docker inspect 73075bcba2c9
[
    {
        "Id": "73075bcba2c93d739f5db57c735985217ee4fed5624a195a1afa1b8c78b93806",
        "Created": "2018-04-16T09:09:31.512411201Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 20161,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-04-16T09:09:31.793624639Z",

停止WEB应用容器

docker stop id或名称
[root@VM_0_7_centos hitchhiker]# docker stop 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     17 minutes ago      Up 17 minutes       0.0.0.0:8080->5000/tcp   compassionate_carson

重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 容器id或容器名称 来启动。

[root@VM_0_7_centos hitchhiker]# docker start 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     18 minutes ago      Up 18 minutes       0.0.0.0:8080->5000/tcp   compassionate_carson
6d22d16d383b        training/webapp     "python app.py"     23 minutes ago      Up 2 seconds        0.0.0.0:1025->5000/tcp   festive_williams

docker ps -l 查询最后一次创建的容器:

[root@VM_0_7_centos hitchhiker]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     19 minutes ago      Up 19 minutes       0.0.0.0:8080->5000/tcp   compassionate_carson

正在运行的容器,我们可以使用 docker restart 命令来重启

移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73075bcba2c9        training/webapp     "python app.py"     20 minutes ago      Up 20 minutes       0.0.0.0:8080->5000/tcp   compassionate_carson
6d22d16d383b        training/webapp     "python app.py"     25 minutes ago      Up About a minute   0.0.0.0:1025->5000/tcp   festive_williams
[root@VM_0_7_centos hitchhiker]# docker rm 6d22d16d383b
Error response from daemon: You cannot remove a running container 6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118. Stop the container before attempting removal or use -f
[root@VM_0_7_centos hitchhiker]# docker stop 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker rm 6d22d16d383b
6d22d16d383b

删除容器时,容器必须是停止状态,否则会报如下错误

Error response from daemon: You cannot remove a running container 6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118. Stop the container before attempting removal or use -f

Docker 镜像使用

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

下面我们来学习:

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

列出镜像列表

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

[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                         5.7                 5195076672a7        4 weeks ago         371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn   v0.10               62db6828e252        4 weeks ago         1.23 GB
docker.io/brookshi/hitchhiker                           v0.10               ef0575e6ef11        4 weeks ago         1.23 GB
docker.io/ubuntu                                        15.10               9b9cb95443b5        21 months ago       137 MB
docker.io/training/webapp                               latest              6fae60ef3446        2 years ago         349 MB

各个选项说明:

  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

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

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

[root@VM_0_7_centos hitchhiker]# docker run -t -i ubuntu:15.10 /bin/bash 
root@36b35bf2e140:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@36b35bf2e140:/# 

如果要使用版本为 14.04ubuntu 系统镜像来运行容器时,命令如下:

runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash 
root@39e968165990:/# 

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

获取一个新的镜像

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

[root@VM_0_7_centos hitchhiker]# docker pull ubuntu:13.10
Trying to pull repository docker.io/library/ubuntu ... 
13.10: Pulling from docker.io/library/ubuntu
a3ed95caeb02: Pull complete 
0d8710fc57fd: Pull complete 
5037c5cd623d: Pull complete 
83b53423b49f: Pull complete 
e9e8bd3b94ab: Pull complete 
7db00e6b6e5e: Pull complete 
Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Status: Downloaded newer image for docker.io/ubuntu:13.10
[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                         5.7                 5195076672a7        4 weeks ago         371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn   v0.10               62db6828e252        4 weeks ago         1.23 GB
docker.io/brookshi/hitchhiker                           v0.10               ef0575e6ef11        4 weeks ago         1.23 GB
docker.io/ubuntu                                        15.10               9b9cb95443b5        21 months ago       137 MB
docker.io/training/webapp                               latest              6fae60ef3446        2 years ago         349 MB
docker.io/ubuntu                                        13.10               7f020f7bf345        3 years ago         185 MB

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

查找镜像

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

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

[root@VM_0_7_centos hitchhiker]# docker search httpd
INDEX       NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/httpd                                   The Apache HTTP Server Project                  1634      [OK]       
docker.io   docker.io/hypriot/rpi-busybox-httpd               Raspberry Pi compatible Docker Image with ...   40                   
docker.io   docker.io/centos/httpd                                                                            16                   [OK]
docker.io   docker.io/centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or b...   10                   
docker.io   docker.io/armhf/httpd                             The Apache HTTP Server Project                  8                    
docker.io   docker.io/macadmins/netboot-httpd                 use in combination with bruienne/bsdpy          5

NAME:镜像仓库源的名称

DESCRIPTION:镜像的描述

OFFICIAL:是否docker官方发布

拖取镜像

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

[root@VM_0_7_centos hitchhiker]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ... 
latest: Pulling from docker.io/library/nginx
2a72cbf407d6: Already exists 
04b2d3302d48: Pull complete 
e7f619103861: Pull complete 
Digest: sha256:cb29ee85b234f356fb8a77d8cfb78b42355f7f016f528f11a2a5f75e4862dc94
Status: Downloaded newer image for docker.io/nginx:latest

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

[root@VM_0_7_centos hitchhiker]# docker run nginx

创建镜像

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

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

更新镜像

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

[root@VM_0_7_centos hitchhiker]# clear
[root@VM_0_7_centos hitchhiker]# docker run -t -i ubuntu:15.10 /bin/bash
root@e814ae819a90:/# 

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

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

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

[root@VM_0_7_centos hitchhiker]# docker commit -m="has update" -a="runoob" e814ae819a90 runoob/ubuntu:v2
sha256:4ddf6452c51c387cd9abc646a7af348fc6d0e471089d93b196cf2413f8a3745c

各个参数说明:

-m:提交的描述信息

-a:指定镜像作者

e814ae819a90:容器ID

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

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

[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED              SIZE
runoob/ubuntu                                           v2                  4ddf6452c51c        About a minute ago   137 MB
docker.io/nginx                                         latest              b175e7467d66        5 days ago           109 MB
docker.io/mysql                                         5.7                 5195076672a7        4 weeks ago          371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn   v0.10               62db6828e252        4 weeks ago          1.23 GB
docker.io/brookshi/hitchhiker                           v0.10               ef0575e6ef11        4 weeks ago          1.23 GB
docker.io/ubuntu                                        15.10               9b9cb95443b5        21 months ago        137 MB
docker.io/training/webapp                               latest              6fae60ef3446        2 years ago          349 MB
docker.io/ubuntu                                        13.10               7f020f7bf345        3 years ago          185 MB

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

[root@VM_0_7_centos hitchhiker]# docker run -t -i runoob/ubuntu:v2 /bin/bash      
root@ab5a15935316:/# 

构建镜像

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

runoob@runoob:~$ cat Dockerfile 【我用的是vim Dockerfile】
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条 FROM,指定使用哪个 镜像源

RUN 指令告诉 docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

[root@VM_0_7_centos thc_centos]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 2.048 kB
Step 1/9 : FROM centos:6.7
Trying to pull repository docker.io/library/centos ... 
6.7: Pulling from docker.io/library/centos
cbddbc0189a0: Pull complete 
Digest: sha256:b86f16d7a194c5c8777e61ab9e3b16b99ca4d813bad2d60bfc796b3272a81f28
Status: Downloaded newer image for docker.io/centos:6.7
 ---> 000c5746fa52
Step 2/9 : MAINTAINER Fisher "[email protected]"
 ---> Running in c9e1de831dd4
 ---> 6f0bee29af17
Removing intermediate container c9e1de831dd4
Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Running in b6b880b9a47a

 ---> 9b4edf7fb8db
Removing intermediate container b6b880b9a47a
Step 4/9 : RUN useradd runoob
 ---> Running in 0a7995dad3f1

 ---> 4d2e48b4ebd7
Removing intermediate container 0a7995dad3f1
Step 5/9 : RUN /bin/echo 'runoob:123456' |chpasswd
 ---> Running in e77f07b9e24f

 ---> 2ebfb340d365
Removing intermediate container e77f07b9e24f
Step 6/9 : RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
 ---> Running in fccc927a063a

 ---> ff2afaa09964
Removing intermediate container fccc927a063a
Step 7/9 : EXPOSE 22
 ---> Running in debbde879624
 ---> 95c2e54679df
Removing intermediate container debbde879624
Step 8/9 : EXPOSE 80
 ---> Running in e159594226d3
 ---> cc959b4e6293
Removing intermediate container e159594226d3
Step 9/9 : CMD /usr/sbin/sshd -D
 ---> Running in 155b08becbc6
 ---> 796850755210
Removing intermediate container 155b08becbc6
Successfully built 796850755210

参数说明:

-t :指定要创建的目标镜像名

.Dockerfile 文件所在目录,可以指定 Dockerfile 的绝对路径

使用 docker images 查看创建的镜像已经在列表中存在, 镜像ID796850755210

[root@VM_0_7_centos thc_centos]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
runoob/centos                                           6.7                 796850755210        25 seconds ago      191 MB
runoob/ubuntu                                           v2                  4ddf6452c51c        45 minutes ago      137 MB
docker.io/nginx                                         latest              b175e7467d66        5 days ago          109 MB
docker.io/mysql                                         5.7                 5195076672a7        4 weeks ago         371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn   v0.10               62db6828e252        4 weeks ago         1.23 GB
docker.io/brookshi/hitchhiker                           v0.10               ef0575e6ef11        4 weeks ago         1.23 GB
docker.io/centos                                        6.7                 000c5746fa52        5 months ago        191 MB
docker.io/ubuntu                                        15.10               9b9cb95443b5        21 months ago       137 MB
docker.io/training/webapp                               latest              6fae60ef3446        2 years ago         349 MB
docker.io/ubuntu                                        13.10               7f020f7bf345        3 years ago         185 MB

我们可以使用新的镜像来创建容器

[root@VM_0_7_centos thc_centos]# docker run -t -i runoob/centos:6.7  /bin/bash
[root@9bb9da37385f /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)

从上面看到新镜像已经包含我们创建的用户 runoob

设置镜像标签

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

docker tag 796850755210 runoob/centos:dev

docker tag 镜像ID,这里是 796850755210, 用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为 796850755210 的镜像多一个标签。

[root@VM_0_7_centos thc_centos]# docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
runoob/centos                                           6.7                 796850755210        4 minutes ago       191 MB
runoob/centos                                           dev                 796850755210        4 minutes ago       191 MB
runoob/ubuntu                                           v2                  4ddf6452c51c        49 minutes ago      137 MB
docker.io/nginx                                         latest              b175e7467d66        5 days ago          109 MB
docker.io/mysql                                         5.7                 5195076672a7        4 weeks ago         371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn   v0.10               62db6828e252        4 weeks ago         1.23 GB
docker.io/brookshi/hitchhiker                           v0.10               ef0575e6ef11        4 weeks ago         1.23 GB
docker.io/centos                                        6.7                 000c5746fa52        5 months ago        191 MB
docker.io/ubuntu                                        15.10               9b9cb95443b5        21 months ago       137 MB
docker.io/training/webapp                               latest              6fae60ef3446        2 years ago         349 MB
docker.io/ubuntu                                        13.10               7f020f7bf345        3 years ago         185 MB

Docker 容器连接

前面我们实现了通过网络端口来访问运行在docker容器内的服务。下面我们来实现通过端口连接到一个docker容器

网络端口映射

我们创建了一个 python 应用的容器。

[root@VM_0_7_centos thc_centos]# docker run -d -P training/webapp python app.py
51e5d2b856934b6c05bed2550f80b614ba44763fd8975c334f85d51ee15c422b

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1

我们使用 -P 参数创建一个容器,使用 docker ps 来看到端口 5000 绑定主机端口 1026

[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED              STATUS              PORTS                                              NAMES
51e5d2b85693        training/webapp                                               "python app.py"          About a minute ago   Up About a minute   0.0.0.0:1026->5000/tcp                             musing_ride
ccc2e67c4f3d        nginx                                                         "nginx -g 'daemon ..."   4 hours ago          Up 4 hours          80/tcp                                             goofy_hamilton
a1b4a3793088        registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10   "pm2-docker index.js"    5 hours ago          Up 5 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp   hitchhiker
92e926a4c155        mysql:5.7                                                     "docker-entrypoint..."   7 hours ago          Up 5 hours          3306/tcp                                           hitchhiker-mysql

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
[root@VM_0_7_centos thc_centos]# docker run -d -p 5000:5000 training/webapp python app.py
093c9f50b7f4043ad5ab26425aa1aa7a3947a76ab509723c8ffc3eafd13e8814
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS                                              NAMES
093c9f50b7f4        training/webapp                                               "python app.py"          21 seconds ago      Up 20 seconds       0.0.0.0:5000->5000/tcp                             dazzling_lichterman
51e5d2b85693        training/webapp                                               "python app.py"          4 minutes ago       Up 4 minutes        0.0.0.0:1026->5000/tcp                             musing_ride
ccc2e67c4f3d        nginx                                                         "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          80/tcp                                             goofy_hamilton
a1b4a3793088        registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10   "pm2-docker index.js"    5 hours ago         Up 5 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp   hitchhiker
92e926a4c155        mysql:5.7                                                     "docker-entrypoint..."   7 hours ago         Up 5 hours          3306/tcp                                           hitchhiker-mysql

另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。

[root@VM_0_7_centos thc_centos]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
f1c597ecfb6d3321398c67d550a3d05faa9a716dc7275e058743c0bb69726427
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS                                              NAMES
f1c597ecfb6d        training/webapp                                               "python app.py"          19 seconds ago      Up 19 seconds       127.0.0.1:5001->5000/tcp                           priceless_shirley
093c9f50b7f4        training/webapp                                               "python app.py"          7 minutes ago       Up 7 minutes        0.0.0.0:5000->5000/tcp                             dazzling_lichterman
51e5d2b85693        training/webapp                                               "python app.py"          11 minutes ago      Up 11 minutes       0.0.0.0:1026->5000/tcp                             musing_ride
ccc2e67c4f3d        nginx                                                         "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          80/tcp                                             goofy_hamilton
a1b4a3793088        registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10   "pm2-docker index.js"    5 hours ago         Up 5 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp   hitchhiker
92e926a4c155        mysql:5.7                                                     "docker-entrypoint..."   7 hours ago         Up 5 hours          3306/tcp                                           hitchhiker-mysql

这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

[root@VM_0_7_centos thc_centos]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
a70b1bd118fea81bad26e749e99ba00c72d17499711e2a6490a22bfb26ec7259
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED              STATUS              PORTS                                              NAMES
a70b1bd118fe        training/webapp                                               "python app.py"          6 seconds ago        Up 5 seconds        5000/tcp, 127.0.0.1:5000->5000/udp                 epic_borg
f1c597ecfb6d        training/webapp                                               "python app.py"          About a minute ago   Up About a minute   127.0.0.1:5001->5000/tcp                           priceless_shirley
093c9f50b7f4        training/webapp                                               "python app.py"          9 minutes ago        Up 9 minutes        0.0.0.0:5000->5000/tcp                             dazzling_lichterman
51e5d2b85693        training/webapp                                               "python app.py"          13 minutes ago       Up 13 minutes       0.0.0.0:1026->5000/tcp                             musing_ride
ccc2e67c4f3d        nginx                                                         "nginx -g 'daemon ..."   4 hours ago          Up 4 hours          80/tcp                                             goofy_hamilton
a1b4a3793088        registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10   "pm2-docker index.js"    5 hours ago          Up 5 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp   hitchhiker
92e926a4c155        mysql:5.7                                                     "docker-entrypoint..."   7 hours ago          Up 5 hours          3306/tcp                                           hitchhiker-mysql
[root@VM_0_7_centos thc_centos]# 

docker port 命令可以让我们快捷地查看端口的绑定情况。

[root@VM_0_7_centos thc_centos]# docker port f1c597ecfb6d 5000【容器端口(不是本机端口)】
127.0.0.1:5001

Docker容器连接

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

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

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

容器命名

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

[root@VM_0_7_centos thc_centos]# docker run -d -P --name runoob training/webapp python app.py
86e39f43ad910866e62e4964ae97171ff691818b0e07bb58600569aec9a6e03e
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS                                              NAMES
86e39f43ad91        training/webapp                                               "python app.py"          4 seconds ago       Up 3 seconds        0.0.0.0:1027->5000/tcp                             runoob
a70b1bd118fe        training/webapp                                               "python app.py"          3 minutes ago       Up 3 minutes        5000/tcp, 127.0.0.1:5000->5000/udp                 epic_borg
f1c597ecfb6d        training/webapp                                               "python app.py"          5 minutes ago       Up 5 minutes        127.0.0.1:5001->5000/tcp                           priceless_shirley
093c9f50b7f4        training/webapp                                               "python app.py"          12 minutes ago      Up 12 minutes       0.0.0.0:5000->5000/tcp                             dazzling_lichterman
51e5d2b85693        training/webapp                                               "python app.py"          16 minutes ago      Up 16 minutes       0.0.0.0:1026->5000/tcp                             musing_ride
ccc2e67c4f3d        nginx                                                         "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          80/tcp                                             goofy_hamilton
a1b4a3793088        registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10   "pm2-docker index.js"    5 hours ago         Up 5 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp   hitchhiker
92e926a4c155        mysql:5.7                                                     "docker-entrypoint..."   7 hours ago         Up 5 hours          3306/tcp                                           hitchhiker-mysql

你可能感兴趣的:(Docker使用(2))