zoukankan      html  css  js  c++  java
  • Title

    Docker Hello World

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

    输出Hello world

    tianbao@tianbao:~$ sudo docker run ubuntu:15.10 /bin/echo "Hello world"
    Hello world
    

    各个参数解析:

    • docker: Docker 的二进制执行文件。
    • run: 与前面的 docker 组合来运行一个容器。
    • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
    • /bin/echo "Hello world": 在启动的容器里执行的命令

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

    运行交互式的容器

    tianbao@tianbao:~$ sudo docker run -i -t ubuntu:15.10 /bin/bash
    root@5d21c20d6607:/# 
    

    各个参数解析:

    • -t: 在新容器内指定一个伪终端或终端。
    • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

    注意第二行 root@5d21c20d6607:/#,此时我们已进入一个 ubuntu15.10 系统的容器

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

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

    启动容器(后台模式)

    tianbao@tianbao:~$ sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    

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

    tianbao@tianbao:~$ sudo docker ps
    [sudo] password for tianbao: 
    CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
    2c7178a477b6        ubuntu:15.10                   "/bin/sh -c 'while t…"   2 minutes ago       Up 2 minutes                                 zen_bouman
    fd5dc8ae48c4        thespaghettidetective_tasks    "sh -c 'celery -A co…"   3 months ago        Up About an hour    3334/tcp                 thespaghettidetective_tasks_1
    50bf59dc335a        thespaghettidetective_web      "sh -c 'python manag…"   3 months ago        Up About an hour    0.0.0.0:3334->3334/tcp   thespaghettidetective_web_1
    8f3a3bb37848        thespaghettidetective_ml_api   "bash -c 'gunicorn -…"   3 months ago        Up About an hour    3333/tcp                 thespaghettidetective_ml_api_1
    b89f42d1d285        redis:5.0-alpine               "docker-entrypoint.s…"   3 months ago        Up About an hour    6379/tcp                 thespaghettidetective_redis_1
    tianbao@tianbao:~$ 
    

    输出详情介绍:

    CONTAINER ID: 容器 ID。

    IMAGE: 使用的镜像。

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

    CREATED: 容器的创建时间。

    STATUS: 容器状态。

    状态有7种:

    • created(已创建)
    • restarting(重启中)
    • running 或 Up(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)

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

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

    在宿主主机内使用 docker logs 命令,查看容器内的标准输出

    停止容器

    通过 docker ps 查看容器ID和容器名

    使用 docker stop 命令来停止容器

    容器使用

    获取镜像

    如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像

    docker pull ubuntu
    

    启动容器

    以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器

    docker run -it ubuntu /bin/bash
    

    参数说明:

    • -i: 交互式操作。
    • -t: 终端。
    • ubuntu: ubuntu 镜像。
    • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

    启动已停止运行的容器

    docker start b750bbbcfd88 
    

    后台运行

    docker run -itd --name ubuntu-test ubuntu /bin/bash
    

    注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)

    进入容器

    在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

    • docker attach
    • docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

    attach 命令

    下面演示了使用 docker attach 命令

    docker attach 1e560fca3906 
    

    注意: 如果从这个容器退出,会导致容器的停止。

    exec 命令

    下面演示了使用 docker exec 命令。

    docker exec -it 243c32535da7 /bin/bash
    

    注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。

    更多参数说明请使用 docker exec --help 命令查看

    导出和导入容器

    docker export 1e560fca3906 > ubuntu.tar
    

    导出容器 1e560fca3906 快照到本地文件 ubuntu.tar

    这样将导出容器快照到本地文件。

    导入容器快照

    可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

    cat docker/ubuntu.tar | docker import - test/ubuntu:v1
    

    此外,也可以通过指定 URL 或者某个目录来导入

    docker import http://example.com/exampleimage.tgz example/imagerepo
    

    删除容器

    docker ps -a
    docker rm -f 1e560fca3906
    

    下面的命令可以清理掉所有处于终止状态的容器。

    docker container prune
    

    运行一个 web 应用

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

    tianbao@tianbao:~$ sudo docker pull training/webapp  # 载入镜像
    tianbao@tianbao:~$ sudo docker run -d -P training/webapp python app.py
    

    参数说明:

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

    查看 WEB 应用容器

    tianbao@tianbao:~$ sudo docker ps
    CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                     NAMES
    0ba27ee3196c        training/webapp                "python app.py"          About a minute ago   Up About a minute   0.0.0.0:32768->5000/tcp   hungry_darwin
    

    通过 -p 参数来设置不一样的端口

    tianbao@tianbao:~$ sudo docker run -d -p 5000:5000 training/webapp python app.py
    

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

    网络端口的快捷方式

    使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号

    tianbao@tianbao:~$ sudo docker port 0ea61c947a6a
    5000/tcp -> 0.0.0.0:5000
    

    查看 WEB 应用程序日志

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

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

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

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

    tianbao@tianbao:~$ sudo docker top 0ea61c947a6a 
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                14867               14839               0                   10:38               ?                   00:00:00            python app.py
    tianbao@tianbao:~$ 
    

    检查 WEB 应用程序

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

    tianbao@tianbao:~$ sudo docker inspect 0ea61c947a6a
    

    停止 WEB 应用容器

    tianbao@tianbao:~$ sudo docker stop 0ea61c947a6a
    

    重启WEB应用容器

    tianbao@tianbao:~$ sudo docker start 0ea61c947a6a
    

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

    tianbao@tianbao:~$ sudo docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
    0ea61c947a6a        training/webapp     "python app.py"     58 minutes ago      Up 31 seconds       0.0.0.0:5000->5000/tcp   brave_nobel
    tianbao@tianbao:~$ 
    

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

    tianbao@tianbao:~$ sudo docker restart 0ea61c947a6a
    

    移除WEB应用容器

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

    tianbao@tianbao:~$ sudo docker stop 0ea61c947a6a
    tianbao@tianbao:~$ sudo docker rm 0ea61c947a6a
    
  • 相关阅读:
    进程同步&&进程互斥
    CHAP4 字符串和格式化输入输出
    记录学习到的内容
    数据链路层 差错控制
    二叉树的顺序存储
    Java复习笔记
    Stream流
    函数式接口
    网络编程
    接口,多态,抽象类总结
  • 原文地址:https://www.cnblogs.com/guotianbao/p/13957978.html
Copyright © 2011-2022 走看看