Docker基本命令-容器类
容器是Docker的另一个核心概念,简单来说,容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
-
初体验容器
基于centos镜像启动docker容器,打印"hello world"[rootehadoop108 ~]# docker run centos:7.5.1884 /bin/echo "hello world"
-
创建容器
[root hadoop108 ~]# docker create -i -t centos:7.5.1884 /bin/bash [root hadoop108 ~]# docker create -i -t -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash
-
查看容器
- 查看运行状态的容器
[rootehadoop108 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 查看所有状态的容器
[rootehadoop108 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bf2f501bb6e2 centos:7.5.1804 "/bin/bash" 9s ago Created izardly_lumier
-
启动容器
[rootehadoop108 ~]# docker start bf2f5e1bb6e2 [rootehadoop1e8 ~]# docker ps
-
后台启动容器
[rootehadoop108 ~]# docker run -d bf2f501bb6e2
[root@docker108 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE MysqL 5.7 cdefeb1e283d 8 days ago 449MB hello-world latest d1165f221234 4 weeks ago 13.3kB centos 7.5.1804 cf49811e3cdb 2 years ago 208MB [root@docker108 ~]# docker run -i -t -h hadoop102 --name hadoop102 -d centos:7.5.1804 /bin/bash 199cc681fd50767c7a03a1538e3ed0554cfb1617 acbfe7e3e6046c5f03d07cc6 [root@docker108 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 199cc681fd50 centos:7.5.1804 "/bin/bash" 3s ago Up 2s hadoop102 [root@docker108 ~]# docker exec -i -t hadoop102 /bin/bash #进入容器 [root《hadoop162/]# read escape sequence
-i 交互
-t 终端或伪终端
--name 给容器起名字
-h 给容器里的主机起一个名字
docker run centos:7.5.1804 /bin/echo. "hello world" 基于centos这个镜像去运行容器,如果本地仓库不存在这个镜像,会去远程仓库下载,然后执行输出helloworld
退出容器: exit退出:当容器不是-d后台运行时,当使用exit会直接让容器从运行状态转为exited状态 ctrl+p->ctrl+q ,即使不是-d后台运行,退出后容器依旧是运行状态 注意:通过docker create -i -t方式创建的容器,默认会加上-d参数
-
一步完成新建和启动容器
- 新建和启动容器一步完成,并且进入容器里面
[root@hadoop108 ~]# docker run -i-t centos:7.5.1884 /bin/bash 前面的操作是先创建容器,然后再启动容器,也可以使用run来直接新建并启动容器 说明: (1)检查本地是否存在指定的镜像,不存在就从公有仓库下载: (2)利用镜像创建一个容器,并启动该容器: (3)分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
- 启动后台容器
[root@hadoop108 ~]# docker run -i -t -d centos:7.5.1804 /bin/bash [rootghadoop108 ]# docker run -i -t -h hadoop102 --name centos-hadoop182 -d centos:7.5.1804 /bin/bash 说明:创建一个交互式的容器 -i:允许你对容器内的标准输入(STDIN进行交互) -t:在新容器内指定一个伪终端或终端。 -h:配置容器的主机名 --name:给容器起名字 技巧:一个字母的,一个-,单词都是两个-
-
启动MysqL容器
启动容器时,给容器附名称,设置密码,映射端口[root@hadoop108 ~]# docker run -p 3306:3306 --name firstMysqL -e MysqL_ROOT_PASSWORD=000000 -d mysq1:5.7 提示:参数-t打开伪终端,参数-i标准输入,退出伪终端【Ctrl】+【D】或者exit ctrl+p>ctrl+q退出容器,如果容器不是后台启动的,也不会死掉
-
停止容器
[root@hadoop188 ~]# docker stop bf2f501bb6e2
-
重启容器
[root@hadoop108 ~]# docker restart bf2f501bb6e2
-
进入容器
[root@hadoop188 ~]# docker exec -i -t bf2f5e1bb6e2/bin/bash [rootebf2f5e1bb6e2 /]# 注意:通过指定-it参数来保持标准输入打开,并且分配一个伪终端。可以看到会打开一个新的 bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互
-
退出容器
[root@bf2f501bb6e2 /]# exit exit [root@hadoop188 ~]# 说明:退出容器也可以ctrl+p->ctrl+q
-
删除容器
-
删除己经停止的容器
[root@hadoop108 ~]# docker rm 1b29d1601792 1b29d1681792
-
删除运行状态的容器
[root@hadoop188 ~]# docker stop bf2f5e1bb6e2 [root@hadoop108 ~]# docker rm bf2f501bb6e2
-
强制删除容器
[root@hadoop108 ~]# docker rm -f bf2f5e1bb6e2
-
强制删除所有docker容器
[root@hadoop108 ~]# docker rm -f `docker ps -a -q` [root@hadoop108 ~]# docker rm -f $(docker ps -a -q) [root@hadoop108 ~]# docker ps -aq | xargs docker rm -f
-
-
[root@hadoop108 ~]# docker run --rm centos:7.5.1804 /bin/echo "helloworld"
-
获取所有容器的id
[root@hadoop108 ~]# docker ps -a -q
-
杀死所有的docker容器
[root@hadoop108 ~]# docker kill $(docker ps-a -q) [root@hadoop188 ~]# docker stop $(docker ps -a -q) 说明:kill相当于拔电源线,stop相当于正常关机,kill速度更快
-
导入和导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用D0kr的导入和导出功能,这也是Docker自身提供的一个重要特性 为了测试容器是否导出和导入成功,我们在centos容器中创建一个新的文件
-
准备操作
[root@hadoop1e8 ~]# docker create -it centos:7.5.1804 /bin/bash [root@hadoop1e8 ~]# docker ps -a
-
导出容器
[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 36712e68abdc > "./export_centos5.tar" [root@hadoop108 ~]#docker export -o "./export_centos6.tar"36712e68abdc
-
导入容器
[root@hadoop102 ~]#docker import export_centos1.tar export/centos:1.0.0 [root@hadoop108 ~]#docker import export_centos1.tar --export/centos:1.0.8
-
使用新的镜像启动容器
[root@hadoop108 ~]# docker images [root@hadoop108 ~]# docker run -it export/centos:1.0.0 /bin/bash
注意:save和load一起使用,操作的镜像;export和import一起使用,操作的容器
-
-
查看容器详情
[root@hadoop108 ~]# docker container inspect 1e7429044e63 说明:会以json格式返回包括容器id、创建时间、路径、状态、镜像、配置等在内的各项信息
-
查看容器内进程
[root@hadoop108 ~]# docker top 1e7429044e63
说明:容器必须是启动状态下才能查看
- 查看容器统计信息
[root@hadoop108 ~]# docker stats --no-stream 1e7429044e63
说明:会显示CU、内存、存储、网络等使用情况的统计信息
-
容器和主机之间复制文件
容器和主机之间进行文件复制的时候,要保证容器已经启动
- linux数据准备
[root@hadoop108 ~]# vim a.txt I love Docker
- 从主机复制到容器里面
[root@hadoop108 ~]# docker cp a.txt 1e7429044e63:/opt
- 进入容器查看
[root@hadoop108 ~]# docker exec -i-t 1e7429044e63 /bin/bash
- 容器数据修改
[root@le7429044e63 opt]# vim a.txt I love Docker I love Linux
- 从容器复制数据到主机
[root@hadoop108~]# docker cp 1e7429044e63:/opt/a.txt ./
-
不进入容器,执行命令
[root@hadoop108 ~]# docker exec 1e7429844e63 1s -1 /opt
[root@hadoop108 ~]# docker exec 1e7429044e63 cat /opt/a.txt
[root@hadoop108 ~]# docker exec 1e7429844e63 whoami
[root@hadoop108 ~]#docker exec 1e7429844e63 ps
[root@hadoop108 ~]# docker exec 1e7429044e63 ps aux
- 查看容器的访问日志
[root@hadoop108 ~]# docker logs 1e7429844e63
- 获取容器的PID
[root@hadoop108 ~]docker inspect -f "{.State.Pid))" 1e7429044e63.
- nsenter方式进入容器
[root@hadoop108 ~]# docker inspect -f "{.State.Pid)]" 1e7429044e63
13187
[root@hadoop108 ~]# nsenter --help
[root@hadoop108 ~]# nsenter -t 13187 -m -u -i -n -p
-
查看主机信息
在容器中执行,可以看到宿主机信息,也证明了容器的隔离性是相比虚拟机和物理机来说略差的[root@1e7429044e63 /]# cat /proc/cpuinfo [root@1e7429044e63 /]# free -m [root@1e7429844e63 /]# Top
-
以脚本的方式进入容器
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 }}" $SNAME_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
执行sh脚本的几种方式