其他分享
首页 > 其他分享> > 04-使用docker容器

04-使用docker容器

作者:互联网

Docker容器

docker容器是另一个核心概念,容器是镜像的一个运行实例。不同的是镜像是静态的只读文件,容器带有运行时需要的可写层,并且容器中的应用进程处于运行状态。
虚拟机是模拟运行一整套操作系统,docker只运行一个应用和它的运行环境。

创建容器

  1. 新建容器,docker [container] create命令新建的容器处于停止状态
    [root@docker01 ~]# docker create -it ubuntu:18.04
    550c14d7db29b3fbcdff0819546403779f8ce717fa2a5012909b057c2f8b1806
    [root@docker01 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
    550c14d7db29        ubuntu:18.04        "/bin/bash"         34 seconds ago      Created                                       kind_rosalind
  2. 启动容器,docker [container] start命令来启动一个已经创建的容器
    [root@docker01 ~]# docker start 55
    55
    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    550c14d7db29        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 5 seconds                            kind_rosalind
  3. 新建并启动容器,除了创建容器后通过start命令启动,也可以直接新建并启动。docker [container] run
    [root@docker01 ~]# docker run ubuntu:18.04 /bin/echo 'hello'
    hello

    当执行完/bin/echo 'hello'后,容器会自动终止。
    当使用docker run来创建启动容器时会包含:
    1、检查本地是否存在指定镜像,没有就从公有仓库下;
    2、利用镜像创建一个容易,并启动;
    3、分配一个文件系统给容器,并给只读的镜像外挂一个可读写层;
    4、从宿主机的网桥接口桥接一个虚拟机口到容器中;
    5、网桥地址池分配一个ip地址给容器;
    6、执行用户应用;
    7、容器自动终止
    启动一个bash终端,允许用户进行交互

    [root@docker01 ~]# docker run -it ubuntu:18.04 /bin/bash
    root@4d99166324fb:/# pwd
    /
    root@4d99166324fb:/# ls
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr

    -t:为docker分配一个为终端(pseudo-tty)并绑定到容器的标准输入上
    -i:让容器的标准输入保持打开

  4. 后台运行,更多的时候需要容docker容器在后台以守护态(Daemonized)形式运行
    [root@docker01 ~]# docker run -d ubuntu:18.04 /bin/bash -c "while true;do echo 'hello';sleep 1;done"
    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    a5d805944192        ubuntu:18.04        "/bin/sh -c 'while t…"   4 seconds ago       Up 3 seconds                            frosty_joliot
  5. 查看容器输出,docker [container] logs
    [root@docker01 ~]# docker logs a5d805944192
    hello
    hello
    hello
    ...

    停止容器

  6. 暂停容器,docker [container] pause CONTAINER [CONTAINER...]
    在一个终端执行
    [root@docker01 ~]# docker run --name test --rm -it ubuntu bash
    root@98eedc501dec:/# 

    另一个终端执行,暂停

    [root@docker01 ~]# docker pause test
    test
    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
    98eedc501dec        ubuntu              "bash"                   2 minutes ago       Up 2 minutes (Paused)                       test

    恢复

    [root@docker01 ~]# docker unpause test
    test
  7. 终止容器
    [root@docker01 ~]# docker stop test
    test
  8. 重起容器
    [root@docker01 ~]# docker restart test
    test

    进入容器

    如果需要进入容器进行操作,推荐使用官方的attach或exec命令。
    attach的命令格式为:
    docker attach [--detach-key[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
    -detach-key[=[]] #指定退出attach模式的快捷键,默认是CTRL+p CTRL+q;
    --no-stdin=true|false #是否关闭标准输入,默认是保持打开;
    --sig-proxy=treu|false #是否代理收到的系统信号给应用程序,默认打开;

    [root@docker01 ~]# docker run -itd ubuntu:18.04
    b82dba0090bcb85fafdeef03e67f9973426965f2792efae73de1c07eb0b44bc2
    [root@docker01 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    b82dba0090bc        ubuntu:18.04        "/bin/bash"         52 seconds ago      Up 50 seconds                           fervent_maxwell
    [root@docker01 ~]# docker attach fervent_maxwell
    root@b82dba0090bc:/# 

    exec是1.3.0 docker版本后提供的一个更方便的工具,可以在运行中容器内直接执行任何命令。
    docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONAINER COMMAND [ARG...]
    -d #在容器中后台执行命令
    --detach-keys=“ ” #指定容器切回后台的按键
    -e #指定环境变量列表
    -i #打开标准输入接受用户输入命令,默认为false
    --privileged=treu|false #是否给执行命令以最高权限,默认false
    -t #分配伪终端,默认false
    -u #执行命令的用户名或ID

    [root@docker01 ~]# docker exec -it f2554976971b /bin/bash
    root@f2554976971b:/# w
    08:02:18 up 2 days, 18:58,  0 users,  load average: 0.03, 0.03, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root@f2554976971b:/# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 08:01 pts/0    00:00:00 /bin/bash
    root        10     0  0 08:02 pts/1    00:00:00 /bin/bash
    root        20    10  0 08:02 pts/1    00:00:00 ps -ef

    此时会打开一个新的bash终端,不影响容器内其他应用的前提下,用户与容器进行交互。

    删除容器

    可是使用docker [container] rm命令来删除处于终止或退出状态的容器。docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTIAINER
    -f #是否强制终止并删除一个运行中的容器
    -l #删除容器的链接,但保留容器
    -v #删除容器挂载的数据卷
    查看处于停止状态的容器,并删除

    [root@docker01 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    f2554976971b        ubuntu:18.04        "/bin/bash"              46 hours ago        Up 46 hours                                     focused_joliot
    b82dba0090bc        ubuntu:18.04        "/bin/bash"              47 hours ago        Exited (0) 46 hours ago                         fervent_maxwell
    [root@docker01 ~]# docker rm b82dba0090bc
    b82dba0090bc

    导出容器

    用于将容器从一个系统迁移到另外一个系统,这时可以使用docker的导入和导出功能。
    1、 导出容器是指,导出一个已经创建的容器到一个文件,不管此时容器是否处于运行状态。docker [container] export [-o|--output[=""]] CONTAINER
    -o #指定导出的tar文件名,也可以直接通过重定向来实现

    [root@docker01 docker]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
    f2554976971b        ubuntu:18.04        "/bin/bash"              47 hours ago        Up 47 hours                                   focused_joliot
    a5d805944192        ubuntu:18.04        "/bin/sh -c 'while t…"   2 days ago          Exited (137) 2 days ago                       frosty_joliot
    [root@docker01 docker]# docker export  a5d805944192 > test_ubuntu2.tar
    [root@docker01 docker]# docker export -o test_ubuntu.tar a5d805944192
    [root@docker01 docker]# ls
    test_ubuntu2.tar  test_ubuntu.tar

    导入容器

    导出的文件可以使用docker [container] import 命令导入变成镜像。docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL| -[REPOSITORY[:TAG]]
    -c #再倒入的同时执行对容器进行修改的Dockerfile指令

    [root@docker01 docker]# docker import test_ubuntu.tar  test111/ubuntu:v1.0
    sha256:6c5cd99408ca4648c4d3e5560280e75633e3fbcfdba2778d1b69e4353fb27cc9
    [root@docker01 docker]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    test111/ubuntu      v1.0                6c5cd99408ca        13 seconds ago      64.2M

    注:docker load和docker import区别在于容器快照(docker import)将丢弃所有的的历史记录和元数据信息,仅保存容器当时的快照状态。镜像存储文件(docker load)将保存完整记录,体积更大。

    查看容器

    1、查看容器详情,docker container inspect [OPTIONS] ONTAINER

    [root@docker01 docker]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
    f2554976971b        ubuntu:18.04        "/bin/bash"              47 hours ago        Up 47 hours                                   focused_joliot
    [root@docker01 docker]# docker container inspect frosty_joliot
    [
    {
        "Id": "a5d8059441922d3157d2af1d0ab0a724acf13fbe8bb60ddb92fa2536620c2f84",
        "Created": "2020-03-05T05:50:37.692124654Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo hello;sleep 1;done"
        ],
        "State": {
            "Status": "exited",

    查看某个容器的具体信息,会以json格式返回包括ID、创建时间、路径、状态、镜像、配置等在内的各项信息。
    2、查看容器内的进程,docker [container] top [OPTIONS] CONTAINER,类似于linux的top命令,包括PID、用户、时间、命令等。必须是运行状态的容器才能查看

    [root@docker01 docker]# docker top focused_joliot
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                12365               12348               0                   Mar05               pts/0               00:00:00            /bin/bash
    root                12431               12348               0                   Mar05               pts/1               00:00:00            /bin/bash

    3、查看统计信息,docker [container] status [OPTIONS] [CONTAINER],会显示CPU、内存、存储、网络等使用情况的统计信息。
    -a,--all #输出所有容器统计信息,默认仅在运行中
    -format string #格式化输出信息
    -no-stream #不持续输出,默认会自动更新持续实时结果
    -no-trunc #不截断输出信息

[root@docker01 docker]# docker stats focused_joliot

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
f2554976971b        focused_joliot      0.00%               824KiB / 15.51GiB   0.01%               648B / 0B           0B / 0B             2

其他容器命令

1、复制文件
container cp支持在容器和主机之间复制文件,docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
-a,-archive #打包模式,复制文件会带有原始的UID/GID信息
-L,-follow-link #跟随软链接,当原路径为软链接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
将本都路径oglab/python复制到容器的/tmp路径下

[root@docker01 oglab]# docker cp Python-3.8.2 focused_joliot:/tmp

2、查看变更

[root@docker01 oglab]# docker container diff focused_joliot
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_streams.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_transports.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/__init__.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/echo.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_queues.py
A /tmp/Python-3.8.2/Lib/test/test_distutils.py
A /tmp/Python-3.8.2/Lib/test/test_posixpath.py
A /tmp/Python-3.8.2/Lib/test/test_subclassinit.py
A /tmp/Python-3.8.2/Lib/test/xmltestdata
...

3、查看端口映射,container port命令可以查看容器的端口映射情况,docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

[root@docker01 oglab]# docker container port focused_joliot

4、更新配置,container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。docker [container] update [OPTIONS] CONTAINER
限制总配额为1秒,容器所占用的时间为10%,单位微妙

[root@docker01 oglab]# docker update --cpu-quota 1000000 f2554976971b
f2554976971b
[root@docker01 oglab]# docker update --cpu-period 1000000 f2554976971b
f2554976971b

标签:容器,04,docker01,ubuntu,test,docker,root
来源: https://blog.51cto.com/11923906/2476199