ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

04-使用docker容器

2020-03-07 15:55:29  阅读:198  来源: 互联网

标签:容器 04 docker01 ubuntu test docker root


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有