Docker实战(二)之操作Docker容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器是Docker的另外一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立的一个或一组应用,以及它们所必需的运行环境。

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

1.创建容器

(1)新建容器

docker create -it ubuntu:latest

通过docker ps -a命令可以查看所有容器

使用docker create命令新建的容器处于停止状态,可以使用docker start命令启动它。

 

(2)启动容器

docker start CONTAINER ID(容器ID)

docker ps 命令可以查看一个运行中的容器

 

(3)新建并启动容器

除了创建容器后通过start命令来启动,也可以直接新建并启动所有容器。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。

下面示例:

 

这跟在本地直接执行/bin/echo 'hello world'几乎感觉不出任何区别。

当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

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

b.利用镜像创建容器,并启动该容器;

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

d.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

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

f.执行用户指定的应用程序;

g.执行完毕后容器被自动停止。

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

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

在交互模式下,用户可以通过所创建的终端来输入命令,例如:

在容器内用ps命令查看进程,可以看到只运行了bash应用,并没有运行其他无关的进程。

用户可以按Ctrl+d或输入exit命令来退出容器

 对于所创建的bash容器,当使用exit命令退出之后,容器就处于退出(Exited)状态了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

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

默认情况下,常见错误码如下:

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

126:所指定命令无法执行,例如权限出错;

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

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

(4)守护态运行

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

例如下面的命令会在后台运行容器:

容器启动后会返回一个唯一的id,也可以通过docker ps命令来查看容器信息:

docker ps

 

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

 

2.终止容器

可以使用docker stop来终止一个运行中的容器。该命令的格式为docker stop CONTAINER ID。

首先向容器发送SIGTERM信号,等待一段超时时间(默认为10s)后,再发送SIGKILL信号来终止容器:

docker stop 5731fbb9e432

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

此外,当Docker容器中指定的应用终结时,容器也会自动终止。例如对于只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

可以用docker ps -qa命令查看所有容器ID。例如:

 处于终止状态的容器,可以通过docker start 命令重新启动

 

此外,docker restart命令会将一个运行态的容器先终止,然后再重新启动它:

docker restart 5731

 

3.进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。下面分别介绍一下。

(1)attach命令

attach命令是Docker自带的命令,命令格式为:

docker attatch [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=proxy[=true]] container

支持三个主要选项:

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

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

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

下面示例:

但是使用attach命令有些时候并不方便。当多个窗口同时用attach命令连接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

(2)exec命令

Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任何命令。该命令的基本格式为:

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

比较重要的参数有:

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

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

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

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

 

例如进入到刚创建的容器中,并启动一个bash:

docker exec -it 5731fbb9e432 /bin/bash

可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。

注意:通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。

(3)nsenter工具

源码安装如下所示:

cd /tmp

wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz

tar -zxf util-linux-2.24.tar.gz

cd util-linux-2.24

./confiure --without-ncurses

make nsenter && cp nsenter /usr/local/bin/

4.删除容器

docker rm 容器ID

主要支持选项有:

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

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

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

例如:查看处于终止状态的容器,并删除:

docker ps -a

 

 docker rm aa9ee0f9359d

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

如故宫要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后会强行删除。

不过实际生产环境中,建议尽可能不要使用docker rmi 容器ID进行强制删除,建议先停止容器,再删除容器,例如:

 

5.导入导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入导出功能。这也是Docker自身提供的一个重要特性。

(1)导出容器

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

首先查看所有的容器,如下所示:

docker export -o test_for_run.tar 6473a58a859a

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

(2)导入容器

导出的文件又可以使用docker import命令导入变成镜像,该命令格式为:

docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-REPOSTORY[:TAG]

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

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

docker import test_for_run.tar - test/ubuntu:v1.0

之前使用的docker load命令来导入一个镜像文件,与docker import命令十分类似。

实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令导入一个容器快照到本地镜像库。

者两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

目录
相关文章
|
19天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
164 77
|
27天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
5天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
48 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
11天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
35 3
实战~如何组织一个多容器项目docker-compose
|
5天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
24 4
|
20天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
66 3
|
27天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
64 3
|
27天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
35 2
|
27天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
67 7

热门文章

最新文章