轻松上手Docker:学习如何创建和运行自己的Docker容器
轻松上手Docker:学习如何创建和运行自己的Docker容器
容器的介绍
容器化技术,它是一种虚拟化技术,用于在计算机系统中隔离和运行应用程序。容器将应用程序及其所有依赖项打包到一个独立的、可移植的环境中,使其能够在不同的计算机或操作系统上运行。
容器的特点:隔离性、轻量级、可移植性、弹性伸缩、生态系统。
目前最流行的容器化技术是Docker,它提供了一个开放的平台,用于构建、分发和运行容器。除了Docker,还有其他容器化技术,如Kubernetes、Podman、Containerd等。
容器的精髓在于镜像,而docker是容器镜像标准的制定者,因此,学习容器是绕不开docker的。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器
Docker的技术架构
- Docker 客户端(Client): Docker 客户端是用户与 Docker 交互的命令行工具或图形界面工具。用户可以使用 Docker 客户端发送命令和指令,例如构建镜像、创建容器、启动容器等。Docker 客户端与 Docker 主机进行通信,通过 API 接口或者 Docker 配置文件进行交互。常见的 Docker 客户端包括 Docker CLI(命令行界面)和 Docker Dashboard(图形用户界面)。
- Docker 主机(Docker Host): Docker 主机是安装和运行 Docker 引擎的物理或虚拟机器。它负责管理容器的创建、启动、停止和销毁等生命周期操作。Docker 主机上运行着 Docker 引擎,它接收来自 Docker 客户端的指令,并执行相应的操作。Docker 主机上可以同时运行多个容器,并提供了资源隔离、网络管理和存储管理等功能。
- 镜像仓库(Registry): 镜像仓库是用于存储和分发 Docker 镜像的中央仓库。镜像仓库允许用户上传、下载和共享镜像。当用户在 Docker 主机上创建镜像时,可以选择将镜像推送到镜像仓库中,以便其他人可以使用这个镜像。Docker Hub 是官方提供的公共镜像仓库,用户可以从中获取各种常用的镜像。除了 Docker Hub,还有一些私有和第三方的镜像仓库可供选择,例如 Harbor、Azure Container Registry 等。
在整个架构中,Docker 客户端与 Docker 主机通过 API 接口进行通信,Docker 主机负责管理容器的运行和资源隔离。镜像仓库则是存储和分享镜像的中央仓库,用户可以从中拉取镜像或将自己创建的镜像推送至其中。这样,Docker 技术架构实现了应用程序的打包、分发和部署,提供了一种便捷、可移植和可扩展的容器化环境。
容器的工作机制(Docker)
- Docker 客户端(Docker Client):Docker 客户端是用户与 Docker 交互的命令行工具或 GUI 工具。它向 Docker 引擎发送指令,如拉取镜像、创建容器、启动容器等。
- Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期,包括创建、启动、停止、删除等操作。它还提供了一组 API 接口和命令行工具,供用户与 Docker 进行交互。
- 容器(Container):容器是从容器镜像创建的运行实例。它是一个独立的、隔离的执行环境,其中应用程序可以在其中运行。容器具有自己的文件系统、网络和进程空间,但与主机系统是隔离的。
Docker 客户端和 Docker 引擎是分离的两个组件,Docker 客户端发送指令给 Docker 引擎,Docker 引擎执行指令并管理容器的生命周期。容器则是从容器镜像创建的运行实例,它具有隔离性、资源管理和网络管理等特性,使得应用程序可以在一个独立且可移植的环境中运行。
容器的关键技术 - Namespace
Namespace是Linux内核对系统资源进行隔离和虚拟化的特性,这些系统资源包括:
PID :PID 命名空间提供了进程 ID 的隔离。
User:User 命名空间提供了用户和用户组的隔离。
UTS:UTS 命名空间提供了主机名和域名的隔离。
IPC:IPC 命名空间提供了进程间通信(IPC)资源的隔离,如共享内存、信号量和消息队列等。
Net:Net 命名空间提供了网络资源的隔离,包括网络接口、IP 地址、路由表和网络命名空间等。
Mnt:Mnt 命名空间提供了文件系统挂载点的隔离。
Namespace隔离说明
以交互模式启动一个centos容器,并在其中运行/bin/bash程序。执行ps命令查看到“/bin/bash”是PID=1的进程,即docker将其隔离于宿主机中的其他进程
[root@localhost ~]# docker run -it centos /bin/bash
[root@24b87937f13d /]# ps axf
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 /bin/bash
14 pts/0 R+ 0:00 ps axf
打开另一个终端,使用docker inspect查看容器进程在宿主机上的真实PID。实际上,该容器上运行的”/bin/bash”在宿主机上是PID=96745的进程
[root@localhost ~]# docker inspect 24b87937f13d | grep Pid
"Pid": 96745,
"PidMode": "",
"PidsLimit": 0,
容器的关键技术 - Cgroup
Cgroups:Linux Control Group
作用:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等
Cgroups还能设置进程优先级,对进程进行挂起和恢复等操作
原理:将一组进程放在一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的
实现:在Linux中,Cgroups以文件和目录的方式组织在操作系统的/sys/fs/Cgroup路径下。该路径中所有的资源种类均可被Cgroup限制
Docker环境搭建
操作系统 | 内存 | 处理器 | 硬盘 | 网络 |
---|---|---|---|---|
Centos 8 Stream | 4 GB | 1 | 50GB | NAT |
1)安装基础软件包
[root@docker ~]# yum install -y vim net-tools bash-completion yum-utils
# 或者退出重新登录,为了自动补全
[root@docker ~]# bash
2)下载docker-ce repo文件
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# ls
CentOS-Stream-AppStream.repo
CentOS-Stream-BaseOS.repo
CentOS-Stream-Debuginfo.repo
CentOS-Stream-Extras-common.repo
CentOS-Stream-Extras.repo
CentOS-Stream-HighAvailability.repo
CentOS-Stream-Media.repo
CentOS-Stream-NFV.repo
CentOS-Stream-PowerTools.repo
CentOS-Stream-RealTime.repo
CentOS-Stream-ResilientStorage.repo
CentOS-Stream-Sources.repo
docker-ce.repo
3)安装
# 查看docker版本
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
# 默认安装最新版
[root@docker ~]# yum install -y docker-ce
# 安装指定版本
[root@docker ~]# yum install -y docker-ce-20.10.22 docker-ce-cli-20.10.22
4)启动
# 查看docker版本
[root@docker ~]# docker -v
Docker version 24.0.6, build ed223bc
#开启docker服务、开机自启、查看状态
[root@docker ~]# systemctl enable docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker ~]# systemctl start docker.service
[root@docker ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; >
Active: active (running) since Sun 2023-09-17 17:20:23 CST; 5s ago
Docs: https://docs.docker.com
Main PID: 12240 (dockerd)
Tasks: 7
Memory: 28.4M
CGroup: /system.slice/docker.service
└─12240 /usr/bin/dockerd -H fd:// --containerd=/run/conta>
Sep 17 17:20:22 docker systemd[1]: Starting Docker Application Conta>
Sep 17 17:20:22 docker dockerd[12240]: time="2023-09-17T17:20:22.760>
Sep 17 17:20:22 docker dockerd[12240]: time="2023-09-17T17:20:22.770>
Sep 17 17:20:23 docker dockerd[12240]: time="2023-09-17T17:20:23.159>
Sep 17 17:20:23 docker dockerd[12240]: time="2023-09-17T17:20:23.241>
Sep 17 17:20:23 docker dockerd[12240]: time="2023-09-17T17:20:23.250>
Sep 17 17:20:23 docker dockerd[12240]: time="2023-09-17T17:20:23.250>
Sep 17 17:20:23 docker dockerd[12240]: time="2023-09-17T17:20:23.263>
Sep 17 17:20:23 docker systemd[1]: Started Docker Application Contai>
5)配置镜像加速器
以阿里云镜像加速器为例
[root@docker ~]# mkdir -p /etc/docker
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://as5wzlk8.mirror.aliyuncs.com"]
}
EOF
{
"registry-mirrors": ["https://as5wzlk8.mirror.aliyuncs.com"]
}
[root@docker ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://as5wzlk8.mirror.aliyuncs.com"]
}
# 重新加载配置文件
[root@docker ~]# systemctl daemon-reload
# 重新启动docker服务
[root@docker ~]# systemctl restart docker.service
# 标准的完整名称 服务器 仓库/分类 镜像 版本
registry.cn-hangzhou.aliyuncs.com/cloudcs/centos:latest
# 版本默认情况下,如果不指定,那么默认为 latest
Docker基本操作
# 镜像的下载
[root@docker ~]# docker pull mysql
# 镜像重命名
[root@docker ~]# docker tag mysql:latest mysql:666
# 镜像的删除
[root@docker ~]# docker rmi mysql:latest
# 镜像历史信息
[root@docker ~]# docker history mysql:latest
# 镜像保存
[root@docker ~]# docker save mysql alpine > /tmp/all.tar
# 镜像导入
[root@docker ~]# docker load -i /tmp/all.tar
尝试运行一个容器
[root@docker ~]# docker run -tid --name d1 --restart always alpine
44936d56248d3c9657e502168ea91098b2caa69a065a7d712dd4d3048b3f508d
# 查看正在运行容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44936d56248d alpine "/bin/sh" 26 seconds ago Up 25 seconds d1
# 进入容器
[root@docker ~]# docker exec -ti d1 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # exit
感谢您阅读本文。我希望它能给您带来新的思考和启发,并为您的未来带来积极的影响。如果小伙伴们有任何问题或想法,请在下方留言,我会很乐意与您交流。谢谢各位小伙伴的支持。
- 点赞
- 收藏
- 关注作者
评论(0)