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 删除一个运行中的容器
/*运行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 ~]#