##### 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 -aCONTAINER 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/bashUnable 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 -aCONTAINER 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 3ffda31384ac3ffda31384ac
[root@docker2 ~]# docker ps -aCONTAINER 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/bashfac0c75a113209dfb1f20539ddc148d6d30ebbd8316877dbb32a341de642a3bd
[root@docker2 ~]# docker psCONTAINER 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/bashroot@fac0c75a1132:/# exit
exit
```
4、容器的导出与导入
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态。导出文件可以传输到其他容器,也可以通过相应的导入命令实现容器的迁移。
命令格式:
docker export 容器ID/名称  > 文件名
```
[root@docker2 ~]# docker ps -aCONTAINER 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:testsha256:e8023767dfdc5ffc65d531a996259d32c6aee5cb491b6648887bc507d155fdcc
```
5、容器的删除
docker rm
命令格式:
docker rm 容器ID/名称
```
[root@docker2 ~]# docker psCONTAINER 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 fac0c75a1132fac0c75a1132
```
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 -aCONTAINER 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/bashUnable 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 -aCONTAINER 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 3ffda31384ac3ffda31384ac
[root@docker2 ~]# docker ps -aCONTAINER 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/bashfac0c75a113209dfb1f20539ddc148d6d30ebbd8316877dbb32a341de642a3bd
[root@docker2 ~]# docker psCONTAINER 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/bashroot@fac0c75a1132:/# exit
exit
```
4、容器的导出与导入
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态。导出文件可以传输到其他容器,也可以通过相应的导入命令实现容器的迁移。
命令格式:
docker export 容器ID/名称  > 文件名
```
[root@docker2 ~]# docker ps -aCONTAINER 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:testsha256:e8023767dfdc5ffc65d531a996259d32c6aee5cb491b6648887bc507d155fdcc
```
5、容器的删除
docker rm
命令格式:
docker rm 容器ID/名称
```
[root@docker2 ~]# docker psCONTAINER 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 fac0c75a1132fac0c75a1132
```

docker默认的存储目录在/var/lib/docker下,Docker的镜像、容器、日志等内容全部存储在此目录中,可以单独使用大容量的分区来存储这些内容。一般选择建立LVM逻辑卷,从而避免Docker运行过程中存储目录容量不足的问题。