Day 04 Docker 容器
1.容器命令
docker run 镜像id 新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id 删除指定容器
docker start 容器id #启动容器
docker restart容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
说明:我们有了镜像才可以创建容器,Linux,下载centos镜像来学习
docker container
里面有各种各样的命令
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
.....
2.新建容器并启动
docker run [可选参数] image
or docker container run [可选参数] image
参数说明
参数名称 | 参数作用 |
–name=‘Name’ | 为启动的容器设置一个名字 |
-d | 以守护进程方式运行,后台方式运行 |
-it | 使用交互方式运行,进入容器查看内容 |
-p | 指定容器的端口 -p 8080(宿主机):8080(容器) |
-P(大写) | 随机指定端口 |
关于-d
使用 docker run -d
在后台创建并启动名称为 centos
的容器,通过 docker ps
命令没有查找到处于运行状态的容器,通过 docker ps -a
命令查找到已经停止运行的 centos
容器。
于是疑惑产生了, -d
是保证容器在后台运行,为什么我的容器停止运行了呢?
前面提到过, docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
中有一个 COMMAND
参数,容器启动后会执行 COMMAND
命令,它的默认值为 /bin/bash
。也就是说容器在后台启动成功后,执行了 COMMAND
命令后直接关闭了。
了解到该原理后,我们可以通过在 docker run -d
后增加一个驻留在进程中长期运行的命令就可以保证容器不关闭了。比如死循环
docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done"
在sh目录下循环打印 666 模拟日志
3.退出容器
[root@97b50fe359e8 /]# exit
exit
[root@hecs-x-medium-2-linux-20201118090009 ~]#
exit #容器直接退出
ctrl +P +Q #容器不停止退出
4.列出所有运行的容器
1.docker ps 命令
列出当前运行的容器
docker ps
------------------------------------------------------------------------
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
faaac215cea0 centos "/bin/bash" 23 seconds ago Up 22 seconds dazzling_borg
docker ps -a # 列出所有的容器包括 已经结束的
docker ps -a|grep nginx
------------------------------------------------------------------------
757de974c587 nginx "/docker-entrypoint.…" 3 hours ago Exited (0) 51 minutes ago nginx01
docker ps -aq # 列出所有容器的 id
docker ps -aq
------------------------------------------------------------------------
faaac215cea0
97b50fe359e8
667d29058e73
18f61570de4a
....
5.删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #删除指定的容器
docker ps -a -q|xargs docker rm #删除所有的容器
6.启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止容器(id)
注意:我们在使用docker ps -a
中所查看到的其实是一个个实打实 容器 他并没有 因为 run 的结束而被 销毁掉,而是被 搁置了,搁置的多了也是十分占据内存的,这些搁置的容器,给我们提供的是 提示 和 restart
7.进入当前正在运行的容器
在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。
1.attach(重要)
attach 是最早 docker 官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令 进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗 口退出时,容器结束。
2.exec(重要)
既 attach 之后,exec 是官方推出的有一个新的进入容器的命令,这个命令相当于在容器中执行一个命令。
3.nsenter
需要配合 docker inspect 来使用(早期没有 exec 命令时,企业当中最长用的方式之一),Docker 是用 golang 语言开发,所以它也支持 go 语言的摸版语法。
没用过!
[root@instance-gvpb80ao docs]# nsenter --target $( docker inspect -f {{.State.Pid}}
nginxv1 ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@6f99ae8757f7:/#
4.ssh
在生产环境中排除了使用 docker attach 命令进入容器之后,相信大家第一个想到的就是 ssh。在镜像(或容器) 中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有 使用 Docker 的情况)也是这样做的。但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。
区别
docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker attach # 进入容器正在执行的终端
8.导入与导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人和导出功能,这也 是 Docker 自身提供的一个重要特性。
export 保存的镜像只能由import导入
save 保存的镜像只能由load导入
导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态 可以使用 docker [container] export 令,该命令格式为:
export 导出容器为镜像[export]
docker export [容器ID|容器名称]>[压缩包名称]
docker ps
--------------------------------------------
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
870a4301ce9f centos "/bin/bash" 7 minutes ago Up 7 minutes pedantic_maxwell
docker export 870a4301ce9f>centos1.tar
--------------------------------------------
ll
--------------------------------------------
total 217148
-rw-r--r-- 1 root root 222356480 Dec 1 15:14 centos1.tar
save 导出镜像为镜像压缩包(save)
docker save [镜像id|镜像名称]>[压缩包]
参数:
-o 指定在一个压缩包内保存多个镜像
docker save -o save_many.tar nginx hello-world centos
先写打包的名称 然后以空格隔开
docker save -o save_many.tar nginx hello-world centos
ll
--------------------------------------------
total 568224
-rw-r--r-- 1 root root 0 Dec 1 15:18 centos1.tar
-rw-r--r-- 1 root root 222366720 Dec 1 15:19 save_centos.tar
-rw------- 1 root root 359482368 Dec 1 15:32 save_many.tar
commit 将容器导出为镜像
docker commit [参数] [容器ID] [新的镜像名称]
-a : 指定维护者
-m :简介
-p :当保存容器时,容器暂停运行
导入容器
import 导入包为镜像
docker import [压缩包名称] [镜像名称:Tag]
docker import centos1.tar centos:v1
--------------------------------------------
sha256:2d82ce5bce4aac4143c7718833120855dd134f814cf15571fe114fe2aaeb4a4b
docker images
--------------------------------------------
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 2d82ce5bce4a 9 seconds ago 0B
nginx latest bc9a0695f571 6 days ago 133MB
centos latest 0d120b6ccaa8 3 months ago 215MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
load 导入一个或多个镜像(取决于压缩包)
docker load <[压缩包名字] == dockerload -i [压缩包名字]
[root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# ll
total 568224
-rw-r--r-- 1 root root 0 Dec 1 15:18 centos1.tar
-rw-r--r-- 1 root root 222366720 Dec 1 15:19 save_centos.tar
-rw------- 1 root root 359482368 Dec 1 15:32 save_many.tar
[root@docker ~]# docker load < save_centos.tar
Loaded image: centos:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 3 months ago 215MB
对比
save和load 与 export和import 区别?
1、save保存比较完整,export仅仅保存镜像。
2、save保存的体积大于export保存的体积(save包含了构建信息,或者缓存文件,更全面)
3、import可以重命名,load不能重命名
4、save可以保存多个镜像,export只能保存一个容器。
save和export 使用场景?
1、打包镜像一般用save, 打包容器一般用export
2、需要构建历史信息的,可以使用save。
docker export 和 docker commit 区别?
1、docker export导出的是压缩包
2、docker commit导出为镜像
9.常用其他命令
1.后台启动命令
# 命令 docker run -d 镜像名
➜ ~ docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
# 问题docker ps. 发现centos 停止了
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没
2.查看日志
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or
relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs
(default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37)
or relative (e.g. 42m for 42 minutes)
➜ ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模
拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
3.查看容器中进程信息 ps
docker top 容器id
4.查看镜像的元数据
# 命令
docker inspect 容器id
#测试
➜ ~ docker inspect 55321bcae33d
[
{
"Id":
"55321bcae33d15da8280bcac1d2bc1141d213bcc8f8e792edfd832ff61ae5066",
"Created": "2020-05-15T05:22:05.515909071Z",
"Path": "/bin/sh",
...
}
10.把容器 内容 拷贝到主机上
.
当前目录
docker cp 容器id:容器内路径 主机目的路径
docker cp 2ad9bd2e9f03:/home/Test/. /home/.
docker cp 主机文件路径 容器id:容器内部路径