Hello world、容器使用

发布时间 2023-03-24 19:10:15作者: 刘盘明

Docker Hello world

# Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。输出Hello world
[root@docker ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete 
759aa75f3cee: Pull complete 
3fa871dc8a2b: Pull complete 
224c42ae46e7: Pull complete 
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
  • docker: Docker 的二进制执行文件。

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

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

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

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

运行交互式的容器

​ 通过 docker 的两个参数 ,让 docker 运行的容器实现"对话"的能力:

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

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

    [root@docker ~]# docker run -i -t ubuntu:15.10 /bin/bash
    # 进入一个 ubuntu15.10 系统的容器, cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表
    root@d8853ebe1ab7:/# cat /proc/version 
    Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018
    root@d8853ebe1ab7:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    # exit或ctrl+D退出容器
    root@d8853ebe1ab7:/# exit
    [root@docker ~]# 
    
    

    启动容器(后台模式)

    [root@docker ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1;done"
    d3be21610b1996d462572ccdcab84b58df77cac5cd7bee855d81ae9100c0bc0a
    # 在输出中,我们没有看到期望的 "hello world",而是一串长字符.这个长字符串叫做容器 ID,是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
    d3be21610b19   ubuntu:15.10   "/bin/sh -c 'while t…"   About a minute ago   Up About a minute             xenodochial_morse
    
    输出详情 状态
    CONTAINER ID 容器 ID created(已创建)
    IMAGE 启动容器时运行的命令 restarting(重启中)
    COMMAND 启动容器时运行的命令 running 或 Up(运行中)
    CREATED 容器的创建时间 removing(迁移中)
    STATUS 容器状态 paused(暂停)
    PORTS 容器的端口信息和使用的连接类型(tcp\udp) exited(停止)
    NAMES 自动分配的容器名称 dead(死亡)

    Docker容器使用

    Docker客户端

    # 直接输入 docker 命令来查看到 Docker 客户端的所有命令选项,通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。例如我们要查看 docker stop 指令的具体使用方法:
    [root@docker ~]# docker
    [root@docker ~]# docker stop --help
    

    拉取镜像、启动、停止

    # 获取镜像
    	如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
    [root@docker ~]# docker pull ubuntu
    Using default tag: latest
    latest: Pulling from library/ubuntu
    7b1a6ab2e44d: Pull complete 
    Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
    Status: Downloaded newer image for ubuntu:latest
    docker.io/library/ubuntu:latest
    # 启动容器
    	使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
    [root@docker ~]# docker run -it ubuntu /bin/bash
    root@74964faa7ca1:/# 
    
  • ubuntu: ubuntu 镜像

  • /bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

    # 使用 docker start 启动一个已停止的容器
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
    74964faa7ca1   ubuntu    "/bin/bash"   2 minutes ago   Exited (0) 3 seconds ago             dazzling_buck
    [root@docker ~]# docker start 74
    74
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
    74964faa7ca1   ubuntu    "/bin/bash"   3 minutes ago   Up 7 seconds             dazzling
    # 后台运行
    	在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式,加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
    [root@docker ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash
    17958ffd5489c09d44297679a6876795eef7d6c65881241727acef0d1d85b66b
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
    17958ffd5489   ubuntu    "/bin/bash"   6 seconds ago   Up 5 seconds             ubuntu-test
    # 停止一个容器,停止的容器可以通过 docker restart 重启
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
    17958ffd5489   ubuntu    "/bin/bash"   6 seconds ago   Up 5 seconds             ubuntu-test
    [root@docker ~]# docker stop 17
    17
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
    17958ffd5489   ubuntu    "/bin/bash"   3 minutes ago   Exited (0) 8 seconds ago             ubuntu-test
    [root@docker ~]# docker restart 17
    17
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
    17958ffd5489   ubuntu    "/bin/bash"   3 minutes ago   Up 3 seconds             ubuntu-test
    

    进入容器

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

# docker attach 命令:从这个容器退出,会导致容器的停止。
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
17958ffd5489   ubuntu    "/bin/bash"   3 minutes ago   Up 3 seconds             ubuntu-test
[root@docker ~]# docker attach 17
root@17958ffd5489:/# exit
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
17958ffd5489   ubuntu    "/bin/bash"   8 minutes ago    Exited (0) 8 seconds ago             ubuntu-test
# docker exec 命令(推荐):从这个容器退出,容器不会停止
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
17958ffd5489   ubuntu    "/bin/bash"   10 minutes ago   Up 8 seconds              ubuntu-test
[root@docker ~]# docker exec -it 17 /bin/bash
root@17958ffd5489:/# exit
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS              PORTS     NAMES
17958ffd5489   ubuntu    "/bin/bash"   11 minutes ago   Up About a minute             ubuntu-test

导出、导入、删除(容器)

# 导出容器 17 快照到本地文件 ubuntu.tar,这样将导出容器快照到本地文件
[root@docker ~]# docker export 17 > ubuntu.tar
[root@docker ~]# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates   Videos
Desktop          Downloads  Music                 Public    ubuntu.tar
# 使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件ubuntu.tar 导入到镜像 test/ubuntu:v1:
[root@docker ~]# cat ubuntu.tar | docker import - test/ubuntu:v1
sha256:f6d588cc74ff76d52f034c8c2f7bbe711c214e1cab58e4f2d6318b0b5fa9cab2
[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
test/ubuntu   v1        f6d588cc74ff   10 seconds ago       72.8MB
# 删除容器使用 docker rm 命令
[root@docker ~]# docker rm -f 1c
1c
# 清理掉所有处于终止状态的容器
[root@docker ~]# docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
6b21e9eddcda9c5b79392e31c820f162b9e80f1205286ee94f03bdc116b0ac3a
74964faa7ca18f311e97f36d817ff7d1acba6d29439f67355c7085127c4b5f7e

Total reclaimed space: 0B

运行一个web应用、查看web应用容器

# 使用 docker 构建一个 web 应用程序,我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用
[root@docker ~]# docker pull training/webapp
[root@docker ~]# docker run -d -P training/webapp python app.py
47d5ad9623c4d5b85ff162e0938fa3c3e49b45bb2e7236640b35fd6738d342c3
# 查看web应用容器:多了端口信息
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS          PORTS                                         NAMES
47d5ad9623c4   training/webapp   "python app.py"   14 seconds ago   Up 13 seconds   0.0.0.0:32768->5000/tcp, :::32768->5000/tcp   distracted_bose
# 通过 -p 参数来设置不一样的端口
[root@docker ~]# docker run -d -p 5000:5080 training/webapp python app.py
fd0321e13c40db9f14076e7a14bd33e315443f292194b3fcde6a98a82d5c2432
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                                 NAMES
fd0321e13c40   training/webapp   "python app.py"   5 seconds ago   Up 4 seconds   5000/tcp, 0.0.0.0:5000->5080/tcp, :::5000->5080/tcp   stoic_einstein
47d5ad9623c4   training/webapp   "python app.py"   8 minutes ago   Up 8 minutes   0.0.0.0:32768->5000/tcp, :::32768->5000/tcp           distracted_bose

​ Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。这时我们可以通过浏览器访问WEB应用

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

网络端口的快捷方式、查看web应用程序日志和容器进程

# 使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS                     PORTS                                                 NAMES
47d5ad9623c4   training/webapp   "python app.py"   5 days ago      Up 5 days                  0.0.0.0:32768->5000/tcp, :::32768->5000/tcp           distracted_bose
[root@docker ~]# docker port 47
5000/tcp -> 0.0.0.0:32768
5000/tcp -> [::]:32768
# docker logs [ID或者名字] 可以查看容器内部的标准输出。-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
[root@docker ~]# docker logs -f 47
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET / HTTP/1.1" 200 -
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET / HTTP/1.1" 200 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:05] "GET / HTTP/1.1" 200 -
# 使用 docker top 来查看容器内部运行的进程
[root@docker ~]# docker top 47
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                72749               72729               0                   17:47               ?                   00:00:00            python app.py

检查、停止、重启、移除(web应用程序)

# 使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
[root@docker ~]# docker stop 47
47
# 正在运行的容器,我们可以使用 docker restart 命令来重启。
[root@docker ~]# docker start 47
47
# 使用 docker rm 命令来删除不需要的容器,删除容器时,容器必须是停止状态
[root@docker ~]# docker rm 47
47