美文网首页docker
Docker使用(2)

Docker使用(2)

作者: tianmac | 来源:发表于2018-04-23 17:40 被阅读83次

    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 (builder@kbuilder.dev.centos.org) (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 "fisher@sudops.com"
    
    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 "fisher@sudops.com"
     ---> 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)

        本文链接:https://www.haomeiwen.com/subject/faiekftx.html