Docker入门与应用系列(三)容器管理

一、启动容器

  启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将终止状态的容器重新启动。

1.1 新建并启动

主要命令为  docker run
下面的命令输出一个”Hello,world!”,之后终止容器

[[email protected] ~]$ docker run centos:7 /bin/echo "hello,world"
hello,world

  启动一个bash终端,允许用户进行交互

  # docker run -it centos /bin/bash

  其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

  在交互模式下,用户可以所创建的终端来输入命令:  

[[email protected] ~]$ docker run -it centos:7 /bin/bash
[[email protected] /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[[email protected] /]# uname -a
Linux 8e390ccc6898 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

  

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

1.2 启动已经终止的容器

  利用 docker start [container_id/name] 可以启动一个已经终止的容器。 

[[email protected] ~]$ docker start 8e390ccc6898
8e390ccc6898

注意! 容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了。

二、守护状态运行

  更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数实现。  

[[email protected] ~]$ docker run --name mytest -it -d centos:7 /bin/bash
0cd0fd089ea0bc27c6e25bdbf7a4dafde11769aeeffec3a0f4a21ce0d0bbdcd8
[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
0cd0fd089ea0        centos:7            "/bin/bash"         15 seconds ago      Up 14 seconds

  --name : 未容器命名

  -d : 运行在后台

三、停止容器  

在宿主机可以使用 docker stop 来终止一个容器

在Docker容器中,可以使用 exit 或者 ctl+d 来退出终端,并终止容器。

[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0cd0fd089ea0        centos:7            "/bin/bash"         10 minutes ago      Up 7 minutes                            mytest
8e390ccc6898        centos:7            "/bin/bash"         2 hours ago         Up 14 minutes                           loving_engelbart
[[email protected] ~]$ docker stop mytest
mytest

  查看所有容器信息

[[email protected] ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS
0cd0fd089ea0        centos:7            "/bin/bash"              11 minutes ago      Exited (137) 37 secon
8e390ccc6898        centos:7            "/bin/bash"              2 hours ago         Up 15 minutes

  Exited 表示已经终止的容器

  此外,我们可以用docker restat 命令来重启一个容器。

四、进入容器

  当我们需要进入容器进行操作时,有很多种方法,包括使用docker attach命令或 nsenter工具等。

  4.1 attach 命令

  docker attach 命令是Docker自带的命令。  

[[email protected] ~]$ docker attach mytest
[[email protected] /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr

  但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

  4.2 nsenter 命令 

[[email protected] ~]# yum install util-linux -y
Centos7默认最小化已经安装
我们通过nsenter就可以进入容器,但是nsenter是通过pid进入容器里,所以我们需要知道容器的pid。我们可以通过docker inspect来获取到pid

  

  为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

# PID=$(docker inspect --format "{{.State.Pid}}" dtest)
# nsenter --target $PID --mount --uts --ipc --net –pid

  

  退出 Ctl+ddocker 容器会保持运行状态

  4.3 .bashrc_docker

  更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。  

# Some useful commands to use docker.
# Author: [email protected]
# Created:2014-09-25

alias docker-pid="sudo docker inspect --format ‘{{.State.Pid}}‘"
alias docker-ip="sudo docker inspect --format ‘{{ .NetworkSettings.IPAddress }}‘"

#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter() {
    #if [ -e $(dirname "$0")/nsenter ]; then
    #Change for centos bash running
    if [ -e $(dirname ‘$0‘)/nsenter ]; then
        # with boot2docker, nsenter is not in the PATH but it is in the same folder
        NSENTER=$(dirname "$0")/nsenter
    else
        # if nsenter has already been installed with path notified, here will be clarified
        NSENTER=$(which nsenter)
        #NSENTER=nsenter
    fi
    [ -z "$NSENTER" ] && echo "WARN Cannot find nsenter" && return

    if [ -z "$1" ]; then
        echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
        echo ""
        echo "Enters the Docker CONTAINER and executes the specified COMMAND."
        echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
    else
        PID=$(sudo docker inspect --format "{{.State.Pid}}" "$1")
        if [ -z "$PID" ]; then
            echo "WARN Cannot find the given container"
            return
        fi
        shift

        OPTS="--target $PID --mount --uts --ipc --net --pid"

        if [ -z "$1" ]; then
            # No command given.
            # Use su to clear all host environment variables except for TERM,
            # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
            # and start a login shell.
            #sudo $NSENTER "$OPTS" su - root
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid su - root
        else
            # Use env to clear all host environment variables.
            sudo $NSENTER --target $PID --mount --uts --ipc --net --pid env -i [email protected]
        fi
    fi
}

.bashrc_docker

echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

  这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。 

[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0cd0fd089ea0        centos:7            "/bin/bash"         About an hour ago   Up About a minute                       mytest
8e390ccc6898        centos:7            "/bin/bash"         3 hours ago         Up About an hour                        loving_engelbart
[[email protected] ~]$ docker-pid mytest
6641
[[email protected] ~]$ docker-enter mytest
Last login: Sat Feb 24 06:50:02 UTC 2018
[[email protected] ~]# ls
anaconda-ks.cfg
[[email protected] ~]# ifconfig

  

五、导出和导入容器

5.1 导出容器

  如果要导出本地某个容器,可以使用docker export 命令

[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
0cd0fd089ea0        centos:7            "/bin/bash"         2 hours ago         Up About an hour
8e390ccc6898        centos:7            "/bin/bash"         5 hours ago         Up 3 hours
[[email protected] ~]$ docker export mytest > centos7.tar.gz
[[email protected] ~]$ ll
total 606476
-rw-rw-r-- 1 bigberg bigberg 292853760 Feb 24 16:12 centos7.tar.gz

5.2 导入容器

[[email protected] ~]$ cat centos7.tar.gz | docker import - test/centos:v1.0
sha256:1c2b77ab34f25c54b0d0f835c7dea6cf57876ace264c5dc0c7e886e1b524e604
[[email protected] ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/centos         v1.0                1c2b77ab34f2        6 seconds ago       284MB
nginx               latest              e548f1a579cf        3 days ago          109MB
centos              7                   ff426288ea90        6 weeks ago         207MB
centos              latest              ff426288ea90        6 weeks ago         207MB

六、删除容器  

  可以使用 docker rm 来删除一个处于终止状态的容器

[[email protected] ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
0cd0fd089ea0        centos:7            "/bin/bash"              3 hours ago         Up 2 hours                                        mytest
8e390ccc6898        centos:7            "/bin/bash"              5 hours ago         Exited (137) 19 seconds ago                       loving_engelbart
7b34e5fd77f1        centos:7            "/bin/echo hello,wor…"   5 hours ago         Exited (0) 5 hours ago                            heuristic_lovelace
26b037aa1a09        centos              "/bin/echo hello,wor…"   5 hours ago         Exited (0) 5 hours ago                            distracted_mirzakhani
[[email protected] ~]$ docker rm 7b34e5fd77f1
7b34e5fd77f1

七、容器重命名 

[[email protected] ~]$ docker rename mytest my-test
[[email protected] ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0cd0fd089ea0        centos:7            "/bin/bash"         3 hours ago         Up 2 hours                              my-test

  

八、查看容器运行

docker ps #查看已经运行的容器
docker ps -a #查看所有容器(运行的和不运行的)
docker ps -l #查看最新创建的容器
docker ps -q #只显示所有容器的PID
docker ps -s #显示所有容器的大小

  

九、查看容器的信息

docker inspect my-test

  

十、查看容器端口映射

docker port my-test

  

十一、复制文件到容器中

###复制宿主机文件到容器中
[[email protected] ~]$ docker cp test.txt my-test:/tmp/
[[email protected] ~]$ docker exec -it my-test ls /tmp
ks-script-Rl3Umm  test.txt  yum.log

### 复制容器中文件到宿主机

[[email protected] ~]$ sudo docker cp my-test:/tmp/test.txt /home
[[email protected] ~]$ ll /home/test.txt
-rw-rw-r-- 1 root root 0 Feb 24 16:52 /home/test.txt

  

十二、查看日志

docker logs my-test

  

原文地址:https://www.cnblogs.com/bigberg/p/8465033.html

时间: 2024-10-08 17:53:37

Docker入门与应用系列(三)容器管理的相关文章

Docker入门与应用系列(八)Docker图形界面管理之Shipyard

Shipyard基于Docker API实现的容器图形管理系统,支持container.images.engine.cluster等功能,可满足我们基本的容器部署需求可堆栈的Docker管理基于Docker Swarm,Shipyard可让您管理Docker资源,包括容器,图像,私人注册表等等.Shipyard与其他管理应用程序的不同之处在于它提高了可组合性,并与Docker Remote API 100%兼容. Shipyard管理container.images.engine.cluste范

Docker入门与应用系列(七)Docker图形界面管理之DockerUI

1.dockeruiDockerrUI是一个基于Docker API提供图形化页面简单的容器管理系统,支持容器管理.镜像管理.1.1 下载镜像 docker pull abh1nav/dockerui:latest 1.2 执行 docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock --name dockerui abh1nav/dockerui:latest -e="/docker.sock" 1.3 浏览ht

Docker入门与实战系列:热点问题

Docker入门与实战--<Docker ABC>电子书 https://github.com/gudaoxuri/Docker_ABC 11. 热点问题 11.1. 容器如何使用静态IP 默认情况下Docker容器的IP是动态分配的,要使用静态IP时我们会思考一下: 为什么需要静态IP?如果是为了两个容器间通信可以 使用--link 指定-h来指定hostname并指定-dns到宿主机 让容器开放上层服务 如果这样都满足不了您的要求那么可以参考 http://huataihuang.gith

Docker入门与应用系列(一)介绍和部署

Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业). Docker项目的目标是实现轻量级的操作系统虚拟化解决方案. Docker是通过内核虚

Docker入门(二):容器与镜像常用指令

零.docker常用命令 #镜像名 版本标签 镜像id 创建时间 镜像大小 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 6 months ago 1.84kB docker version/info #查看版本/信息 docker --help #查看说明文档 docker logs -f -t --tail 日志条数 容器ID #查看容器日志 docker inspect #获取容器/镜像的元数据 一

Docker入门与应用系列(四)网络管理

Docker支持五种网络模式 bridge默认网络,docker启动后创建一个dockr0网桥,默认创建的容器也是添加到这个网桥中:IP地址段是172.17.0.1/16 host容器不会获得一个独立的network namespace,而是与宿主机共用一个 none获取独立的network namespace,但不为容器进行任何网络配置 container与指定的容器使用同一个network namespace,网卡配置也是相同的 自定义自定义网桥,默认与bridge网络一样 docker默认

Xen入门系列三【Xen 管理工具 xm】

xm命令是管理Xen的最基本的工具,可以通过xm --help 来获得帮助. 1. 列出所有正在运行的虚拟操作系统 # xm list PS[1]:可缩写为 xm li2. 启动虚拟机 # 通过配置文件启动虚拟机 # xm create <ConfigFile> # 通过虚拟机名称启动虚拟机,虚拟机必需已存在 xm list 中 # xm start <DomainName> 参数说明: ConfigFile:虚拟机配置文件 DomainName: 虚拟机名称 PS[2]:很多教程

Docker入门二:容器管理

Docker入门二:容器管理 LinuxDocker time: 2019-12-3 容器管理 docker常用命令 注: 命令中的CONTAINER,可以是conainer_id,也可以是container name docker system info # 查看docker系统信息 docker container ls -a 查看当前已经创建的container docker container ls: -a 显示所有容器 -q 仅显示ID -s 显示container的文件大小 快速启动

docker入门——管理容器

除了交互式的容器(interactive container),我们也可以创建长期运行的容器.守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务.大多数时候我们都需要以守护式来运行我们的容器. 创建守护式容器 # docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 64b5c862a23cb5b