Docker技术入门与实战 第4章 操作Docker容器

4.1 创建容器

1.新建容器

    可以使用docker create命令新建一个容器,例如

[root@localhost ~]# docker create -it ubuntu:latest
1871724133e4bb903a04f5f4652c00cb2b8dd8bde25d1cef8c6a069fcbfd5141
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1871724133e4        ubuntu:latest       "/bin/bash"              20 seconds ago      Created                                      infallible_noyce
9620c7a16990        registry            "/entrypoint.sh /etc…"   4 days ago          Up 3 days           0.0.0.0:5000->5000/tcp   gallant_bartik

    使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

    create 命令和后续的run命令支持的选项都十分复杂,主要包括如下几大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关,参见表4-1、表4-2、表4-3。

表4-1 create命令与容器运行模式相关的选项

表4-2 create 命令与容器环境和配置相关的选项

表4-3 create 命令与容器资源限制和安全保护相关的参数

    其他比较重要的选项还包括:

            -l,--label=[]:以键值对方式指定容器的标签信息;

            --label-file=[]:从文件中读取标签信息。

2. 启动容器

       使用docker start 命令来启动一个已经创建的容器,例如启动刚创建的ubuntu容器:

[root@localhost ~]# docker start 187
187

此时,通过docker ps 命令可以查看一个运行中的容器:

[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1871724133e4        ubuntu:latest       "/bin/bash"              13 minutes ago      Up 21 seconds                                infallible_noyce
9620c7a16990        registry            "/entrypoint.sh /etc…"   4 days ago          Up 3 days           0.0.0.0:5000->5000/tcp   gallant_bartik

3.新建并启动容器

除了创建容器扣通过start命令启动,也可以直接新建并启动容器。所需要的命令主要为docker run,等价于先执行docker create 命令,再执行docker start 命令。

        例如,下面的命令输出一个"Hello World",之后容器自动终止:

[root@localhost ~]# docker run ubuntu /bin/echo 'hello world!'
hello world!

这跟在本地直接执行/bin/echo 'hello world'几乎感觉不出来任何区别。

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

        检查本地是否存在指定的镜像,不存在不从公有仓库下载;

        利用镜像创建一个容器,并启动该容器;

        分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

        从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

        从网桥的地址池配置一个IP地址给容器;

        执行用户指定的应用程序;

        执行完毕后被自动终止。

    下面的命令启动一个bash终端,允许用户进行交互:

    

[root@localhost ~]# docker run -it ubuntu:14.04 /bin/bash

其中,-t选项让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开,更多的命令选项可以通过man docker-run命令查看。

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

root@78f22c88d30f:/# pwd
/
root@78f22c88d30f:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@78f22c88d30f:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   17 pts/0    00:00:00 ps

在容器内用ps命令查看进程,可以看到,只运行了bash应用,并没有运行其他无关的进程。

用户可以按Ctrl+d或输入exit命令来退出容器;

root@78f22c88d30f:/# exit
exit

对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的退出的错误代码。

默认情况下,常见错误代码包括:

        125:Docker daemon执行出错,例如指定了不支持的Docker 命令参数;

        126:所指定命令无法执行,例如权限出错;

        127:容器内命令无法找到。

4.守护态运行

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可能通过添加-d参数来实现。

例如下面的从会在后台运行容器:

[root@localhost ~]# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1 ; done"
f39299d88402448e81e61733472ee0eb34d328387ad90b8c5af886689abee2b4

容器启动后会返回一个唯一的id,也可以通过docker ps 命令来查看容器信息:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f39299d88402        ubuntu              "/bin/sh -c 'while t…"   57 seconds ago      Up 54 seconds                           happy_liskov

此时,要获取容器的输出信息,可以如下使用docker logs命令:

[root@localhost ~]# docker logs f39
hello world
hello world
hello world
hello world
...

 4.2 终止容器

可以使用docker stop来终止一个运行中的容器。该命令格式为docker stop[-t|--time[10] [CONTAINER...]。

首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器:

[root@localhost ~]# docker stop f39
f39

注意

        docker kill命令会直接发送SIGKILL信号来强行终止容器。

        此外,当Docker容器中指定的应用终结时,容器也会自动终止。例如对于上一节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

          可以用docker ps -qa命令看到所有容器的ID。例如:    

[root@localhost ~]# docker ps -qa
f39299d88402

处于终止状态的容器,可以骑过docker start命令来重新启动:

[root@localhost ~]# docker start f39
f39
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f39299d88402        ubuntu              "/bin/sh -c 'while t…"   About an hour ago   Up 7 seconds                            happy_liskov

此外,docker restart命令会将一个运行的容器先终止,然后再重新启动它:

[root@localhost ~]# docker restart f39
f39
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f39299d88402        ubuntu              "/bin/sh -c 'while t…"   About an hour ago   Up 5 seconds                            happy_liskov

4.3 进入容器

1、下面示例如何使用该命令:

[root@localhost ~]# docker run -itd ubuntu
28ffdf86684a8a8cb6d6fdcc402d047c4bbeb07d895a838b55282b63edfe245e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
28ffdf86684a        ubuntu              "/bin/bash"         8 seconds ago       Up 5 seconds                            practical_rosalind
[root@localhost ~]# docker attach practical_rosalind
root@28ffdf86684a:/# 

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

 

2.exec命令

例如进入到刚创建的容器中,并启动一个bash:

[root@localhost ~]# docker exec -it 72b7 /bin/bash
root@72b76e7f4b01:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@72b76e7f4b01:/# 

可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。

注意,

通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。

 

4.4 删除容器

dokcer rm   删除处于终止或退出状态 的容器

docker rm -f 删除一个运行中的容器

 

4.5 docker使用现有容器生成新的镜像

/*运行docker run后 --则进入该容器里了 

            我们做一些变更,比如安装一些东西 ,然后针对这个容器进行创建新的镜像
*/

基本形式:

docker commit -m "change somth" -a "somebody info" container_id(docker ps -a获取id) 新镜像名字

eg.
Ian 
docker commit -m "install httpd" -a   ”frank  ie" 2c74d574293f frankie/centos  
  
/* 意义就是 为某一个功能,创建一个镜像    */

docker exec -it de8[id的简写] /bin/bash    --进入容器

 

/*
实例:
进入容器后,ifconfig ,wget等命令都不存在
可以利用yum进行安装 */
[root@64b1a3401832 /]# yum install -y net-tools wget

//查看此容器的版本
[root@64b1a3401832 /]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@64b1a3401832 /]# uname -a
Linux 64b1a3401832 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

//然后对刚刚的容器进行新创建,要回到原来的shell里
[root@localhost ~]# docker commit -m "centos_with_nettools_and_wget" -a "Frankie(作者名)" 64b  centos_with_net
c5b412fe1c33f5dd98030c5ed22503b255eca0aac21175e7312465db4cb595cf
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos_with_net     latest              c5b412fe1c33        27 seconds ago      294.1 MB
centos              latest              d83a55af4e75        4 weeks ago         196.7 MB
frankie             latest              d83a55af4e75        4 weeks ago         196.7 MB
[root@localhost ~]#

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值