Docker生态架构及部署
一、生态架构
Docker Host
用于安装Docker daemon的主机,即为Docker Host,并且该主机中可基于容器镜像运行容器.
Docker daemon
用于管理Docker Host中运行的容器、容器镜像、容器网络等,管理由Containerd.io提供的容器
Registry
容器镜像仓库,用于存储已生成容器运行模板的仓库,用户使用时,可直接从容器镜像仓库中下载容器镜像,即容器运行模板,就可以运行容器镜像中包含的应用了。例如: Docker Hub,也可以使用Harbor实现企业私有的容器镜像仓库。
Docker client
Docker Daemon客户端工具,用于同Docker Daemon进行通信,执行用户指令,可部署在Docker Host上,也可以部署在其它主机,能够连接到Docker Daemon即可操作。
lmage
把应用运行环境及计算资源打包方式生成可再用于启动容器的不可变的基础设施的模板文件,主要用于基于其启动个容器。
Container
由容器镜像生成,用于应用程序运行的环境,包含容器镜像中所有文件及用户后添加的文件,属于基于容器镜像生成的可读写层,这也是应用程序活跃的空间。
Docker Dashboard
*仅限于MAC与Windows操作系统上安装使用。
Docker Dashboard 提供了一个简单的界面,使您能够直接从您的机器管理您的容器、应用程序和映像,而无需使用 CLI 来执行核心操作。
二、Docker部署
1、环境要求
2、YUM安装
perl
[root@VM-3-8-centos ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@VM-3-8-centos ~]# ls /etc/yum.repos.d/
CentOS-Epel.repo CentOS-Stream-Extras.repo CentOS-Stream-RealTime.repo
CentOS-Stream-AppStream.repo CentOS-Stream-HighAvailability.repo CentOS-Stream-ResilientStorage.repo
CentOS-Stream-BaseOS.repo CentOS-Stream-Media.repo CentOS-Stream-Sources.repo
CentOS-Stream-Debuginfo.repo CentOS-Stream-PowerTools.repo docker-ce.repo
[root@VM-3-8-centos ~]# yum repolist
repo id repo name
appstream CentOS Stream 8 - AppStream
baseos CentOS Stream 8 - BaseOS
docker-ce-stable Docker CE Stable - x86_64
epel EPEL for redhat/centos 8 - x86_64
extras CentOS Stream 8 - Extras
[root@VM-3-8-centos ~]# yum -y install docker-ce
#安装Docker-ce
[root@VM-3-8-centos ~]# vim /usr/lib/systemd/system/docker.service
#编辑配置文件
#13 ExecStart=/usr/bin/dockerd
#14 ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
[root@VM-3-8-centos ~]# systemctl start docker
[root@VM-3-8-centos ~]# systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
#配置自启动
[root@VM-3-8-centos ~]# docker version
#验证安装版本
卸载Docker
perl
[root@VM-3-8-centos ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
#停止服务
[root@VM-3-8-centos ~]# yum remove docker-ce containerd.io docker-ce-cli
#依次卸载docker社区版&依赖,客户端
[root@VM-3-8-centos ~]# docker version
bash: /usr/bin/docker: No such file or directory
#验证卸载完成
3、二进制安装
不支持更新Docker版本,不建议 官方文档:docs.docker.com/engine/inst...
csharp
[root@VM-3-8-centos ~]# tar xzvf /root/docker-20.10.9.tgz
#解压二进制文件
[root@VM-3-8-centos ~]# ls docker
containerd containerd-shim-runc-v2 docker docker-init runc
containerd-shim ctr dockerd docker-prox
#解压结果
[root@VM-3-8-centos ~]# cp docker/* /usr/bin/
#将二进制文件移动到可执行路径上的目录
[root@VM-3-8-centos ~]# dockerd &
#启动 Docker 守护进程
[root@VM-3-8-centos ~]# docker version
#验证安装
[root@VM-3-8-centos ~]# docker run hello-world
#验证运行
三、使用容器运行Nginx应用及Docker命令
1、使用容器运行Nginx应用
1.观察下载容器镜像过程
csharp
[root@VM-3-8-centos ~]# docker run -d nginx:latest
#运行一个以nginx:latest为模版的容器,-d本机后台执行
Unable to find image 'nginx:latest' locally
#没有找到镜像,去镜像仓库拉取镜像
latest: Pulling from library/nginx
[root@VM-3-8-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7968d5bcd0f0 nginx:latest "/docker-entrypoint...." 5 minutes ago Up 5 minutes 80/tcp practical_bose
#容器ID 容器镜像 容器中运行的命令 容器创建的时间 容器状态 容器提供的访问端口 容器名称
#提示:容器无命令,自动停止
2.确认容器的IP地址
csharp
[root@VM-3-8-centos ~]# docker inspect 7968d5bcd0f0
#容器ID可短识别,唯一即可
[root@VM-3-8-centos ~]# ip a s
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:b4:16:2d:ff brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
7: veth618cbea@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
#验证Docker网络拓扑图
3.使用curl命令访问容器
xml
[root@VM-3-8-centos ~]# curl http://172.17.0.2
<!DOCTYPE html>
<html>
......
</html>
2、Docker命令
1.Docker命令帮助or官方文档
csharp
[root@VM-3-8-centos ~]# docker -h
Command-line reference > Docker CLI (docker):docs.docker.com/reference/
2.docker run命令
csharp
[root@VM-3-8-centos ~]# docker run -i -t --name cl centos:latest bash
命令解释
docker run 运行一个命令在容器中,命令是主体,没有命令容器就会消亡
-i 交互式
-t 提供终端
-d 后台运行
--name c1 把将运行的容器命名为c1
centos:latest 使用centos最新版本容器镜像
bash 在容器中执行的命令
[root@bc134c97bb2b /]#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 12052 3304 pts/0 Ss 15:11 0:00 bash
root 17 0.0 0.1 44668 3452 pts/0 R+ 15:13 0:00 ps aux
#容器内所有用户的进程信息
[root@bc134c97bb2b /]# pwd
/
[root@bc134c97bb2b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#一个虚拟的Centos系统
[root@bc134c97bb2b /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
#两张网卡,一张host的网卡一张虚拟网卡
[root@VM-3-8-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7968d5bcd0f0 nginx:latest "/docker-entrypoint...." 53 minutes ago Up 53 minutes 80/tcp practical_bose
#无运行的容器查询不到
[root@VM-3-8-centos ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc134c97bb2b centos:latest "bash" 6 minutes ago Exited (0) 34 seconds ago c1
#容器已经exied退出消除
3.docker exec命令
bash
[root@VM-3-8-centos ~]# docker exec -it c2 ls /root
anaconda-ks.cfg anaconda-post.log original-ks.cfg
命令解释
docker exec 在容器外实现与容器交互执行某命令
-it 交互式
c2 正在运行的容器名称
ls /root 在正在运行的容器中运行相关的命令
4.docker attach命令
css
[root@VM-3-8-centos ~]# docker attach c3
[root@de685cc0538b /]#
命令解释
docker attach 类似于ssh命令,可以进入到容器中
c2 正在运行的容器名称
提示:docker attach 退出容器时,如不需要容器再运行,可直接使用exit退出;如需要容器继续运行,可使用ctrl/control+p+q
5.docker stop命令
csharp
[root@VM-3-8-centos ~]# docker stop c1 c2
c1
c2
6.docker start命令
csharp
[root@VM-3-8-centos ~]# docker start c1 c2
c1
c2
7.docker rm命令
perl
[root@VM-3-8-centos ~]# docker stop c3 ; docker rm c3
c3
c3
#先暂停再删除
[root@VM-3-8-centos ~]# docker ps --all | awk '{if(NR>=2){print $1}}' | xargs docker rm
#批量-全删除容器
awk:这是一个文本处理工具,用于对文本进行分析和处理。
'{if (NR>=2)[print $1]}':这是 AWK 命令的一部分,用于对输入进行处理。NR 是 AWK 内置的变量,表示当前行的行号。if (NR>=2) 表示如果行号大于等于2,则执行后面的操作。[print $1] 表示打印当前行的第一个字段,即容器的ID。
xargs:用于将前一个命令的输出作为参数传递给后一个命令。