目录
五、Docker 容器操作
1、创建容器与运行容器
2、容器的启动与停止
3、容器的运行与终止
4、容器的进入
5、容器的导出与导入
6、容器的删除
7、文件复制
8、查看容器资源使用率
9、查看容器进程状态
10、更新容器配置
容器是Docker 的另一个核心概念,简单说,容器是镜像的一个运行实例,是独立运行
的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。
镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
下面将具体介绍围绕容器的具体操作。
Docker 的创建就是将镜像加载到容器的过程,Docker 的容器十分轻量级,用户可以随
时创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个
进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全
停止。停止的容器可以重新启动并保留原来的修改。可以使用docker create 命令新建一个容器。
命令格式:docker create [选项]… 镜像运行的程序
常用选项:
[root@localhost ~]# docker create -it centos /bin/bash
43116b0ce52ba3f53e72e3d0b26b348fa85ae7ff9d998addec6c11c20fbec146
使用docker create 命令创建新容器后会返回一个唯一的ID。
可以使用docker ps 命令来查看所有容器的运行状态。添加-a 选项可以列出系统中所有容器状态。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43116b0ce52b centos "/bin/bash" About a minute ago Created cool_mcnulty
输出信息显示容器的ID 号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中状态一栏为空表示当前的容器处于停止状态。
启动停止容器可以使用docker start 命令。
命令格式:docker start 容器的ID/名称
[root@localhost ~]# docker start 43116b0ce52b
43116b0ce52b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43116b0ce52b centos "/bin/bash" 4 minutes ago Up 5 seconds cool_mcnulty
容器启动后,可以看到容器状态一栏已经变为UP,表示容器已经处于启动状态。如果用户想创建并启动容器,可以直接执行docker run 命令,等同于先执行docker create 命令,再执行docker start 命令。需要注意只要后面的命令运行结束,容器就会停止。
当利用docker run 来创建容器时,Docker 在后台的标准运行过程是这样的:检查本地是否存在指定的镜像,当镜像不存在时,会从公有仓库下载;利用镜像创建并启动一个容器;分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;分配一个地址池中的IP 地址给容器;执行用户指定的应用程序;执行完毕后容器被终止运行。
例如,创建容器并启动执行一条shell 命令:
[root@localhost ~]# docker run centos /bin/bash -c ls /
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
这和在本地直接执行命令几乎没有区别。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ada48f9ffca1 centos "/bin/bash -c ls /" 54 seconds ago Exited (0) 54 seconds ago sleepy_edison
43116b0ce52b centos "/bin/bash" 6 minutes ago Up 2 minutes cool_mcnulty
查看容器的运行状态,可以看出容器在执行完”/usr/bin/bash -c ls” 命令之后就停止了。
有时候需要在后台持续的运行这个容器,就需要让docker 容器在守护态形式在后台进行运行。可以在docker run 命令之后添加-d 选项来实现。但是需要注意容器所运行的程序不能结束。
例如,下面的容器会持续在后台进行运行:
[root@localhost ~]# docker run -d nginx /bin/bash -c "while true;do echo hello;done"
a6fa85aec0aaee1f3e232c610c94b56367eb85964b9ae21dafb5dd2fe688fb65
docker ps查看容器,-a 查看所有容器,-q 只查看容器ID
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6fa85aec0aa nginx "/docker-entrypoint.…" 41 seconds ago Up 40 seconds 80/tcp sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 4 minutes ago Exited (0) 4 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 9 minutes ago Up 5 minutes cool_mcnulty
查看容器的运行状态,可以看出容器始终处于UP,运行状态。
查看容器内的输出
[root@localhost ~]# docker logs a6fa85aec0aa
hello
hello
hello
hello
hello
^C
[root@localhost ~]#
如果需要终止运行的容器,可以使用docker stop 命令完成。
命令格式:docker stop 容器的ID/名称
[root@localhost ~]# docker stop a6fa85aec0aa
a6fa85aec0aa
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6fa85aec0aa nginx "/docker-entrypoint.…" 5 minutes ago Exited (137) 10 seconds ago sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 8 minutes ago Exited (0) 8 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 14 minutes ago Up 10 minutes cool_mcnulty
查看容器的运行状态,可以看出容器处于Exited,终止状态。
需要进入容器进行相应操作时,可以使用docker exec 命令或者docker attach命令进入运行着的容器。
命令格式:docker exec -it 容器ID/名称/bin/bash
其中,-i 选项表示让容器的输入保持打开;
-t 选项表示让Docker 分配一个伪终端。
例如:进入正在运行着的容器43116b0ce52b:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6fa85aec0aa nginx "/docker-entrypoint.…" 5 minutes ago Exited (137) 10 seconds ago sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 8 minutes ago Exited (0) 8 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 14 minutes ago Up 10 minutes cool_mcnulty
[root@localhost ~]# docker exec -it 43116b0ce52b /bin/bash
[root@43116b0ce52b /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6fa85aec0aa nginx "/docker-entrypoint.…" 7 minutes ago Exited (137) 2 minutes ago sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 11 minutes ago Exited (0) 11 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 16 minutes ago Up 12 minutes cool_mcnulty
#可以看到exit退出不会使容器停止
用户可以通过所创建的终端来输入命令,通过exit 命令退出容器。
通过Ctrl+pq命令退出容器并保证容器在后台继续运行。
[root@localhost ~]# docker exec -it 43116b0ce52b /bin/bash
[root@43116b0ce52b /]# read escape sequence
用户可以将任何一个Docker 容器从一台机器迁移到另一台机器。在迁移过程中,首先需要将已经创建好的容器导出为文件,可以使用docker export 命令实现,无论这个容器是处于运行状态还是停止状态均可导出。导出之后可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
命令格式:docker export 容器ID/名称>文件名
例如,导出343e5da0caed容器到文件centos-exp:
[root@localhost ~]# docker run -it centos /bin/bash
[root@343e5da0caed /]# touch crushlinux
[root@343e5da0caed /]# [root@localhost ~]#
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
343e5da0caed centos "/bin/bash" About a minute ago Up About a minute fervent_nash
a6fa85aec0aa nginx "/docker-entrypoint.…" 17 minutes ago Exited (137) 11 minutes ago sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 20 minutes ago Exited (0) 20 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 25 minutes ago Up 21 minutes cool_mcnulty
[root@localhost ~]# docker export 343e5da0caed > centos-exp
[root@localhost ~]# ll centos-exp
-rw-r--r--. 1 root root 238572032 8月 1 18:03 centos-exp
导出的文件从A 机器拷贝到B 机器,之后使用docker import 命令导入,成为镜像。
命令格式:cat 文件名| docker import – 生成的镜像名称:标签
例如,导入文件centos7.tar成为本地镜像:
[root@localhost ~]# cat centos-exp | docker import - centos:exp
sha256:74ef60dea93af6e0c33f229670510288d38e4f8f574608635c4b64b5514ea8c2
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos exp 74ef60dea93a 13 seconds ago 231MB
nginx latest 605c77e624dd 19 months ago 141MB
centos latest 5d0da3dc9764 22 months ago 231MB
docker start|stop|restart|kill //运行已停止的容器|停止一个正在运行的容器|重启一个容器|杀死一个正在运行的容器
可以使用docker rm 命令将一个已经终止状态的容器进行删除。
命令格式:docker rm 容器ID/名称
例如,删除ID 号为a6fa85aec0aa的容器:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
343e5da0caed centos "/bin/bash" 7 minutes ago Up 7 minutes fervent_nash
a6fa85aec0aa nginx "/docker-entrypoint.…" 23 minutes ago Exited (137) 18 minutes ago sharp_murdock
ada48f9ffca1 centos "/bin/bash -c ls /" 26 minutes ago Exited (0) 26 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 32 minutes ago Up 28 minutes cool_mcnulty
[root@localhost ~]# docker rm -f a6fa85aec0aa
a6fa85aec0aa
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
343e5da0caed centos "/bin/bash" 8 minutes ago Up 8 minutes fervent_nash
ada48f9ffca1 centos "/bin/bash -c ls /" 27 minutes ago Exited (0) 27 minutes ago sleepy_edison
43116b0ce52b centos "/bin/bash" 32 minutes ago Up 28 minutes cool_mcnulty
如果删除一个正在运行的容器,可以添加-f 选项强制删除,但是建议先将容器停止再做删除操作。
Docker 默认的存储目录为/var/lib/docker,Docker的镜像、容器、日志等内容全部都存储在此,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM 逻辑卷。从而避免Docker 运行过程中存储目录容量不足。
删除所有容器命令:docker rm -f $(docker ps -qa)
[root@localhost ~]# docker rm -f $(docker ps -qa)
343e5da0caed
ada48f9ffca1
43116b0ce52b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
将主机/root/anaconda-ks.cfg目录拷贝到容器adbbad846b1b的/tmp目录下。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adbbad846b1b centos "/bin/bash" 9 seconds ago Created busy_hawking
[root@localhost ~]# docker cp /root/anaconda-ks.cfg adbbad846b1b:/tmp
Successfully copied 3.07kB to adbbad846b1b:/tmp
[root@localhost ~]# docker attach adbbad846b1b
You cannot attach to a stopped container, start it first #此错误为容器未启动
[root@localhost ~]# docker start adbbad846b1b #启动容器
adbbad846b1b
[root@localhost ~]# docker attach adbbad846b1b #进入容器
[root@adbbad846b1b /]# ls /tmp #查看目录
anaconda-ks.cfg ks-script-4luisyla ks-script-o23i7rc2 ks-script-x6ei4wuu
[root@localhost ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
adbbad846b1b busy_hawking 0.00% 544KiB / 3.682GiB 0.01% 656B / 0B 0B / 0B 1
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adbbad846b1b centos "/bin/bash" 6 minutes ago Up 4 minutes busy_hawking
[root@localhost ~]# docker top ad
UID PID PPID C STIME TTY TIME CMD
root 6558 6535 0 18:16 pts/0 00:00:00 /bin/bash
--restart=always #在docker服务重启时自动启动容器
[root@localhost ~]# docker update --restart=always ad
ad