Docker容器-从最基础到Dockerfile、Docker-compose,有这一篇足够了!!!

本文详细介绍了Docker容器技术,从虚拟化背景、Docker的优势出发,深入探讨了Docker的底层原理、安装部署、命令用法、资源限制、网络配置、镜像原理、Dockerfile和Docker Compose的使用。此外,还讲解了Docker镜像的存储位置、镜像与容器的区别以及数据持久化的方法。最后,文章提到了企业级Docker Registry——Harbor,阐述了其优势和部署环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker容器

容器背景

  1. 随着云计算和DevOps生态圈的蓬勃发展,产生了大量优秀的系统和软件。软件开发人员可以自由选择各种软件应用环境。但同时带来的问题就是需要维护一个非常庞大的开发、测试、预上线、和生产环境。面对这种情况,docker容器技术横空出世、提供了简单、灵活、高效的解决方案,不需要改变现有的使用习惯,就可以和已有的工具进行整合。因此,掌握docker相关技术也是途径云计算的必经之路。
  2. Docker是在Linux容器里运行应用的开源容器管理工具,可以理解为轻量级的“虚拟机”。它诞生于 2013 年初,最初是 DotCloud 公司内部商业版项目,后来更换架构师,此架构师将Docker进行了开源,导致Docker使用人员增多。基于 Google公司推出的 Go(Golang) 语言开发。该项目后来加入了Linux基金会,遵从了Apache 2.0协议进行推广,项目代码在 GitHub(https://github.com/docker)上进行维护。
  3. **docker官网:**https://www.docker.com/
  4. Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可以看做宿主机,而集装箱可以理解为实现应用相互隔离的容器,每个集装箱中都包含自己的应用程序。正如Docker的设计宗旨一样:Build、Ship and Run Any App、Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理、达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

一、虚拟化与传统物理机部署方式

1.传统物理机部署:

部署非常慢、成本高、资源浪费、难于迁移和扩展、可能会被限定硬件厂商

2.虚拟化技术:

一个物理机可以部署多个app,每个app独立运行在一个vm里,现如今虚拟主机、web服务器、数据库、对象存储等等各种服务都可以同个各种各样的云平台来完成

3.虚拟化:

是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境

4.镜像和容器的区别

镜像是只读的,就是拉到本地并没有运行

容器是可写的,已经运行并且能进入到容器内

docker容器与传统虚拟化的对比

特性 容器 虚拟机
启动时间 秒级 分钟级
资源损耗 几乎无 至少损耗50%左右(系统占用)
硬盘空间 MB GB
系统支持 上千个 几十个
隔离性 资源限制 完全隔离
性能 接近原生 弱于

二、docker优点

1.快速的交付和部署:

对(DevOps)人员来说,最希望的就是项目环境一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套项目开发容器,代码开发完成之后,运维人员可以直接此容器打包迁移。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker将会大量地节约开发、测试、部署的时间。

2.高效的虚拟化:

Docker容器的运行不需要额外的管理系统支持,它是内核级的虚拟化,并且容器调用的是宿主机的bin和lib。因此可以实现更高的性能和效率。

3.更轻松的迁移和扩展:

Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。

4.简单的管理:

使用 Docker只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理

三、docker的底层原理:

Docker是基于google公司推出的golang语言开发而来,基于linux系统内核的Cgroups、NmaeSpace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术

对进程进行封装隔离,属于操作系统层面的虚拟化技术

利用docker可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本

1.docker核心组件:

Image镜像,构建容器(我们讲应用程序所需要的环境,打包为镜像文件)

Container,容器(应用程序跑在容器中)

镜像仓库(dockerhub)保存镜像文件,提供上传,下载镜像,作用好比github

Dockerfile,将你部署项目的操作,写成一个部署脚本,这就是dockerfile,且该脚本还能够构建出镜像文件

2.创建容器过程:

获取镜像,如docker pull centos,从镜像仓库拉取

使用镜像创建容器

分配文件系统,挂载一个读写层,在读写层加载镜像

分配网络/网桥接口,创建一个网络接口,让容器和宿主机通信

容器获取ip地址

执行容器命令,如/bin/bash

反馈容器启动结果

3.概念名称

镜像:image

容器:container

仓库:Repository

四、docker安装部署

1.环境

docker必须在centos7平台,内核版本不低于3.10

uname -r 查看本主机内核

环境初始化 关闭防火墙、安全机制

2.开启linux内核的路由转发(也就是宿主机能干啥容器也能干啥)
cat <<EOF > /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.conf.default.rp_filter = 0

net.ipv4.conf.all.rp_filter = 0

net.ipv4.ip_forward=1

EOF

加载修改内核的参数配置文件

modprobe br_netfilter

sysctl -p /etc/sysctl.d/docker.conf

3. yum快速安装docker
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum -y install yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce

systemctl start docker
systemctl enable docker

清理缓存创建新的缓存

yum clean all && yum makecache

安装yum -y install docker-ce

卸载yum -y remove docker-版本号

4.配置docker镜像加速器,拉取镜像
mkdir /etc/docker  #如果没有启动docker需要创建此目录
cat > /etc/docker/daemon.json << EOF 
{ 
"registry-mirrors": ["https://8xpkSwnt.mirror.aliyuncs.com"] 
} 
EOF
5.启动使用docker

systemctl daemon-reload ##重新加载配置文件

systemctl start docker ##启动docker

systemctl enable docker ##设为开机自启动

//查看是否设置为开机自启动systemctl is-enabled 服务名称
[root@localhost ~]# systemctl is-enabled docker
enabled
\##查看docker有没有启动成功
ps -ef |grep dockerdocker version

启动/停止docker
//启动
systemctl start docker
//停止
systemctl stop docker
//开机自启
systemctl enable docker
//重启docker
systemctl restart docker
//查看状态
systemctl status docker

五、docker命令及用法

一些快捷键
esc键+.  #可以调用上一条命令
ctrl+insert  #复制
shift+insert #粘贴
ctrl+r #输入某个单词搜索历史命令
ctrl+p #返回上一次输入命令字符

查看版本信息
//docker 帮助命令
docker --help 
//如果忘记某一个命令怎么使用,有哪些参数
eg:docker pull --help

//查看docker内组件及版本信息
docker version
//查看docker版本信息
docker --version
//显示docker的系统信息,包括镜像和容器的数量
docker info
  docker images 或docker image ls
选项:
-q  或 --quit #只显示镜像的id
-qa #显示所有镜像的id
--format #格式化显示镜像 例::docker images --format "{
   {.ID}}--{
   {.Repository}}"
##参数详解:
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的id
CREATED:镜像的创建时间
SIZE:镜像的大小
//打标签(原有的容器删除,标签还能继续使用)
docker tag 镜像名 自定义标签名
//查看一个镜像具体信息加inspect参数即可
docker image inspect 镜像id
查找镜像&拉取
//查找镜像,查到之后一般选择第一个,是官方认证
docker search nginx ##nginx为镜像名
//拉取镜像,如果不加版本号会自动拉取最新版本,如果本地没有会直接拉取
docker pull nginx:1.22.1
查看容器内详细信息
##查看容器的详细信息,用于高级的调试
docker container inspect 容器id/容器名称
查看容器日志信息
##查看容器内的所有日志信息
docker logs 容器id/容器名称
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
-f   实时刷新

##查看容器端口转发情况
docker port 容器id/容器名称
查看容器进程
##登录方式
docker run -it 自定义起的那个名 bash
##查看容器内进程信息
docker top 容器id
##动态查看容器内资源信息
docker stats 容器id
运行镜像
//运行镜像
docker run -d -p 80:80 nginx
//选项
-d              ##后台运行容器
-p              ##宿主机端口:容器内端口(端口映射)/tcp (tcp指定远程传输协议)  当访问宿主机端口也就是访问到了容器内的端口,启动后会返回一个容器id
--expose:接受指定范围作为参数比如:--expose=2000~3000
-P               ##大P 随机指定端口
-it               ##使用交互方式运行, 进入容器查看内容
--rm             
### 安装并配置 Docker-Compose 的解决方案 在 Conda 环境中遇到 `docker-compose` 命令不可用的问题,通常是因为该工具未正确安装到系统的 PATH 中或者未适配当前的运行环境。以下是针对此问题的具体解决方法: #### 1. 下载 Docker-Compose 可执行文件 通过网络上的镜像源快速获取新版本的 `docker-compose` 工具,并将其放置于系统路径下的可执行位置。 ```bash curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ``` 上述命令会将指定版本的 `docker-compose` 文件下载至 `/usr/local/bin/` 路径下,并赋予其可执行权限[^1]。 #### 2. 验证安装成功与否 完成安装后,需验证 `docker-compose` 是否能够正常工作。可以尝试运行以下命令来确认版本号是否存在: ```bash docker-compose --version ``` 如果返回了具体的版本信息,则说明安装已成功;反之则可能需要进一步排查路径设置或其他潜在错误。 #### 3. 将 Docker-Compose 添加到 Conda 环境变量 为了使 `docker-compose` 在特定的 Conda 环境中可用,应确保它的二进制文件所在目录已被加入到该环境中使用的 `$PATH` 列表里。可通过修改 `.bashrc` 或者直接激活某个虚拟环境下手动调整实现这一点。 对于全局生效的情况,在用户的主目录创建或编辑隐藏文件`.bash_profile`,增加如下内容: ```bash export PATH=$PATH:/usr/local/bin/ source ~/.bashrc ``` 而对于仅限于单个Conda Environment内部有效的情形,可以在进入相应env之后再单独追加一次临时性的path扩展操作即可满足需求. 另外也可以考虑利用Anaconda自带包管理器pip来进行本地化部署方式替代传统shell script形式处理办法. 即先切换目标environment, 然后执行标准python package install流程: ```bash conda activate your_env_name pip install docker-compose ``` 这样做的好处是可以完全隔离不同project之间相互影响的同时还简化跨平台移植难度等问题.[^2] #### 4. 测试 Docker Compose 功能 后一步就是实际测试一下整个setup过程是否顺利完成以及能否正常使用预期功能特性啦!比如我们可以按照官方文档指引新建一份简单的yaml descriptor file用于描述服务依赖关系结构图谱等等...这里就不展开赘述太多细节部分咯~感兴趣的朋友可以直接查阅相关参考资料链接地址哦~ --- ### 提供一段 Python 示例代码展示如何调用 subprocess 执行 shell 命令 (非必要环节) 有时候我们希望能够在 python scripts 当中自动化完成某些重复性较高的运维任务之类的场景应用场合下显得尤为重要起来呢?那么不妨看看下面这个例子吧! ```python import os import subprocess def run_command(command): result = subprocess.run( command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) return result.stdout.decode('utf-8'), result.stderr.decode('utf-8') stdout, stderr = run_command("docker-compose up -d") if not stderr: print(f"Docker compose started successfully.\nOutput:\n{stdout}") else: print(f"Error occurred while starting docker compose:\n{stderr}") ``` 以上片段展示了怎样借助内置库subprocess轻松搞定外部进程交互逻辑控制等功能模块开发技巧分享给大家参考学习使用哈~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值