Docker容器
一、部署Docker服务
0.0 配置基础信息、关闭防火墙及SELinux
bash
# 配置静态IP地址并编写主机名(以下使用的dns为阿里云的dns服务器)
~]# nmcli c show
~]# nmcli c modify 网卡名 ipv4.method manual ipv4.addresses xxxx ipv4.gateway xxxx ipv4.dns 223.5.5.5
~]# hostnamectl set-hostname xxxx
~]# bash
~]# systemctl disable --now firewalld
~]# vi /etc/selinux/config
SELINUX=disabled
~]# reboot
1.0 部署软件仓库并安装Epel拓展库
bash
~]# cd /etc/yum.repos.d/
yum.repos.d]# rm -rf *
[root@localhost ~]# vim /etc/yum.repos.d/aliyun.repo
[AppStream]
name=AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/8/AppStream/x86_64/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/rockylinux/8/AppStream/x86_64/os/RPM-GPG-KEY-rockyofficial
[BaseOS]
name=BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/8/BaseOS/x86_64/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/rockylinux/8/AppStream/x86_64/os/RPM-GPG-KEY-rockyofficial
yum clean all && yum makecache
# 下载Epel库
[root@docker ~]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@docker ~]# /usr/bin/crb enable
[root@docker ~]# yum install epel-release
1.1 配置时间同步
bash
# 配置时间同步并创建计划性任务
~]# yum install -y chrony
# 这里使用的是阿里云的ntp时间同步服务器
~]# vim /etc/chrony.conf
3 server ntp.aliyun.com iburst
~]# systemctl enable --now chronyd.service
~]# systemctl restart chronyd.service
# 后续如果出现偏差,使用以下两个命令进行查看并手动同步
]# chronyc sources
]# chronyc makestep
1.2 安装Docker服务
1.2.1 方法一
bash
[root@docker ~]# vim /etc/yum.repos.d/docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/8/x86_64/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/rhel/gpg
# 修改机器内核参数
# 有些操作系统执行`modprobe br_netfilter`会报错(那就不用管了)
[root@docker ~]# modprobe br_netfilter
[root@docker ~]# vim /etc/sysctl.d/docker.conf
[root@docker ~]# sysctl -p /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
1.2.2 方法二
bash
`yum-utils`是一个yum包管理器
~]# yum install yum-utils -y
# 阿里云官网去寻找docker的在线源
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 进行下载repo文件(根据操作系统去选择适于自己的)
~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
~]# yum clean all && yum makecache
[root@localhost ~]# vim /etc/yum.repos.d/docker-ce.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/8/x86_64/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/rhel/gpg
# 修改机器内核参数
# 有些操作系统执行`modprobe br_netfilter`会报错(那就不用管了)
[root@docker ~]# modprobe br_netfilter
[root@docker ~]# vim /etc/sysctl.d/docker.conf
[root@docker ~]# sysctl -p /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1允许 Linux 内核在网络层面上进行 IPv6 数据包的过滤和处理;
net.bridge.bridge-nf-call-iptables = 1允许 Linux 内核在网络层面上进行 IPv4 数据包的过滤和处理
net.ipv4.ip_forward = 1启用了 Linux 内核的 IP 转发功能,允许 Linux 主机将收到的数据包从一个网络接口转发到另一个网络接口
bash
# 进行安装Dcoker
[root@docker ~]# yum install -y docker-ce
[root@docker ~]# systemctl enable --now docker
[root@docker ~]# systemctl status docker.service -l
1.3 配置Docker镜像加速器
不会科学上网,不想等待很长时间,不想拉取很慢,就正常看步骤配置即可。
此时,不想搭建私有Harbor仓库或者不想访问dockerhub的话。
这里可以购买阿里云云产品-ACR-容器镜像服务
https://www.aliyun.com/product/acr
还是建议搭建私有Harbor仓库
bash
# 这里的话,先不进行搭建Harbor仓库
# 先使用加速地址来练习
# 以下daemon.json来源不清楚,所以慎用但是练习足够了
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://a88uijg4.mirror.aliyuncs.com","https://docker.lmirror.top","https://docker.m.daocloud.io", "https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn","https://docker.laoex.link"],
"insecure-registries":["192.168.40.62","harbor"]
}
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker.service
# 进行测试,拉取成功即可
[root@docker ~]# docker pull nginx
[root@docker ~]# docker images
二、Docker的基本用法
2.1 Docker的基本操作
bash
# 以下操作使用的都是案例,请根据实际情况进行操作
# 拉取镜像
[root@docker ~]# docker pull busybox
# 查看所有镜像
[root@docker ~]# docker images
# 做成离线镜像文件
[root@docker ~]# docker save -o busybox.tar.gz busybox:latest
# 加载离线镜像文件
[root@docker ~]# docker load -i busybox.tar.gz
# 删除镜像
[root@docker ~]# docker rmi -f xxx
如果遇到pull拉取不下来的,请使用资源包里面的文件,谢谢
2.2 容器的相关操作

bash
# 以交互式方式启动并进入容器
docker ~]# docker run --name=hello -it rockylinux:8.9 /bin/bash
1.`docker run` --> 创建并运行一个容器
2.`--name=hello` --> 为此容器指定一个名称,名称为"hello"
3.`-it`
`-i`:保持标准输入打开,可以进入到容器中输命令
`-t`:为此容器分配一个伪终端,可以看到终端的输出
`-it`:这俩参数通常一起使用 --> 在容器中启动一个交互式的shell
4.`/bin/bash` --> 在容器启动后运行的命令 --> 启动Bash Shell
# 退出的话使用exit或者ctrl+d
docker ~]# docker run --name=hello -it rockylinux:8.9 /bin/bash
[root@acb0b3bee6e6 /]# exit
exit
# 查看正在运行的容器
[root@docker ~]# docker ps
# 查看停止和运行的容器
[root@docker ~]# docker ps -a
bash
# 以守护进程方式启动
docker ~]# docker run --name=xixi -d rockylinux:8.9
1.`-d`:后台运行
[root@docker ~]# docker ps
# 进入到容器
[root@docker ~]# docker exec -it xixi /bin/bash
[root@a6e9d8e13826 /]# exit
exit
# 停止与启动容器
[root@docker ~]# docker stop xixi
[root@docker ~]# docker start xixi
# 删除容器(docker rm -f --> 请注意!docker里面没有 -rf,只有 -f)
[root@docker ~]# docker ps -a
[root@docker ~]# docker rm -f xxx
# 查看docker的帮助
docker ~]# docker --help
bash
示例:使用docker部署nginx服务
]# docker run --name nginx -p 80 -it rockylinux:8.9
/]# yum install -y wget nginx vim
[root@0d76a2a78830 /]# mkdir -p /usr/share/nginx/html/Mine/
[root@0d76a2a78830 /]# vim /usr/share/nginx/html/Mine/index.html
Kaser is my name.
[root@0d76a2a78830 /]# vim /etc/nginx/nginx.conf
42 root /usr/share/nginx/html/Mine;
# 容器里面启动服务并访问测试
[root@0d76a2a78830 /]# /usr/sbin/nginx
[root@0d76a2a78830 /]# curl `hostname -I`
Kaser is my name.
# 再打开一个终端查看端口
[root@docker ~]# docker ps | grep nginx
0.0.0.0:32770->80/tcp, [::]:32770->80/tcp nginx
[root@docker ~]# curl 172.25.254.10:32770
Kaser is my name.
# 容器关闭之后,再次访问就会出现:
[root@docker ~]# curl 172.25.254.10:32770
curl: (7) Failed to connect to 172.25.254.10 port 32770: Connection refused
提问:访问http://172.25.254.10:32700为何能请求到docker容器内的Nginx服务?
bash
1、当你访问 http://172.25.254.10:32700 时,请求首先到达 Docker 主机的 32700 端口。
2、Docker 的 iptables 规则会将这个端口上的请求转发到 docker0 网桥上的某个 veth 接口,对应到目标容器的 IP 地址和端口。
3、容器内的服务:
1.容器内的 nginx 服务接收到请求,处理并生成响应。
2.响应通过容器内的 eth0 接口,再通过 veth 对回到 docker0 网桥,最后回到主机的网络接口。
4、响应回到客户端:
1.响应沿着同样的路径返回,最终通过 Docker 主机的 32768 端口返回给发起请求的客户端。
备注:
docker0网桥是啥?
1.docker0 网桥作为一个虚拟交换机,会将来自主机的网络流量转发到目标容器的 veth 设备上。
2.docker0 网桥使主机和容器之间可以透明地通信。
veth是啥?
1.主机上的 veth 设备将流量通过 docker0 网桥传递给与其配对的容器内的 eth0(或相应的网络接口)。
2.容器内的 eth0 接口接收到流量后,将其转发到容器内监听该端口的服务(例如 nginx)。
