docker基础
文章目录
- docker基础
-
- 容器
- [Docker 的核心组件](#Docker 的核心组件)
- [Docker 内部具体实现](#Docker 内部具体实现)
- docker安装
- 配置镜像加速器(华为云)
- [docker C/S分离部署](#docker C/S分离部署)
容器
- 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运 行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服 务器或公有云主机上运行。
- 与虚拟机对比,两者都是为应用提供封装和隔离。容器由应用程序本身和依赖(比如应用程序需要的库或其他软件)组成。容器启动速度快、内核共享、进程级别隔离、宿主机直接管理、分层镜像、一台服务器可启动1000+台容器。
- 容器使软件具备了超强的可移植能力。例如集装箱的发明。容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他 机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效, 一致和可重复。
Docker 的核心组件
- Docker 客户端 - Client
- Docker 服务器 - Docker daemon
- Docker 镜像 - Image
- Registry 仓库
- Docker 容器 - Container
Docker 内部具体实现
- 用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
- Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受 Docker Client的请求
- Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
- Job的运行过程中,当需要容器镜像时,则从DockerRegistry中下载镜像,并通过镜像管理驱动 Graph driver将下载镜像以Graph的形式存储。
- 当需要为Docker创建网络环境时,通过网络管理驱动Networkdriver创建并配置Docker容器网络环 境。
- 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
- Libcontainer是一项独立的容器管理包,Networkdriver以及Execdriver都是通过Libcontainer来实 现具体对容器进行的操作。
docker安装
安装 Docker Docker 支持几乎所有的 Linux 发行版,也支持 Mac 和 Windows。各操作系统的安装方法可以访问:https://docs.docker.com/engine/installation/
bash
#克隆centos-stream-8模板
#修改主机名和ip地址
[root@localhost ~]# hostnamectl set-hostname docker
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual
[root@localhost ~]# nmcli con up ens160
#卸载旧版本(可选)
[root@docker ~]# yum remove docker-ce
#安装必要工具
# devicemapper 存储驱动已经在 docker 18.09 版本中被废弃,所以在后续的安Docker装中无需安装devicemapper支持。
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim
[root@localhost ~]# yum-config-manager --add-repo
[root@localhost ~]# yum makecache
#allinone部署
#安装软件
[root@docker ~]# yum install -y docker-ce
#配置服务
[root@docker ~]# systemctl enable docker.service --now
#验证状态
[root@docker ~ 10:08:02]# docker --version
Docker version 26.1.3, build b72abbb
[root@docker ~ 10:08:06]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: dis>
Active: active (running) since Mon 2026-01-12 10:08:02 CST; 9s ago
Docs: https://docs.docker.com
Main PID: 11423 (dockerd)
Tasks: 10
Memory: 34.0M
...
配置镜像加速器(华为云)
bash
#打开华为云swr容器镜像服务
[root@docker ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://4763bb9ecfcd4b229c2653d0d8c88618.mirror.swr.myhuaweicloud.com" ]
}
#重启容器引擎
[root@docker ~]# systemctl restart docker
#确认配置结果
[root@docker ~]# docker info
#运行第一个容器
[root@docker ~]# docker run hello-world
#其过程可以简单的描述为:
#1. 从本地查找hello-wrold镜像,没找到
#2. 从 Docker Hub 下载hello-world镜像。
#3. 启动hello-world容器。
#清空实验环境
#删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
#删除镜像hello-world
[root@docker ~]# docker rmi -f hello-world
#关机拍摄快照
#运行第二个容器
[root@docker ~]# docker run -d -p 80:80 httpd
#其过程可以简单的描述为:
#1. 从 Docker Hub 下载 httpd 镜像。镜像中已经安装好了 Apache HTTP Server。
#2. 启动 httpd 容器,并将容器的 80 端口映射到 host 的 80 端口。
[root@docker ~]# curl 192.168.108.30
#可以访问容器的 http 服务,第一个容器运行成功,拥有了一个 WEB 服务器。
docker C/S分离部署
- docker server端配置
bash
#克隆两份centos-stream-8模板
#ip 192.168.108.30
[root@localhost ~]# hostnamectl set-hostname docker_server
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.30/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
[root@localhost ~]# nmcli con up ens160
#安装软件
[root@docker_server ~]# yum install -y yum-utils device-mapper-persistent-data
lvm2 vim
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker_server~]# yum makecache
[root@docker_server ~]# yum install -y docker-ce
[root@docker_server ~]# systemctl enable docker.service --now
[root@docker_server ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://4763bb9ecfcd4b229c2653d0d8c88618.mirror.swr.myhuaweicloud.com"]
}
#重启容器引擎
[root@docker_server ~]# systemctl restart docker
#配置服务
[root@docker_server ~]# vim /usr/lib/systemd/system/docker.service
# 在ExecStart参数中最后添加 -H tcp://0.0.0.0:2375,docker默认监听2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H tcp://0.0.0.0:2375
[root@docker_server ~]# systemctl daemon-reload
[root@docker_server ~]# systemctl restart docker.service
[root@docker_server ~]# systemctl stop firewalld
#验证
[root@docker_server ~]# yum install lsof
[root@docker_server ~]# lsof -i :2375
- docker_client端
bash
#ip 192.168.108.31
[root@localhost ~]# hostnamectl set-hostname docker_client
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.31/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
[root@localhost ~]# nmcli con up ens160
#只安装docker客户端
[root@docker-client ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 vim
[root@docker-client ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker-client~]# yum makecache
[root@docker-client ~]# yum install -y docker-ce-cli
#验证
[root@docker_client ~]# docker run hello-world
#client直接执行报错,没有装服务端
# client端连接server端执行命令
[root@docker-client ~]# docker -H 192.168.108.30 run hello-world
[root@docker-client ~]# docker -H 192.168.108.30 images
#这里也可以切换到Server端查看现象
#client只做管理,image和container存储在server端。
er端执行命令
root@docker-client \~\]# docker -H 192.168.108.30 run hello-world \[root@docker-client \~\]# docker -H 192.168.108.30 images #这里也可以切换到Server端查看现象 #client只做管理,image和container存储在server端。 ``` ```