轻松上手Docker:学习如何创建和运行自己的Docker容器

文章目录

  • 轻松上手Docker:学习如何创建和运行自己的Docker容器
    • 容器的介绍
    • Docker的技术架构
    • 容器的工作机制(Docker)
    • 容器的关键技术 - Namespace
      • Namespace隔离说明
    • 容器的关键技术 - Cgroup
    • Docker环境搭建
      • 1)安装基础软件包
      • 2)下载docker-ce repo文件
      • 3)安装
      • 4)启动
      • 5)配置镜像加速器
    • Docker基本操作
    • 尝试运行一个容器

轻松上手Docker:学习如何创建和运行自己的Docker容器

容器的介绍

容器化技术,它是一种虚拟化技术,用于在计算机系统中隔离和运行应用程序。容器将应用程序及其所有依赖项打包到一个独立的、可移植的环境中,使其能够在不同的计算机或操作系统上运行。

容器的特点:隔离性、轻量级、可移植性、弹性伸缩、生态系统。

轻松上手Docker:学习如何创建和运行自己的Docker容器_第1张图片

目前最流行的容器化技术是Docker,它提供了一个开放的平台,用于构建、分发和运行容器。除了Docker,还有其他容器化技术,如Kubernetes、Podman、Containerd等。

容器的精髓在于镜像,而docker是容器镜像标准的制定者,因此,学习容器是绕不开docker的。

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器

Docker的技术架构

轻松上手Docker:学习如何创建和运行自己的Docker容器_第2张图片

  1. Docker 客户端(Client): Docker 客户端是用户与 Docker 交互的命令行工具或图形界面工具。用户可以使用 Docker 客户端发送命令和指令,例如构建镜像、创建容器、启动容器等。Docker 客户端与 Docker 主机进行通信,通过 API 接口或者 Docker 配置文件进行交互。常见的 Docker 客户端包括 Docker CLI(命令行界面)和 Docker Dashboard(图形用户界面)。
  2. Docker 主机(Docker Host): Docker 主机是安装和运行 Docker 引擎的物理或虚拟机器。它负责管理容器的创建、启动、停止和销毁等生命周期操作。Docker 主机上运行着 Docker 引擎,它接收来自 Docker 客户端的指令,并执行相应的操作。Docker 主机上可以同时运行多个容器,并提供了资源隔离、网络管理和存储管理等功能。
  3. 镜像仓库(Registry): 镜像仓库是用于存储和分发 Docker 镜像的中央仓库。镜像仓库允许用户上传、下载和共享镜像。当用户在 Docker 主机上创建镜像时,可以选择将镜像推送到镜像仓库中,以便其他人可以使用这个镜像。Docker Hub 是官方提供的公共镜像仓库,用户可以从中获取各种常用的镜像。除了 Docker Hub,还有一些私有和第三方的镜像仓库可供选择,例如 Harbor、Azure Container Registry 等。

在整个架构中,Docker 客户端与 Docker 主机通过 API 接口进行通信,Docker 主机负责管理容器的运行和资源隔离。镜像仓库则是存储和分享镜像的中央仓库,用户可以从中拉取镜像或将自己创建的镜像推送至其中。这样,Docker 技术架构实现了应用程序的打包、分发和部署,提供了一种便捷、可移植和可扩展的容器化环境。

容器的工作机制(Docker)

轻松上手Docker:学习如何创建和运行自己的Docker容器_第3张图片

  1. Docker 客户端(Docker Client):Docker 客户端是用户与 Docker 交互的命令行工具或 GUI 工具。它向 Docker 引擎发送指令,如拉取镜像、创建容器、启动容器等。
  2. Docker 引擎(Docker Engine):Docker 引擎是 Docker 的核心组件,负责管理容器的生命周期,包括创建、启动、停止、删除等操作。它还提供了一组 API 接口和命令行工具,供用户与 Docker 进行交互。
  3. 容器(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

感谢您阅读本文。我希望它能给您带来新的思考和启发,并为您的未来带来积极的影响。如果小伙伴们有任何问题或想法,请在下方留言,我会很乐意与您交流。谢谢各位小伙伴的支持。

你可能感兴趣的:(docker+k8s,docker,容器)