操作docker容器

时间:2023-11-28 11:10:56

Docker容器时镜像的一个运行实例,而镜像是静态的只读文件,容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行的环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及他们必须的运行环境。

1、创建容器

(1)、新建容器:docker create

docker create -it ubuntu:14.04

操作docker容器

使用该命令创建的容器处于停止状态,可以使用docker start 命令来启动他。

docker start efeb322b8d67/flamboyant_meitner

操作docker容器

(2)、新建并启动容器:docker run

docker run -it ubuntu:14.04 echo 'hello world'

操作docker容器

这跟在本地直接运行echo 'hello world'几乎感觉不出任何区别。当利用docker run 来创建并启动容器时,Docker在后台运行的标准操作包括:

①、检查本地是否存在指定镜像,不存在就从公有仓库下载;

②、利用镜像创建一个容器,并启动改容器;

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

④、从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中;

⑤、从网桥的地址池中配置一个IP地址给容器;

⑥、执行用户指定的应用程序;

⑦、执行完毕后容器自动终止。

下面的命令启动一个bash终端,允许用户进行交互:

操作docker容器

其中,-t选项是让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。

在交互模式下,用户可以通过所创建的终端来输入命令。用户可以按Ctrl+d或输入exit命令来退出容器。对于所创建的bash容器,当时用exit命令退出之后,容器就自动处于退出(Exited)状态了。这是因为对docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

某些时候,执行docker run 会报错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码。

①、125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;

②、126:所指定的命令无法执行,例如权限出错。

③、127:容器内命令无法找到。

命令执行后出错,会默认返回错误码。

3、守护态运行

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

docker run -d ubuntu:14.04 /bin/sh -c "while true;do echo hello world;sleep 1 ;done"

操作docker容器

此时,要获取容器的输出信息,可以使用docker logs命令:

docker logs 207dce165b3c

操作docker容器

补充:如果是springboot项目,需要查看日志,可以使用参数-v 将容器中的日志目录挂载到宿主机中的指定目录,方便查看。

docker run --name demo(容器名称) -d -p (宿主机端口):(容器端口) -v /data/logs(宿主机目录):/usr/(容器目录,在/usr目录下面)  demo(镜像名称)

此时我们便可以在/data/logs(宿主机目录)目录下面查看对应的日志,而不用每次都进入容器中查看了。

4、终止容器:docker stop

可以使用docker stop来终止一个运行中的容器。格式为:docker stop [-t|--time[=10]] [CONTAINER...]。 首先向容器发送SIGTERM信号,等待一段超时时间(默认10秒)之后,再发送SIGKILL信号来终止容器:

docker stop 207dce165b3c

注意:docker kill命令会直接发送SIGKILL信号来强行终止容器。

此外,当Docker容器中指定的应用终止时,容器也会自动终止。

补充:docker restart命令会将一个运行状态的容器先停止,然后在重新启动它:

docker restart 207dce165b3c

5、进入容器

在使用-d参数时,容器启动后会进入后台(守护状态),用户无法看到容器中的信息,也无法进行相关操作。此时可以使用docker attach或docker exec命令,或者第三方的nsenter工具等。

(1)、docker attach命令,其格式为:docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER(容器名称或ID)

①、--detach-keys[=[]] :指定退出attach模式的快捷键序列,默认是Ctrl-p ctrl-q;

②、--no-stdin=true|false:是否关闭标准输入,默认是保存打开;

③、--sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。

docker attach 207dce165b3c

操作docker容器

注意:使用attach命令并不方便,当多个窗口同时使用attach命令连到同一个容器时,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行了。

(2)、docker exec命令(推荐方式)

格式:docker exec [-d | --detach] [--detach-keys[=[]]] [-i | --interactive] [--privileged] [-t | tty] [-u | --user[=USER]] CONTAINER [ARG...]。

重要参数解析:

①、-i,--interactive=true | false:打开标准输入接受用户输入命令,默认为false;

②、--privileged=true | false:是否给执行命令以最高权限,默认为false;

③、-t,--tty=true | false:分配伪终端,默认false;

④、-u,--user=" ":执行命令的用户名或ID。

例如进入某个容器中,并启动一个bash:

docker exec -it b624c19ed822 /bin/bash

操作docker容器

6、删除容器

可以使用docker rm命令来删除处于终止或退出状态的容器,其格式为:docker rm [-f | force] [-l | --link] [-v | --volumes] CONTAINER [CONTAINER ...]。

总要参数解析:

①、-f,--force=false:是否强行终止并删除一个运行中的容器;

②、-l,--link=false:删除容器的连接,但保留容器;

③、-v,--volumes=false:删除容器挂载的数据卷。

例如删除指定的容器:

docker rm b624c19ed822

操作docker容器

注意:默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

7、导入导出容器

有时,我们需要将容器从一个系统迁移到另一个系统,此时,可以使用docker的导入导出功能。

(1)、导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,都可以使用docker export命令,格式为:docker export [-o | --output[=" "]] CONTAINER。其中,-o选项用来指定导出的tar文件名,也可以直接通过重定向来实现。

docker export -o test_for_run.tar 57e6130011b5
或者
docker export 57e6130011b5 > test_for_run.tar

操作docker容器

之后可以将导出的tar文件传输到其他机器上,然后通过导入命令导入到系统中,从而实现容器的迁移。

(2)、导入容器

导出的文件又可以使用docker import命令导入变成镜像,格式为:docker import [-c | --change[=[]]] [m | --message[=MESSAGE]] file |URL|- [REPOSITORY[:TAG]]

用户可以通过-c,--change=[] 选项在导入的同时执行对容器进行修改的Dockerfile指令。

下面将test_for_run.tar文件导入到系统中:

docker import test_for_run.tar ubuntu:1.0
或者
cat test_for_run.tar | docker import - ubuntu:1.0

操作docker容器

区别

①、export命令导出的tar文件略小于save命令导出的 ;

②、export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出;

③、基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。

建议

可以依据具体使用场景来选择命令

  • 若是只想备份images,使用save、load即可;
  • 若是在启动容器后,容器内容有变化,需要备份,则使用export、import。