二、部署docker

二、安装与部署

2.1 安装环境概述

Docker划分为CE和EE,CE为社区版(免费,支持周期三个月),EE为企业版(强调安全,付费使用)。

Docker CE每月发布一个Edge版本(17.03,17.04,17.05......),每三个月发布一个Stable版本(17.03,17.06,17.09......);docker EE和stable版本号保持一致,每个版本提供一年维护。

(1)依赖的基础环境

  • 64 位CPU
  • Linux kernel(内核) 3.10+
  • Linux kernel cgroups and namespaces

(2)查询自己服务器的环境

① 使用的操作系统版本

bash 复制代码
# cat /etc/redhat-release
Red Hat Enterprise Linux release 9.3 (Plow)

② 内核版本

bash 复制代码
# uname -r
5.14.0-362.8.1.el9_3.x86_64

③ ip地址

bash 复制代码
# hostname -I

④卸载旧版本,旧版本的Docker称为docker或者docker-engine:

bash 复制代码
# yum remove docker docker-common docker-selinux docker-engine

2.2 安装docker

docker的安装官方文档:https://docs.docker.com/engine/install/centos/

2.2.1 使用yum安装

(1)添加docker-ce 源信息

bash 复制代码
安装依赖包(yum-utils 提供了 yum-config-manager):
# yum install yum-utils -y
# yum-config-manager  --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo

(2)修改docker-ce源

bash 复制代码
# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

##或者手动写仓库
# cat docker-ce.repo
[docker-ce]
name=cocker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0

(3)更新源

bash 复制代码
# yum makecache

(4)安装docker-ce

①默认安装docker-ce是最新版本

bash 复制代码
#  yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
bash 复制代码
# rpm -q docker-ce
docker-ce-27.1.2-1.el9.x86_64
# systemctl start docker
# systemctl status docker

②安装指定版本

bash 复制代码
# yum list docker-ce --showduplicates |  sort -r
bash 复制代码
[root@rhel9 ~]# yum install docker-ce-26.1.4-1.el9 -y
[root@rhel9 ~]# systemctl start docker
[root@rhel9 ~]# systemctl status docker

2.2.2 二进制安装

官方指导文档:https://docs.docker.com/engine/install/binaries/#install-daemon-and-client-binaries-on-linux

(1)下载二进制文件

二进制文件的下载路径:https://download.docker.com/linux/static/stable/

bash 复制代码
#此次安装的是docker-25.0.5
[root@rocky9 ~]# mkdir -p /data
[root@rocky9 ~]# wget -P /data/ https://download.docker.com/linux/static/stable/x86_64/docker-25.0.5.tgz
[root@rocky9 ~]# cd /data/
[root@rocky9 data]# tar xf docker-25.0.5.tgz
[root@rocky9 data]# cp docker/*  /usr/bin/
[root@rocky9 data]# dockerd  &

2.3 查看当前docker信息

在docker安装之后,默认会生成一个名称为docker0的网卡并且默认IP地址为172.17.0.1

bash 复制代码
[root@rhel9 ~]# ip a show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:2e:42:6f:44 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

查看docker当前的版本

bash 复制代码
#验证docker的版本
[root@rhel9 ~]# docker version
Client: Docker Engine - Community
 Version:           27.1.2
 API version:       1.46
 Go version:        go1.21.13
 Git commit:        d01f264
 Built:             Mon Aug 12 11:52:49 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.1.2
  API version:      1.46 (minimum version 1.24)
  Go version:       go1.21.13
  Git commit:       f9522e5
  Built:            Mon Aug 12 11:51:10 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.20
  GitCommit:        8fc6bcff51318944179630522a095cc9dbf9f353
 runc:
  Version:          1.1.13
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

查看当前的容器、镜像、仓库等信息

bash 复制代码
[root@rhel9 ~]# docker info
Client: Docker Engine - Community
 Version:    27.1.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.16.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0   #当前主机运行的容器总数
  Running: 0     #有几个容器是正在运行的
  Paused: 0     #有几个容器是暂停的
  Stopped: 0    #有几个容器是停止的
 Images: 0     #当前主机上的镜像数
 Server Version: 27.1.2  #服务端版本
 Storage Driver: overlay2  #正在使用的存储引擎
  Backing Filesystem: xfs  #后端文件系统,即服务器的磁盘文件系统
  Supports d_type: true   #是否支持d_type
  Using metacopy: false   
  Native Overlay Diff: true  #是否支持差异数据存储
  userxattr: false
 Logging Driver: json-file  #日志类型
 Cgroup Driver: systemd  #cgroups类型
 Cgroup Version: 2
 Plugins:  #插件
  Volume: local
  Network: bridge host ipvlan macvlan null overlay  
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive  
 Runtimes: io.containerd.runc.v2 runc  #已安装的容器运行时
 Default Runtime: runc #默认使用的容器运行时
 Init Binary: docker-init  #初始化容器的守护进程,即pid为1的进程
 containerd version: 8fc6bcff51318944179630522a095cc9dbf9f353
 runc version: v1.1.13-0-g58aa920
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.14.0-362.8.1.el9_3.x86_64
 Operating System: Red Hat Enterprise Linux 9.3 (Plow)
 OSType: linux
 Architecture: x86_64
 CPUs: 2  #宿主机cpu数量
 Total Memory: 1.692GiB  #宿主机总内存
 Name: rhel9
 ID: 681118d1-e2e3-41a7-b24d-0ae36f8cc338
 Docker Root Dir: /var/lib/docker  #宿主机数据保存目录
 Debug Mode: false
 Experimental: false   #是否测试版
 Insecure Registries:   #非安全的镜像仓库
  127.0.0.0/8  
 Live Restore Enabled: false  #是否开启活动重启(重启docker-daemon不关闭容器)

容器的创建与管理过程:

1、dockerd进程:docker client直接访问dockerd(其父进程为宿主机的systemd守护进程)进程。dockerd通过grpc和containerd模块通信,dockerd和containerd通信的socket文件:/run/containerd/containerd.sock。

2、containerd进程:containerd在dockerd启动时被启动,然后containerd启动grpc请求监听,containerd根据grpc请求做相应动作。containerd可以在宿主机中管理完整的容器生命周期(容器镜像的传输和存储,容器的执行和管理,存储和网络等)。

3、containerd-shim进程:若是创建容器,containerd拉起一个/usr/bin/containerd-shim进程,并进行相应的创建操作。containerd-shim套件其目的主要是隔离containerd和容器。

4、containerd-shim-runc-v2进程: containerd-shim启动后会去启动/usr/bin/containerd-shim-runc-v2,然后立即退出,此时containerd-shim-runc-v2的父进程就变成了systemd(1),这样containerd-shim-runc-v2就和containerd脱离了关系,即便containerd退出也不会影响到容器(这也是containerd-shim套件的作用) 。

5、runc:OCl标准的具体实现就是runc,真正创建和维护容器便是由runc来完成的。/usr/bin/containerd-shim-runc-v2会启动runc去create、start容器,然后runc立即退出,容器的父进程就变成了containerd-shim-runc-v2。containerd-shim-runc-v2会收集容器进程的状态,上报给containerd。

6、docker-proxy:实现容器通信,其父进程为dockerd

bash 复制代码
[root@rhel9 yum.repos.d]# ps -ef | egrep "(docker|containerd)"
root        3751       1  1 09:45 ?        00:00:00 /usr/bin/containerd
root        3760       1  1 09:45 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
[root@rhel9 ~]# pstree -p | egrep "(systemd|docker|containerd)"
systemd(1)-+-ModemManager(886)-+-{ModemManager}(925)
           |-containerd(3751)-+-{containerd}(3752)
           |                  |-{containerd}(3753)
           |                  |-{containerd}(3754)
           |                  |-{containerd}(3755)
           |                  |-{containerd}(3756)
           |                  |-{containerd}(3758)
           |                  `-{containerd}(3759)
           |-dockerd(3760)-+-{dockerd}(3761)
           |               |-{dockerd}(3762)
           |               |-{dockerd}(3763)
           |               |-{dockerd}(3764)
           |               |-{dockerd}(3765)
           |               |-{dockerd}(3766)
           |               |-{dockerd}(3767)
           |               `-{dockerd}(3768)

#运行一个容器
[root@master0101 ~]# docker run -d nginx:1.27-alpine
4a2eb061a84206517b8645da5161e0711d752c5f2d3fb159f3b22164da86ed1b

#查看进程
[root@master0101 ~]# ps -ef | grep containerd
root        3751       1  0 09:45 ?        00:00:00 /usr/bin/containerd
root        3760       1  0 09:45 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       11106       1  0 10:04 ?        00:00:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 4a2eb061a84206517b8645da5161e0711d752c5f2d3fb159f3b22164da86ed1b -address /run/containerd/containerd.sock

#再次运行容器,进行端口映射,可以通过宿主机端口访问容器
[root@master0101 ~]# docker run -d -P nginx:1.27-alpine
f134ebaabc20d266ab326a64d4ff521516dbdda2c0617114abb5bbae0922b247
#查看容器端口映射到宿主机的端口
[root@master0101 ~]# docker ps
CONTAINER ID   IMAGE               COMMAND                   CREATED              STATUS              PORTS                                       NAMES
f134ebaabc20   nginx:1.27-alpine   "/docker-entrypoint...."   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp, [::]:32768->80/tcp   happy_gauss

#查看docker-proxy进程
[root@master0101 ~]# ps -ef | grep docker-proxy
root       26183    3760  0 10:44 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.2 -container-port 80
root       26195    3760  0 10:44 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 32768 -container-ip 172.17.0.2 -container-port 80
root       26601    9640  0 10:44 pts/1    00:00:00 grep --color=auto docker-proxy

2.4 docker镜像加速配置

国内从Docker Hub拉取镜像有时会遇到困难,可以通过修改docker配置文件的方式添加一个加速器,可以通过加速器达到下载镜像的目的。

(1)从2017年6月9日起,Docker 官方提供了在中国的加速器,以解决墙的问题。不用注册,直接使用加速器地址:https://registry.docker-cn.com 即可。

(2)中国科技大学的镜像加速器:中科大的加速器不用注册,直接使用地址 https://docker.mirrors.ustc.edu.cn/ 配置加速器即可。进一步的信息可以访问:http://mirrors.ustc.edu.cn/help/dockerhub.html?highlight=docker

(3)阿里云加速器:注册阿里云开发账户(免费的)后,访问这个链接就可以看到加速器地址: https://cr.console.aliyun.com/#/accelerator

(4)DaoCloud 加速器:注册 DaoCloud 账户(支持微信登录),然后访问: https://www.daocloud.io/mirror#accelerator-doc

bash 复制代码
#配置docker镜像加速
[root@rhel9 ~]# cat /etc/docker/daemon.json
{
        "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.ru",
        "https://hub.oepkgs.net",
        "https://huecker.io",
		"https://dockerhub.timeweb.cloud" 
        ]
}
[root@rhel9 ~]# systemctl daemon-reload
[root@rhel9 ~]# systemctl restart docker
#此处配置了部分
[root@rhel9 ~]# docker info  | grep -iA 4 registry
 Registry Mirrors:
  https://docker.m.daocloud.io/
  https://huecker.io/
  https://dockerhub.timeweb.cloud/
  https://noohub.ru/
#出现该内容表示镜像加速配置成功
bash 复制代码
#拉取hello-world镜像,测试能否拉取
[root@rhel9 ~]# docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
[root@rhel9 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   15 months ago   13.3kB
相关推荐
feng_blog66882 分钟前
【docker-1】快速入门docker
java·docker·eureka
贾贾202331 分钟前
配电自动化系统“三区四层”数字化架构
运维·科技·架构·自动化·能源·制造·智能硬件
远方 hi2 小时前
linux如何修改密码,要在CentOS 7系统中修改密码
linux·运维·服务器
元气满满的热码式2 小时前
K8S中Service详解(一)
云原生·容器·kubernetes
资讯分享周3 小时前
过年远控家里电脑打游戏,哪款远控软件最好用?
运维·服务器·电脑
chaodaibing4 小时前
记录一次k8s起不来的排查过程
运维·服务器·k8s
mcupro4 小时前
提供一种刷新X410内部EMMC存储器的方法
linux·运维·服务器
不知 不知5 小时前
最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
linux·运维·服务器·centos
BUG 4045 小时前
Linux--运维
linux·运维·服务器
MXsoft6186 小时前
华为E9000刀箱服务器监控指标解读
大数据·运维