docker怎么创建容器(Docker导入镜像并生成容器)

本文目录
- Docker导入镜像并生成容器
- Docker 创建容器时指定容器ip
- 如何交互式地创建一个Docker容器
- 如何基于docker构建和发布Python应用程序
- docker面试题
- 【docker】docker的容器创建与管理过程
Docker导入镜像并生成容器
比如我现在有镜像: env_python38_ubuntu2004_1_0.tar 。
如果镜像比较大,导入会比较慢。
用镜像 env_python38_ubuntu2004:1.0 启动容器,把容器命名为 my_ubuntu 。
不推荐使用 --privileged 命令给容器 root 权限,可能会导致宿主机登录异常的bug。
如果需要映射目录,用 -v 命令
如果需要容器随 docker 服务一起启动,用 --restart=always 命令
Docker 创建容器时指定容器ip
在上一篇 《 docker 网络(host&none&bridge) 》中,我们介绍了docker自带网络的三种模式。
其中提到过bridge(docker0)网络由于是docker安装时就创建的,无法在创建容器的时候指定容器ip。
那么在实际部署中,我们需要指定容器ip,不允许其自行分配ip,防止容器ip混乱。
有什么办法可以在创建容器时指定容器ip呢?很简单,自己创建一个新的bridge网络bridge1,在创建bridge1的时候同时创建子网,那么在创建容器的时候指定网络为bridge1并指定ip即可。
光说不练假把式,我们一起实战吧!!!
好的,现在自定义的网络已经创建好了,之后在创建容器的时候,我们就可以指定IP了。
此时指定的容器ip为172.16.12.12。
如果没有指定容器ip,将会自动分一个172.16.12.0/16网段内的ip。
如何交互式地创建一个Docker容器
1. 运行一个Docker实例
Docker首先会尝试从本地取得并运行所需的镜像,如果在本地主机上没有发现,它就会从Docker公共注册中心拉取。这里,我们将会拉取镜像并在 Docker 容器中创建一个fedora实例,并连接到它的 tty 上的bash shell。
# docker run -i -t fedora bash
2.安装Apache网络服务器
现在,在我们的Fedora基本镜像实例准备好后,我们将会开始交互式地安装Apache网络服务器,而不是为它创建Dockerfile。为了做到这点,我们需要在终端或者shell运行以下命令。
# yum update
***隐藏网址***
退出容器的 tty。
# exit
3.保存镜像
现在,我们要去保存在Fedora实例里做的修改。要做到这个,我们首先需要知道实例的容器ID。而为了得到ID,我们又需要运行以下命令(LCTT 译注:在容器外执行该命令)。
# docker ps -a
然后,我们会保存这些改变为一个新的镜像,请运行以下命令。
***隐藏网址***
***隐藏网址***
# docker images
4. 添加内容到新的镜像
我们自己新的Fedora Apache镜像正成功的运行,现在我们想添加一些我们网站的网页内容到Apache网络服务器,使得网站能够开箱即用。为做到这点,我们需要创建一个新的Dockerfile,它会处理从复制网页内容到启用80端口的所有操作。要达到这样的目的,我们需要使用我们最喜欢的文本器创建Dockerfile文件,像下面演示的一样。
# nano Dockerfile
现在,我们需要添加以下的命令行到文件中。
***隐藏网址***
ADD mysite.tar /tmp/
RUN mv /tmp/mysite/* /var/www/html
EXPOSE 80
***隐藏网址***
CMD
***隐藏网址***
5. 构建并运行一个容器
现在,我们要用刚刚创建的Dockerfile创建我们的容器,以便将我们的网站添加到上面。为做到这,我们需要运行以下命令。
# docker build -rm -t mysite .
建立好我们的新容器后,我们需要要用下面的命令来运行容器。
# docker run -d -P mysite
如何基于docker构建和发布Python应用程序
基于 Docker 构建和发布 Python 应用程序通常需要以下步骤:
编写 Python 应用程序代码。可以使用任何你熟悉的 Python 框架,如 Flask、Django 等。
创建一个 Dockerfile,用于定义 Docker 镜像的构建过程。在 Dockerfile 中,需要指定基础镜像、安装 Python 库、将应用程序代码复制到镜像中等操作。以下是一个示例 Dockerfile:
# 使用 Python 3.9 作为基础镜像
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 复制应用程序代码到镜像中
COPY . /app
# 安装依赖库
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口号
EXPOSE 8000
# 设置启动命令
CMD
构建 Docker 镜像。在 Dockerfile 所在的目录下,运行以下命令:
docker build -t my-python-app .
其中,my-python-app 是镜像的名称,. 表示使用当前目录中的 Dockerfile 进行构建。构建完成后,你可以使用以下命令查看镜像列表:
docker images
运行容器。在运行容器时,你需要指定容器名称、端口映射等参数。以下是一个示例命令:
docker run -d --name my-app -p 8000:8000 my-python-app
其中,my-app 是容器的名称,8000:8000 表示将容器的 8000 端口映射到宿主机的 8000 端口,my-python-app 是镜像的名称。
访问应用程序。运行容器后,你可以在浏览器中访问应用程序。如果应用程序使用了 Flask 等框架,你需要在应用程序代码中指定监听的端口号为 0.0.0.0。
以上就是基于 Docker 构建和发布 Python 应用程序的一般步骤。需要注意的是,在实际应用中,可能还需要进行日志管理、数据备份等操作,以确保应用程序的可靠性和安全性。
docker面试题
Docker 是一种流行的开源软件平台,可简化创建、管理、运行和分发应用程序的过程。它使用容器来打包应用程序及其依赖项。用 Docker 来简化其应用程序开发工作流程。
Docker 面试问答
1. 什么是 Docker 容器?
Docker 容器在应用程序层创建抽象并将应用程序及其所有依赖项打包在一起。这使我们能够快速可靠地部署应用程序。容器不需要我们安装不同的操作系统。相反,它们使用底层系统的 CPU 和内存来执行任务。这意味着任何容器化应用程序都可以在任何平台上运行,而不管底层操作系统如何。我们也可以将容器视为 Docker 镜像的运行时实例。
2.描述 Docker 容器的生命周期。
Docker 容器经历以下阶段:
创建容器
运行容器
暂停容器(可选)
取消暂停容器(可选)
启动容器
停止容器
重启容器
杀死容器
销毁容器
3. 如何从 Docker 镜像创建 Docker 容器?
为了从镜像创建容器,我们从 Docker 存储库中提取我们想要的镜像并创建一个容器。我们可以使用以下命令:
docker run -it -d
4. Docker Compose 可以使用 JSON 代替 YAML 吗?
是的,我们可以对Docker Compose文件使用 JSON 文件而不是YAML
$ docker-compose -f docker-compose.json up
5. 什么是Docker Swarm?
Docker Swarm 是一个容器编排工具,它允许我们跨不同主机管理多个容器。使用 Swarm,我们可以将多个 Docker 主机变成单个主机,以便于监控和管理。
6. 如果你想使用一个基础镜像并对其进行修改,你怎么做?
我们可以使用以下 Docker 命令将图像从 Docker Hub 拉到我们的本地系统上:
docker pull
7. 如何启动、停止和终止容器?
要启动 Docker 容器,请使用以下命令:
docker start
要停止 Docker 容器,请使用以下命令:
docker stop
要终止 Docker 容器,请使用以下命令:
docker kill
8. 什么是 DockerFile?
Dockerfile 是一个文本文件,其中包含我们需要运行以构建 Docker 映像的所有命令。Docker 使用 Dockerfile 中的指令自动构建镜像。我们可以docker build用来创建按顺序执行多个命令行指令的自动构建。
9. 解释 Docker 组件。
三个架构组件包括 Docker 客户端、主机和注册表。
Docker 客户端:该组件执行构建和运行操作以与 Docker 主机通信。
Docker 主机:该组件包含 Docker 守护程序、Docker 镜像和 Docker 容器。守护进程建立到 Docker Registry 的连接。
Docker Registry:该组件存储 Docker 镜像。它可以是公共注册表,例如 Docker Hub 或 Docker Cloud,也可以是私有注册表。
10. 虚拟化和容器化有什么区别?
虚拟化
虚拟化帮助我们在单个物理服务器上运行和托管多个操作系统。在虚拟化中,管理程序为客户操作系统提供了一个虚拟机。VM 形成了硬件层的抽象,因此主机上的每个 VM 都可以充当物理机。
容器化
容器化为我们提供了一个独立的环境来运行我们的应用程序。我们可以在单个服务器或 VM 上使用相同的操作系统部署多个应用程序。容器构成了应用层的抽象,所以每个容器代表一个不同的应用。
11. 管理程序的功能是什么?
管理程序或虚拟机监视器是帮助我们创建和运行虚拟机的软件。它使我们能够使用单个主机来支持多个来宾虚拟机。它通过划分主机的系统资源并将它们分配给已安装的来宾环境来实现这一点。可以在单个主机操作系统上安装多个操作系统。有两种类型的管理程序:
Native:本机管理程序或裸机管理程序,直接在底层主机系统上运行。它使我们可以直接访问主机系统的硬件,并且不需要基本服务器操作系统。
托管:托管管理程序使用底层主机操作系统。
12.如何构建Dockerfile?
为了使用我们概述的规范创建映像,我们需要构建一个 Dockerfile。要构建 Dockerfile,我们可以使用以下docker build命令:
$ docker build
13. 使用什么命令将新镜像推送到 Docker Registry?
要将新镜像推送到 Docker Registry,我们可以使用以下docker push命令:
$ docker push myorg/img
14.什么是Docker引擎?
Docker Engine 是一种开源容器化技术,我们可以使用它来构建和容器化我们的应用程序。Docker Engine 由以下组件支持:
Docker 引擎 REST API
Docker 命令行界面 (CLI)
Docker 守护进程
15. 如何访问正在运行的容器?
要访问正在运行的容器,我们可以使用以下命令:
$ docker exec -it bash
16.如何列出所有正在运行的容器?
要列出所有正在运行的容器,我们可以使用以下命令:
$ docker ps
17.Docker 运行在哪些平台上?
Docker 在以下 Linux 发行版上运行:
CentOS 6+
Gentoo
ArchLinux
CRUX 3.0+
openSUSE 12.3+
RHEL 6.5+
Fedora 19/20+
Ubuntu 12.04、13.04
Docker 还可以通过以下云服务在生产中使用:
微软Azure
谷歌计算引擎
亚马逊 AWS EC2
亚马逊 AWS ECS
机架空间
提示:我们始终建议您在面试之前进行一些公司研究。要为这个特定问题做准备,请了解公司如何使用 Docker 并在您的答案中包含他们使用的平台。
18. 什么是Docker对象标签?
Docker 对象标签是存储为字符串的键值对。它们使我们能够将元数据添加到 Docker 对象,例如容器、网络、本地守护进程、图像、Swarm 节点和服务。
19. 使用Docker Compose时如何保证容器1先于容器2运行?
Docker Compose 在继续下一个容器之前不会等待容器准备就绪。为了控制我们的执行顺序,我们可以使用“取决于”条件,depends_on。这是在 docker-compose.yml 文件中使用的示例:
version: "2.4"
services:
backend:
build: .
depends_on:
- db
db:
image: postgres
该docker-compose up命令将按照我们指定的依赖顺序启动和运行服务。
20.docker create命令有什么作用?
该docker create命令在指定映像上创建可写容器层,并准备该映像以运行指定命令。
【docker】docker的容器创建与管理过程
# yum -y install docker docker-ce-cli containerd.io
# rpm -qa | grep container
# rpm -qa | grep docker
# rpm -ql docker-ce-cli | grep bin
# rpm -ql docker-ce | grep bin
# rpm -ql containerd.io | grep bin
# systemctl status docker
# systemctl status containerd
/var/run/docker.sock
/run/containerd/containerd.sock
/usr/bin/docker 和 /usr/bin/dockerd 就是命令行客户端和daemon
dcocker的架构是 C/S 模式
docker-containerd
docker-containerd-ctr
docker-containerd-shim
docker-init
docker-proxy
docker-runc
其实最简单的方式,就是加个命令行参数 --help 看看他们的简介。
可以看出来,docker-init, docker-containerd-shim 和 docker-proxy 没有在帮助里告诉我们是干什么的,其他的都有:
docker-containerd: 高性能容器运行时
docker-containerd-ctr: docker-containerd 的命令行客户端
docker-runc: 运行容器的命令行工具
如果去搜索一番,就会发现:docker-containerd 就是 containerd ,而 docker-runc 就是 runc 。
containerd是真正管控容器的daemon,执行容器的时候用的是runc。
为什么 要分的七零八散呢?
我估计其中主要的原因是防止docker垄断,因此把容器标准独立出来,就有了 runtime-spec ,然后有了 runc ,然后有了 containerd (此处发展历史没有考究,并不关心)。
可以看出来,docker本身其实已经被剥离干净了,只剩下docker自身的一些特色功能了,真正容器的管控都在containerd里实现。
所以接下来介绍的顺序是 runc, containerd, shim, docker-init, docker-proxy。
runc是标准化的产物,为了防止一家商业公司主导容器化标准,因此又了open containers组织,因此,创建容器,其实最终通过runc就可以了。
dockerd 有个子进程,是 containerd,然后 containerd 有子进程。
从 官方仓库 的描述可以看出来,其实 containerd 就包含了我们常用的 docker 的命令:
增删查改容器
增删查改镜像
也就是说,如果我们要对容器进行操控,直接使用 containerd 其实就够了。
说明: 如果没有单独起一个containerd,而是使用了 docker-containerd,通过 ps aux | grep docker 发现它使用了 /var/run/docker/containerd/containerd.toml 这个配置文件,而监听路径就写在里面。
shim的翻译是垫片,就是修自行车的时候,用来夹在螺丝和螺母之间的小铁片。
关于shim本身,网上介绍的文章很少,但是作者在 Google Groups 里有解释到shim的作用:
***隐藏网址***
1. 允许runc在创建&运行容器之后退出
2. 用shim作为容器的父进程,而不是直接用containerd作为容器的父进程,是为了防止这种情况:当containerd挂掉的时候,shim还在,因此可以保证容器打开的文件描述符不会被关掉
3. 依靠shim来收集&报告容器的退出状态,这样就不需要containerd来wait子进程
因此,使用shim的主要作用,就是 将containerd和真实的容器(里的进程)解耦 ,这是第二点和第三点所描述的。
而第一点,为什么要允许runc退出呢?
因为,Go编译出来的二进制文件,默认是静态链接,因此,如果一个机器上起N个容器,那么就会占用M*N的内存,其中M是一个runc所消耗的内存。 但是出于上面描述的原因又不想直接让containerd来做容器的父进程,因此,就需要一个比runc占内存更小的东西来作父进程,也就是shim。但实际上, shim仍然比较占内存( 参考这里 )。
我们都知道UNIX系统中,1号进程是init进程,也是所有孤儿进程的父进程。
而使用docker时,如果不加 --init 参数,容器中的1号进程 就是所给的ENTRYPOINT。
而加上 --init 之后,1号进程就会是 tini 。
在entrypoint.sh中使用Tini的优势是什么?
***隐藏网址***
用来做容器和宿主机之间的端口映射,其底层是使用iptables来完成的。
The docker-proxy
***隐藏网址***
docker本身而言包括了,docker client和dockerd(docker daemon),dockerd本身实属是对容器相关操作的api的最上层封装,
直接面向操作用户。
dockerd
dockerd本身实属是对容器相关操作的api的最上层封装,直接面向操作用户。
containerd
dockerd实际真实调用的还是 containerd的api接口(rpc方式实现 ),containerd是dockerd和runc之间的一个中间交流组件。
containerd-shim
containerd-shim是一个运行的容器的真实垫片载体,每启动一个容器都会起一个新的docker-shim进程。
他直接通过指定的三个参数:容器id,boundle目录(containerd的对应某个容器生成的目录,一般位于:/var/run/docker/libcontainerd/containerID),运行二进制(默认为runc)来调用runc的api创建一个容器(比如创建容器:最后拼装的命令如下:runc create )
runc
runc是一个命令行工具端,根据oci(开放容器组织)的标准来创建和运行容器。
1. docker 与 dockerd 通过/var/run/docker.sock 通讯
2. dockerd通过 grpc 与containerd模块通信,dockerd由libcontainerd负责和containerd进行交换,dockerd与containerd通信socket文件为 /run/containerd/containerd.sock
3. containerd在dockerd启动时 被启动 ,然后containerd启动grpc请求监听,containerd处理grpc请求,根据请求做相应动作
4. 若是start或是exec容器,containerd拉起一个 container-shim ,并进行相应的操作
5. container-shim拉起后,start/exec/create拉起runC进程,通过exit、control文件和 containerd 通信,通过父子进程关系和SIGCHLD监控容器中进程状态
6. 在整个容器生命周期中,containerd通过epoll监控容器文件,监控容器事件
Docker组件介绍(一):runc和containerd
***隐藏网址***
Docker组件介绍(二):shim, docker-init和docker-proxy
***隐藏网址***
关于docker启动一个容器后进程
***隐藏网址***

更多文章:
java初级编程经典题(一套JAVA的初级题目,跪求各位大虾帮帮忙)
2025年10月27日 05:45
一个完整的docker服务包括(Docker的主要作用是什么_docker属于什么)
2026年9月9日 08:45
python第三方库(怎么看安装了哪些第三方库在python)
2026年5月23日 18:30
python中row函数是什么意思(python中的row具体有什么用呢)
2025年8月25日 18:15
true和false的来源(false什么意思 解析false的含义和用法)
2026年2月15日 20:15
用Wps表格制作一张方便的报价单模板?怎么把一个EXCEL表格变成模板
2026年8月6日 14:00
analyze翻译(具备独立的思辨和分析能力的翻译是:什么意思)
2026年1月16日 10:15
intellijidea如何升级(intellij idea 怎么让class自动更新到war)
2026年3月23日 11:00
log4j2 xml配置(log4j2.xml怎么调用properties)
2025年6月7日 16:45
网页制作滚动字幕代码(写出制作滚动字幕的代码(包括方向、速度、行为、区域、区域背景等))
2025年6月23日 22:30
婚纱摄影网站图片(哪些地方适合拍婚纱照,这些外景都是很漂亮的)
2026年8月23日 06:45
c语言考试题及答案2018(2018年9月计算机二级C语言程序设计章节习题4)
2026年2月25日 15:15











