容器是 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