容器是Docker的另一个核心概念,容器就是镜像的一个运行实例,只是它具有一个可写的文件层,而镜像是一个只读的文件。

一、创建容器

1、新建容器

我们可以使用 docker create 命令来创建一个容器。需要注意的是,此时新建的容器处于停止状态,若想让这个容器运行,则需要使用 docker start 命令。

# 0. 查看本地有哪些镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4e5021d210f6 2 weeks ago 64.2MB # 1. 创建容器(第一步)
$ sudo docker create -ti ubuntu:latest
bb9c6f31d79d40f10e2fefbde17af35cd8457746211f214479258accab86dbc0 # 2. 查看所有容器,此时容器状态为 Created
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb9c6f31d79d ubuntu:latest "/bin/bash" 7 seconds ago Created flamboyant_almeida # 3. 运行容器(第二步)
$ sudo docker start bb9c6f31d79d
bb9c6f31d79d # 4. 查看容器,此时容器状态为UP
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb9c6f31d79d ubuntu:latest "/bin/bash" 7 seconds ago UP 5 seconds flamboyant_almeida

2、新建并启动容器

在上一小节中,我们运行一个容器需要做两步走,先创建再运行。其实这两步,我们可以使用 docker run 这一个命令来代替上面的两个步骤。

# 0. 查看所有容器
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb9c6f31d79d ubuntu:latest "/bin/bash" 7 seconds ago UP 5 seconds flamboyant_almeida # 1. 运行一个容器,并立刻退出
$ sudo docker run ubuntu /bin/echo 'Hello World...'
Hello World... # 2. 查看容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
924e13b84e9f ubuntu "/bin/echo 'Hello Wo…" 6s ago Exited (0) 4 s ago loving_shannon
bb9c6f31d79d ubuntu:latest "/bin/bash" 7 seconds ago UP 5 seconds flamboyant_almeida

当然,我们也可以在运行容器的时候,进入到容器内部,对容器进行操作。

# 0. 运行容器并进入
$ sudo docker run -t -i ubuntu:latest /bin/bash
root@c6198d442bf9:/# # 1. 对容器进行操作
root@c6198d442bf9:/# pwd
/
root@c6198d442bf9:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
10 pts/0 00:00:00 ps
root@c6198d442bf9:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # 2. 退出容器
root@c6198d442bf9:/# exit
exit # 3. 查看刚才的容器状态为Exited
$ sudo docker ps -a

3、容器的守护态运行

其实大多数时候,我们运行容器后都不会一直处于容器操作状态的,会让容器在操作系统后台运行,此时的容器就是处于守护态运行。这种启动方式就是在 docker run 运行时添加一个 -d 参数来实现。

# 在后台运行一个容器,该容器每一秒打印一串字符
$ sudo docker run -d ubuntu:latest /bin/bash -c "while true; do echo hello world; sleep 1; done"
60b6384109fd350bc97040039277058428ffc0f7492cc22338f95be8357ea482 # 查看当前正在运行的容器
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60b6384109fd ubuntu:latest "/bin/bash -c 'while…"8 seconds ago Up 6 seconds keen_swirles

从上面的状态可以看到当前容器处于 UP状态,那么如何查看该容器是否在打印字符串呢?可以使用 docker logs命令。

# 查看当前容器的输出信息
$ sudo docker logs 60b6384109fd
hello world
hello world
hello world
....

二、终止容器

当容器运行了一段时间后,对于该容器我们不再需要了,那么就需要终止容器,可以使用 docker stop 命令来终止一个正在运行的容器,语法为:docker stop [-t|--time[=10]]。它的执行逻辑为:首先会向容器发送SIGTERM信号,等待一段时间后(默认10s),再发送SIGKILL信号终止容器。除了我们直接终止容器,当Docker容器中指定的应用终结时,容器也会自动的终止。在上一小节中,当我们处于容器中时,用 exit 命令退出容器也会将容器给终止。

# 终止我们上一小节中正在运行的守护态容器
$ sudo docker stop 60b6384109fd
60b6384109fd # 此时查看正在运行的容器已经没有了
$ sudo docker ps
...

当终止容器后,一段时间后,我们希望将刚才终止的容器再次启动,则使用 docker start 命令。

# 0. 查看当前终止的容器
$ sudo docker ps -a -q
60b6384109fd # 1. 将终止的容器再次启动
$ sudo docker start 60b6384109fd
60b6384109fd # 2. 查看当前正在运行的容器,发现 60b6384109fd 该容器状态又处于 UP
$ sudo docker ps

若我们希望将一个正在运行的容器重启,则可使用 docker restart 命令。

# 重启容器
$ sudo docker restart 60b6384109fd

三、进入容器

在守护态运行容器时,此时容器处于操作系统的后台运行,此时我们想进入容器内部进行操作,可以通过以下集中方式。

1、attach命令

该命令时Docker自带的一个命令。此命令存在一个缺点,即当我们打开多个窗口进入容器中,当其中一个窗口在操作容器,其他窗口也会将这些操作信息给同步的显示,若此时其中一个窗口处于阻塞状态,则所有窗口都不可操作容器。若在容器中执行 exit 命令,则容器终止运行。

# 进入上一节中运行运行态容器中
$ sudo docker attach c6198d442bf9 #(容器ID或容器名称)
root@c6198d442bf9:/#

2、exec命令

该命令是 Docker1.3版本新提供的,可有效解决 attach命令存在的问题。

# 进入正在运行的容器内部,哪怕在容器内执行 exit 退出容器,此时容器也不会终止
$ sudo docker exec -ti c6198d442bf9 /bin/bash
root@c6198d442bf9:/#

3、nsenter工具

该工具在 util-linux包2.23版本中,若没有该包则需要安装。同时,使用该工具连接容器,需要知道容器的进程的PID。

# 0. 查询当前运行态的容器
$ sudo docker ps
#得到容器ID为 bb9c6f31d79d # 1. 查询该容器的PID
$ sudo echo PID=$(docker inspect --format "{{ .State.Pid}}" bb9c6f31d79d)
PID=1525 # 2. 通过nsenter工具进入容器
$ sudo nsenter --target 1525 --mount --uts --ipc --net --pid
root@bb9c6f31d79d:/# # 3. 使用 exit 退出容器后,容器不终止

四、删除容器

对于确定不在需要的容器,可以将其删除,注意删除容器之前将容器给终止。语法:docker rm [options] container [container...],可以一次删除多个容器。options选项包含:

-f,--force=false 强行终止并删除一个运行中的容器(不推荐使用)

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

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

# 0. 查看所有容器
$ sudo docker ps -a
60b6384109fd Exited (137) 47 minutes ago
c6198d442bf9 Exited (0) 30 minutes ago
924e13b84e9f Exited (0) About an hour ago
bb9c6f31d79d Up About an hour # 1. 删除终止的容器
$ sudo docker rm 60b6384109fd c6198d442bf9 924e13b84e9f
60b6384109fd
c6198d442bf9
924e13b84e9f # 2. 二次查看所有容器
$ sudo docker ps -a
bb9c6f31d79d Up About an hour # 3. 删除正在运行的容器(错误做法)
$ sudo docker rm bb9c6f31d79d
Error response from daemon: You cannot remove a running container bb9c6f31d79d40f10e2fefbde17af35cd8457746211f214479258accab86dbc0. Stop the container before attempting removal or force remove # 4. 强制删除正在运行的容器
$ sudo docker rm -f bb9c6f31d79d
bb9c6f31d79d # 5. 至此,所有容器删除完成
$ sudo docker ps -a
null

五、导入和导出容器

1、导出容器

导出容器即将一个已经创建的容器导出到一个文件,不管此时容器是否处于运行中,都可以使用 docker export 命令来导出。

# 0. 新建并启动一个容器,新建一个容器但不启动
$ sudo docker run -tid ubuntu:latest /bin/bash
4418f9c3e13a30e551a2a33d2e2c7cf73a122688aa09ca86a97f4ee8885d74a7
$ sudo docker create ubuntu:latest
4f3f1fe5bd66125b5e2c6693cefec4c403d396d5c2bd678f8371c38131611ddf # 1. 将两个容器导出
$ sudo docker export 4f3f1fe5bd66 > no_run_container.tar
$ sudo docker export 4418f9c3e13a > run_container.tar # 说明:此时这两个容器对应的tar,我们就可以将其放到其他机器上通过导入来使用。这即实现了容器的迁移。

2、导入容器

对于容器导出的文件,我们可以使用 docker import 命令来导入,使其成为镜像。

# 0. 导入文件,成为镜像
$ cat run_container.tar | sudo docker import - test/ubuntu:v1.0
sha256:0f5b15a68f7640467f842635ec567bbd97dfc9485ff3d0eb083c6ad0781d7b3b # 1. 查看镜像
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.0 0f5b15a68f76 4 seconds ago 64.2MB

说明:在前面我们使用过一个 docker load 命令来导入文件。这两者都可以实现导入,不过load体积更大,导入的镜像存储文件更彻底,而import导入的只是一个容器快照,它将丢弃所有的历史记录和元数据信息。

四、【Docker笔记】Docker容器的更多相关文章

  1. Docker笔记--操作容器命令

    Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...

  2. docker笔记--docker 各系统安装

    在线安装 Docker 在 CentOS/RHEL 中安装 Docker 在终端中运行下面的命令安装 Docker. sudo yum install -y yum-utils sudo yum-co ...

  3. Docker笔记——Docker安装及制作镜像

    1 Docker安装本文中Docker运行环境为Ubuntu 14.04.1 LTS 3.13.0-32-generic x64参考:https://docs.docker.com/v1.11/eng ...

  4. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

  5. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  6. 【应用容器引擎】Docker笔记

    一.Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化.它是一个轻量级容器技 ...

  7. Docker学习笔记 - Docker容器之间的连接

    学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN  ...

  8. Docker学习笔记 - Docker容器的网络基础

    一.虚拟网桥 docker0 docker0 是 linux的虚拟网桥,守护进程通过docker0给容器提供网络连接的各种服务. 网桥是数据链路层设备,通常ip地址是网络层的设置.linux的虚拟网桥 ...

  9. Docker学习笔记之使用 Docker Compose 管理容器

    0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...

随机推荐

  1. JS动画之缓动函数分析及动画库

    上一篇讲了JS动画定时器相关知识,这一篇介绍下缓动函数及流行的动画库. 熟悉的图 实际使用 jquery animate()+jquery.easing插件的使用: $(selector).anima ...

  2. 『配置』服务器搭建 Office Online Server2016 实现文档预览 番外 错误篇

    安装一个或多个角色.角色服务或功能失败.找不到源文件.请再次尝试在新的“添加角色和功能”向导会话中安装角色.角色服务或功能,然后在向导的“确认”页中单击“指定备用源路径”以指定安装所需的源文件的有效位 ...

  3. 深入理解Java之线程池(网络笔记)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3932921.html 附加:http://www.cnblogs.com/wxd0108/p/5479442.h ...

  4. 17-Java-文件上传报错(commons-fileupload包和commons-io包不支持JDK版本:UnsupportedClassVersionError: org/apache/commons/io/IOUtils : Unsupported major.minor version 52.0)

    文件上传报错(commons-fileupload包和commons-io包不支持JDK版本) 这个bug可把我弄惨了!!!我代码是想通过写个文件上传,我写的文件上传需要用到commons-fileu ...

  5. 如何从普通程序员晋升为架构师 面向过程编程OP和面向编程OO

    引言 计算机科学是一门应用科学,它的知识体系是典型的倒三角结构,所用的基础知识并不多,只是随着应用领域和方向的不同,产生了很多的分支,所以说编程并不是一件很困难的事情,一个高中生经过特定的训练就可以做 ...

  6. Git&sourceTree软件安装、使用说明及遇到问题解决

    一.软件版本 1.Git版本为1.9.5 2.Source版本为1.5.2 二.软件安装步骤 1.Git安装步骤 1)双击Git安装文件进入下图界面,单击Next 2)继续Next 3)进入Selec ...

  7. C# 时间戳(TimeStamp)与时间(DateTime)的互相转换

    什么是时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 时间戳在线转换网址:https://tool.lu/ ...

  8. hive学习_01

    1.构建在Hadoop之上的数据仓库(数据计算使用MR,数据存储使用HDFS) 2.Hive定义了一种类SQL查询语言----HQL 3.通常用于进行离线数据处理(非实时) 4.一个ETL工具 5.可 ...

  9. MySQL设置外键报错 #1452 - Cannot add or update a child row: a foreign key constraint fails 解决方法

    MySQL数据库,当我尝试在A表中设置B表的主键为外键时,报出错误:#1452 - Cannot add or update a child row: a foreign key constraint ...

  10. 我用STM32MP1做了个疫情监控平台2—Qt环境搭建

    目录 1.嵌入式Qt简介 2.查看开发板Qt库的版本 3.主机搭建Qt环境 4.第一个Qt程序--Hello World 5.一些问题 @ 1.嵌入式Qt简介 Qt 是一个跨平台的应用程序开发框架.使 ...