天天看点

十二、Docker基本命令-容器类

容器是 Docker 的另一个核心概念。 简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

如果认为虚拟机是模拟运行的一整套操作系统(包括内核、 应用运行环境和其他系统环境)和跑在上面的应用。 那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

1、初体验容器

基于centos镜像启动docker容器,打印"hello world "

[root@hadoop108 ~]# docker run centos:7.5.1804 /bin/echo "hello world"

2、创建容器

[root@hadoop108 ~]# docker create -i -t centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker create -i -t -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash

3、查看容器

1)查看运行状态的容器

[root@hadoop108 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2)查看所有状态的容器

[root@hadoop108 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bf2f501bb6e2 centos:7.5.1804 "/bin/bash" 9 seconds ago Created wizardly_lumier

4、启动容器

[root@hadoop108 ~]# docker start bf2f501bb6e2

[root@hadoop108 ~]# docker ps

5、后台启动容器

[root@hadoop108 ~]# docker start -d bf2f501bb6e2

尖叫提示:参数-d表示后台启动

6、一步完成新建和启动容器

1)新建和启动容器一步完成,并且进入容器里面

[root@hadoop108 ~]# docker run -i -t centos:7.5.1804 /bin/bash

前面的操作是先创建容器, 然后再启动容器. 也可以使用run来直接新建并启动容器

说明

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

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

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

2)启动后台容器

[root@hadoop108 ~]# docker run -i -t -d centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker run -i -t -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash

说明:创建一个交互式的容器

-i: 允许你对容器内的标准输入 (STDIN) 进行交互

-t: 在新容器内指定一个伪终端或终端。

-h 配置容器的主机名

--name 给容器起名字

-d 后台启动

7、启动mysql容器

启动容器时,给容器附名称,设置密码,映射端口

[root@hadoop108 ~]# docker run -p 3306:3306 --name firstmysql -e MYSQL_ROOT_PASSWORD=000000 -d mysql:5.7

尖叫提示:参数-t 打开伪终端,参数-i标准输出, 退出伪终端 【Ctrl】+【D】 或者 exit

ctrl + p -> ctrl + q 退出容器,如果容器不是后台启动的,也不会死掉

8、停止容器

[root@hadoop108 ~]# docker stop bf2f501bb6e2

9、重启容器

[root@hadoop108 ~]# docker restart bf2f501bb6e2

10、进入容器

[root@hadoop108 ~]# docker exec -i -t bf2f501bb6e2 /bin/bash

[root@bf2f501bb6e2 /]#

通过指定 -it参数来保持标准输入打开, 并且分配一个伪终端。可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交五

11、退出容器

[root@bf2f501bb6e2 /]# exit

exit

[root@hadoop108 ~]#

Ctrl + p -> Ctrl +q

12、删除容器

1)删除已经停止的容器

[root@hadoop108 ~]# docker rm 1b29d1601792

1b29d1601792

2)删除运行状态的容器

[root@hadoop108 ~]# docker stop bf2f501bb6e2

[root@hadoop108 ~]# docker rm bf2f501bb6e2

3)强制删除容器

[root@hadoop108 ~]# docker rm -f bf2f501bb6e2

13、容器运行完自动删除

[root@hadoop108 ~]# docker run --rm centos:7.5.1804 /bin/echo "helloworld"

14、获取所有容器的id

[root@hadoop108 ~]# docker ps -a -q

15、杀死所有的docker容器

[root@hadoop108 ~]# docker kill $(docker ps -a -q)

[root@hadoop108 ~]# docker stop $(docker ps -a -q)

16、删除所有的docker容器

[root@hadoop108 ~]# docker rm -f $(docker ps -a -q)

[root@hadoop108 ~]# docker ps -aq | xargs docker rm -f

[root@hadoop108 ~]# docker rm -f `docker ps -a -q`

17、导入和导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入 和导出功能,这也是 Docker 自身提供的一个重要特性。

为了测试容器是否导出和导入成功, 我们在centos容器中创建一个新的文件

1)准备操作

[root@hadoop108 ~]# docker create -it centos:7.5.1804 /bin/bash

[root@hadoop108 ~]# docker ps -a

2)导出容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态.

[root@hadoop108 ~]# docker export 36712e68abdc > export_centos1.tar

[root@hadoop108 ~]# docker export -o export_centos2.tar 36712e68abdc

[root@hadoop108 ~]# docker export 36712e68abdc > './export_centos3.tar'

[root@hadoop108 ~]# docker export -o './export_centos4.tar' 36712e68abdc

[root@hadoop108 ~]# docker export 36712e68abdc > "./export_centos5.tar"

[root@hadoop108 ~]# docker export -o "./export_centos6.tar" 36712e68abdc

3)导入容器

[root@hadoop102 ~]# docker import export_centos1.tar export/centos:1.0.0

[root@hadoop108 ~]# docker import export_centos1.tar -- export/centos:1.0.0

4)使用新的镜像启动容器

[root@hadoop108 ~]# docker images

[root@hadoop108 ~]# docker run -it export/centos:1.0.0 /bin/bash

[root@1e7429044e63 /]#

18、查看容器详情

[root@hadoop108 ~]# docker container inspect 1e7429044e63

会以 json 格式返回包括容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息

19、查看容器内进程

这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等

[root@hadoop108 ~]# docker top 1e7429044e63

尖叫提示:容器必须是启动状态

20、查看容器统计信息

[root@hadoop108 ~]# docker stats --no-stream 1e7429044e63

会显示 CPU 、内存、存储、网络等使用情况的统计信息

21、容器和主机之间复制文件

容器和主机之间进行文件复制的时候, 要保证容器已经启动

1)Linux数据准备

[root@hadoop108 ~]# vim a.txt

I Love Docker

2)从主机复制到容器里面

[root@hadoop108 ~]# docker cp a.txt 1e7429044e63:/opt

3)进入容器查看

[root@hadoop108 ~]# docker exec -i -t 1e7429044e63 /bin/bash

4)容器数据修改

[root@1e7429044e63 opt]# vim a.txt

I Love Docker

I Love Linux

5)从容器复制数据到主机

[root@hadoop108 ~]# docker cp 1e7429044e63:/opt/a.txt ./

22、不进入容器,执行命令

[root@hadoop108 ~]# docker exec 1e7429044e63 ls -l /opt

[root@hadoop108 ~]# docker exec 1e7429044e63 cat /opt/a.txt

[root@hadoop108 ~]# docker exec 1e7429044e63 whoami

[root@hadoop108 ~]# docker exec 1e7429044e63 ps

[root@hadoop108 ~]# docker exec 1e7429044e63 ps aux

23、查看容器的访问日志

[root@hadoop108 ~]# docker logs 1e7429044e63

24、获取容器的PID

[root@hadoop108 ~]# docker inspect -f "{{ .State.Pid}}" 1e7429044e63

25、nsenter方式进入容器

[root@hadoop108 ~]# docker inspect -f "{{ .State.Pid}}" 1e7429044e63

13187

[root@hadoop108 ~]# nsenter --help

[root@hadoop108 ~]# nsenter -t 13187 -m -u -i -n -p

26、查看主机信息

在容器中执行,可以看到宿主机信息,隔离性略差

[root@1e7429044e63 /]# cat /proc/cpuinfo

[root@1e7429044e63 /]# free -m

[root@1e7429044e63 /]# Top

27、以脚本的方式进入容器

docker_in 脚本

[root@hadoop108 ~]# touch docker_in.sh

[root@hadoop108 ~]# chmod 755 docker_in.sh

[root@hadoop108 ~]# vim docker_in.sh

#!/bin/bash

# Use nsenter to access docker

docker_in(){

NAME_ID=$1

PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)

nsenter -t $PID -m -u -i -n -p /bin/bash

}

docker_in $1

[root@hadoop108 ~]# ./docker_in.sh mysql

root@9894fb3a1733:/#

-t -> --target

-m -> --mount

-u -> --uts

-i -> --ipc

-n -> --net

-p -> --pid

执行脚本,传入的参数是容器的名字或ID