##### 1.4Docker容器操作
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、启动、停止、移动、删除、暂停(挂起)。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行一部分。
1、容器的创建与启动
命令格式:
docker create [选项] 镜像 运行的程序
常用选项:
-i ------ 让容器的输入保持打开状态
-t ------- 让Docker分配一个伪终端
-d-------后台运行
```
[root@docker2 ~]# docker create -it nickistre/centos-lamp /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
d149428efbcb5f56b33057977a16f7daca79defcd86561e1b14120de55fe7505
```
它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出状态。
```
###查看容器的信息
[root@docker2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d149428efbcb nickistre/centos-lamp "/bin/bash" 35 seconds ago Created infallible_noyce
```
docker ps -a命令的输出信息显示了容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中状态一栏为空,表示当前的容器处于停止状态。
启动处于停止状态的容器可以使用docker start命令。
```
[root@docker2 ~]# docker start d149428efbcb
d149428efbcb
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d149428efbcb nickistre/centos-lamp "/bin/bash" 2 minutes ago Up 38 seconds 22/tcp, 80/tcp, 443/tcp infallible_noyce
```
启动容器后,可以看到容器状态一栏变为up,表示容器已经处于启动状态。
如果用户想创建并启动容器,可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令。
利用docker run命令创建容器时,Docker在后台的标准运行过程如下:
(1)检查本地是否存在指定的镜像。若镜像不存在,会从公共仓库下载。
(2)利用镜像创建并启动一个容器
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一个可读写层。
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中。
(5)分配一个地址池中的IP地址给容器。
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
```
[root@docker1 ~]# docker ps -a | grep d149428efbcb
d149428efbcb nickistre/centos-lamp "/bin/bash" 8 minutes ago Up 6 minutes 22/tcp, 80/tcp, 443/tcp infallible_noyce
[root@docker2 ~]# docker run centos /usr/bin/bash -c ls /
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@docker2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08c5400ddcfc centos "/usr/bin/bash -c ls…" About a minute ago Exited (0) About a minute ago zen_volhard
d149428efbcb nickistre/centos-lamp "/bin/bash" 12 minutes ago Up 10 minutes 22/tcp, 80/tcp, 443/tcp infallible_noyce
```
查看容器的运行状态,可以看出,容器在执行"/usr/bin/bash -c ls"命令之后就停止了。
有时候需要在后台持续地运行一个容器,这就需要让Docker容器以守护进程的形式在后台运行。可以在docker run命令之后添加-d选项来实现,但是需要注意容器所运行的程序不能结束。
```
[root@docker1 ~]# docker run -itd --name mycentos centos:7 /bin/bash
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
76a2455cc7d58e6ca6e56483b6a32ebe710a14b34126b1508bbf01be342ac9c2
[root@docker2 ~]#docker execit -it mycentos /bin/bash
[root@docker2 ~]#yum repolist
[root@docker2 ~]# docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
1fe95e863cc797033d12bf86cf928b82ec8d20095dbfe79d60e0a7ad4a513de7
[root@docker2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ffda31384ac centos "/usr/bin/bash -c 'w…" 15 seconds ago Up 13 seconds epic_ardinghelli
```
2、容器的运行与终止
docker stop
docker stop 容器的ID/名称
```
[root@docker2 ~]# docker stop 3ffda31384ac
3ffda31384ac
[root@docker2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ffda31384ac centos "/usr/bin/bash -c 'w…" 2 minutes ago Exited (137) 3 seconds ago epic_ardinghelli
```
可以看出容器处于Exited的终止状态
3、容器的进入
当需要进入容器进行相应操作时,可以使用docker exec命令
命令格式:
docker exec -it 容器ID/名称 /bin/bash
-i ---让容器的输入保持打开状态
-t---让Docker分配一个伪终端
```
[root@docker2 ~]# docker run -itd nginx /bin/bash
fac0c75a113209dfb1f20539ddc148d6d30ebbd8316877dbb32a341de642a3bd
[root@docker2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fac0c75a1132 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp boring_nobel
[root@docker2 ~]# docker exec -it fac0c75a1132 /bin/bash
root@fac0c75a1132:/# exit
exit
```
4、容器的导出与导入
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态。导出文件可以传输到其他容器,也可以通过相应的导入命令实现容器的迁移。
命令格式:
docker export 容器ID/名称 > 文件名
```
[root@docker2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fac0c75a1132 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp boring_nobel
[root@docker2 ~]# docker export fac0c75a1132 >nginxtar
[root@docker2 ~]# ls -l nginxtar
-rw-r--r-- 1 root root 144023040 Feb 18 14:02 nginxtar
```
将导出的文件从A机器复制到B机器,之后使用docker import命令导入镜像。
命令格式:
cat 文件名 |docker import - 生成的镜像名称:标签
```
[root@docker2 ~]# scp nginxtar 192.168.200.11:/root
[root@docker1 ~]# cat nginxtar |docker import - nginx:test
sha256:e8023767dfdc5ffc65d531a996259d32c6aee5cb491b6648887bc507d155fdcc
```
5、容器的删除
docker rm
命令格式:
docker rm 容器ID/名称
```
[root@docker2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fac0c75a1132 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 80/tcp boring_nobel
[root@dokcer2 ~]# docker rm -f fac0c75a1132
fac0c75a1132
```
docker默认的存储目录在/var/lib/docker下,Docker的镜像、容器、日志等内容全部存储在此目录中,可以单独使用大容量的分区来存储这些内容。一般选择建立LVM逻辑卷,从而避免Docker运行过程中存储目录容量不足的问题。