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
原文地址:https://www.cnblogs.com/guotianbao/p/13957978.html