容器操作

创建容器

  • 新建容器

    1
    2
    3
    # 新建的容器处于停止状态
    [root@node1 docker]# docker create -it alpine-vim-bash:1.0
    c5de226c770860f4a10d07e941fbb3080d98cae6eb50d492f54ecac8fb0a1746
  • 启动容器

    1
    2
    3
    # 名称通过docker ps -a start 后粘贴names或者id值启动容器
    [root@node1 docker]# docker start focused_hopper
    [root@node1 docker]# docker start c5de226c77
  • 创建并启动容器

    1
    2
    3
    # docker run命令,等价于先执行docker create命令,然后执行docker start
    # docker run [ OPTIONS] IMAGE [ COMMOND] [ ARGS ...]
    [root@node1 docker]# docker exec -it c5de226c77 bash
    • Docker中系统镜像的缺省命令是 bash,如果不加 -it bash 命令执行了自动会退出。这是因为如果没有衔接输入流,本身就会马上结束。加-it 后docker命令会为容器分配一个伪终端,并接管其stdin/stdout支持交互操作,这时候bash命令不会自动退出。

    • 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。

    • 工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行,执行 exit 退出终端,同时容器停止。

  • 守护态后台运行

    1
    2
    3
    [root@node1 docker]# docker run -d alpine-vim-bash:1.0 /bin/sh -c "while true; do echo hello; sleep 1; done"
    # 查看容器输出
    [root@node1 docker]# docker logs 96539cb
  • 启动容器并指定名称

    1
    [root@node1 docker]# docker run -d --name test01 -it alpine-vim-bash:1.0
  • 命令参数

命令 说明
-d, –detach=false 指定容器运行于前台还是后台,默认为false
-i, –interactive=false 打开STDIN,用于控制台交互
-t, –tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, –user=”” 指定容器的用户
-a, –attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, –workdir=”” 指定容器的工作目录
-c, –cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, –env=[] 指定环境变量,容器中可以使用该环境变量
-m, –memory=”” 指定容器的内存上限
-p, –publish-all=false 指定容器暴露的端口
-h, –hostname=”” 指定容器的主机名
-v, –volume=[] 给容器挂载存储卷,挂载到容器的某个目录
–volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
–entrypoint=”” 覆盖image的入口点
–env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
–expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
–link=[] 指定容器间的关联,使用其他容器的IP、env等信息
–lxc-conf=[] 指定容器的配置文件,只有在指定–exec-driver=lxc时使用
–name=”” 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
–net=”bridge” 容器网络设置 bridge : 使用docker daemon指定的网桥 host: 容器使用主机的网络 container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源 none: 容器使用自己的网络(类似–net=bridge),但是不进行配置
–restart=”no” 指定容器停止后的重启策略,默认容器退出时不重启 on-failure: 容器故障退出(返回值非零)时重启 always: 容器退出时总是重启 –rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

停止容器

只是希望暂时让容器暂停工作一段时间,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause。处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行。

  • 暂停容器

    1
    2
    3
    4
    5
    6
    [root@node1 docker]# docker pause fd18f0
    # 查看status
    [root@node1 docker]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    fd18f06e4a07 alpine-vim-bash:1.0 "/bin/sh" About a minute ago Up 19 seconds (Paused) ecstatic_chandrasekhar

  • 取消暂停继续运行容器

    1
    [root@node1 docker]# docker unpause fd18f0
  • 终止容器

    1
    2
    3
    [root@node1 docker]# docker stop fd18f0
    # 使用docker kill可以强行终止容器 当docker容器中的应用终止时,容器也会自动终止
    docker kill 容器ID或者容器名
  • 停止所有容器

    1
    [root@node1 docker]# docker stop $(docker ps -qa)

重启容器

  • docker start 容器ID或者容器名

  • docker restart 容器ID或者容器名

进入容器

  • 使用attach命令直接进入容器,启动命令的终端,不会启动新的进程

    • 当多个窗口同时attach到一个容器时,所有窗口都会同步显示,当某个窗口阻塞时,其他窗口也无法操作
    1
    [root@node1 docker]# docker attach fd18f0
  • 使用exec命令在容器中打开新的终端,并且可以启动新的进程。

    1
    [root@node1 docker]# docker exec -it fd18f0 /bin/bash
  • 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。

选项 作用
–detach, -d 后台运行模式,在后台执行命令相关命令
–detach-keys 覆盖容器后台运行的一些参数信息
–env, -e 设置环境变量
–interactive, -i 展示容器输入信息STDIN
–privileged 为命令提供一些扩展权限
–tty, -t 命令行交互模式
–user, -u 设置用户名(format: <name|uid>[:<group|gid>])
–workdir, -w 指定容器内的目录

退出容器

  • Ctrl+c会直接卡死

  • Ctrl+P+Q按钮退出容器,即可正常退出不关闭容器

  • exit容器停止退出 : 利用“docker restart”命令重启容器、attach命令进入容器后,重启httpd和radosgw,并且使用wget验证是否将radosgw重启成功即可。

删除容器

  • docker rmi 删除镜像, 使用docker rm删除已终止或退出的容器

    1
    2
    3
    4
    5
    [root@node1 docker]# docker rm fd18f0 -f
    # 删除所有容器
    [root@node1 docker]# docker rm $(docker ps -qa)
    docker rm -f $(docker ps -a -q)
    docker ps -a -q | xargs docker rm
  • 选项

    选项 说明
    -f 通过SIGKILL信号强制删除一个运行中的容器
    -l 移除容器间的网络连接,而非容器本身
    -v 删除与容器关联的卷

导入和导出容器

  • 导出容器是指导出一个已经创建的容器到一个文件,不管此时该容器是否处于运行状态

    1
    2
    3
    [root@node1 docker]# docker run -d --name test01 -it alpine-vim-bash:1.0
    [root@node1 docker]# docker export -o test1.tar 9c92b887896a
    [root@node1 docker]# docker export 9c92b887896a > test2.tar
  • 导入文件成为镜像

    1
    2
    3
    4
    5
    6
    [root@node1 docker]# docker import test2.tar test:1.0

    [root@node1 docker]# docker history test:1.0
    IMAGE CREATED CREATED BY SIZE COMMENT
    9fadc36235ff 32 seconds ago 34.1MB Imported from -

  • importload区别

    • import导入容器快照文件,仅保存当前快照状态,丢弃所有历史记录和元数据信息,导入时可以重新制定标签等元数据信息。
    • load导入镜像存储文件,镜像存储文件将保存完整记录,体积更大。不能对载入的镜像重命名
  • docker export 的应用场景: 主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。

  • docker save 的应用场景: 如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

查看容器

  • 查看容器详情信息

    1
    [root@node1 docker]# docker inspect 9c92b887896a
  • 查看容器内进程

    1
    [root@node1 docker]# docker top 9c92b887896a
  • 查看统计信息

    1
    [root@node1 docker]# docker stats 9c92b887896a
  • 查看容器日志

    1
    2
    3
    4
    5
    6
    7
    # docker logs -f -t --tail 容器ID
    -t 是加入时间戳
    -f 跟随最新的日志打印
    --tail 数字 显示最后多少条

    # 示例
    docker logs -f -t --tail 10 44ca9

列出运行的容器

  • docker ps [OPTIONS]

    • OPTIONS说明(常用):

      1
      2
      3
      4
      5
      -a :列出当前所有正在运行的容器+历史上运行过的
      -l :显示最近创建的容器。
      -n:显示最近n个创建的容器。
      -q :静默模式,只显示容器编号。
      --no-trunc :不截断输出。

其他命令

  • 复制文件

    1
    2
    # docker cp  容器ID:容器内路径 目的主机路径
    [root@node1 docker]# docker cp test1.tar 9c92b887896a:/
  • 查看容器文件系统的变更

    1
    [root@node1 docker]# docker diff 9c92b887896a
  • 查看端口映射

    1
    [root@node1 docker]# docker port 9c92b887896a
  • 更新容器运行时的配置,主要是资源限制

    1
    [root@node1 docker]# docker update --cpu-period 100000 9c92b887896a
  • 容器直接互联

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 启动mysql容器
    [root@node1 docker]# docker run --name mysqldb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

    # 启动httpd容器与mysql容器互联
    docker run -it --name web --link mysqldb:webdb httpd /bin/bash

    # 在 web 容器中就可以使用 webdb 来代替ip来访问mysql了
    root@6a1aa3b3d96c:/usr/local/apache2# cat /etc/hosts
    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.3 webdb 9b938bb01097 mysqldb
    172.17.0.4 6a1aa3b3d96c

命令总结

命令 备注 说明
attach Attach to a running container 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile 通过 Dockerfile 定制镜像
commit Create a new image from a container changes 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path 从容器中拷贝指定文件或者目录到宿主机中
create Create a new container 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container’s filesystem 查看 docker 容器变化
events Get real time events from the server 从 docker 服务获取容器实时事件
exec Run a command in an existing container 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image 展示一个镜像形成历史
images List images 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information 显示系统相关信息
inspect Return low-level information on a container 查看容器详细信息
kill Kill a running container kill 指定 docker 容器
load Load an image from a tar archive 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server 从当前 Docker registry 退出
logs Fetch the logs of a container 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT 查看映射端口对应的容器内部源端口
pause Pause all processes within a container 暂停容器
p List containers 列出容器列表
pull Pull an image or a repository from the docker registry server 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container 重启运行的容器
rm Remove one or more containers 移除一个或者多个容器
rmi Remove one or more images 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container 创建一个新的容器并运行一个命令
save Save an image to a tar archive 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub 在 docker hub 中搜索镜像
start Start a stopped containers 启动容器
stop Stop a running containers 停止容器
tag Tag an image into a repository 给源中镜像打标签
top Lookup the running processes of a container 查看容器中运行的进程信息
unpause Unpause a paused container 取消暂停容器
version Show the docker version information 查看 docker 版本号
wait Block until a container stops, then print its exit code 截取容器停止时的退出状态值

端口映射格式

1
2
3
4
5
6
7
8
-P(大写): 随机端口映射;

-p: 指定端口映射,有以下四种格式

ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort

启动守护式容器

  • 使用镜像centos:latest以后台模式启动一个容器docker run -d centos,然后docker ps -a 进行查看, 会发现容器已经退出。说明很重要的一点: Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

  • 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。

  • 例如service nginx start, 但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用, 最佳的解决方案是将你要运行的程序以前台进程的形式运行

  • 添加前台进程

    1
    docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"