Linux集群-容器架构

留坑:iptables没看

Docker管理指令总结:www.processon.com/view/link/6...

一、Docker极速上手指南

0、基础

1、 配置docker源(用于安装docker)

a. 安装Docker服务

bash 复制代码
#安装相关依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#下载官方的docker yum源文件
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#替换yum源地址
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#安装docker-ce
yum install -y docker-ce
systemctl enable --now docker
docker version

b. 配置镜像加速

阿里云配置地址

c. 自动补全

yum install -y bash-completion bash-completion-extras

2、Docker C/S架构

cs client/server 客户端/服务端

Docker 服务端:docker daemon 叫dockerd

Docker 客户端:docker命令(下载镜像,运行容器 )

docker pull nginx 下载nginx镜像到本地仓库.

  • 如果本地仓库有则提示镜像已经下载.
  • 如果本地出仓库没有,则docker服务端访问远程仓库,下载镜像.

docker run -d -p 80:80 nginx 启动容器

  • -d容器后台运行
  • -p端口映射
  • nginx镜像名字
shell 复制代码
docker run -d -p 80:80 nginx
#docker客户端找dockerd服务端,问是否有nginx镜像
#如果有,则启动这个镜像,后台运行,访问容器端口是80端口.
#如果没有,则从远程仓库下载镜像,启动这个镜像,后台运行,访问容器端口是80端口.
#提示你本地没有nginx镜像 nginx:latest最新版
#查看ngx版本:https://hub.docker.com/_/nginx
​
#1、查看镜像
docker images
#2、查看容器
docker ps

注意事项: 此处使用到了docker -p端口映射公共,需要使用iptables的nat功能,需要开启系统的内核转发功能.

ini 复制代码
[root@docker01.oldboylinux.cn ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@docker01.oldboylinux.cn ~]# sysctl -p 
net.ipv4.ip_forward = 1

3、Docker的镜像管理

docker imagesdocker image ls等同。

perl 复制代码
docker search 搜索镜像, 优先选官方,stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker load 导入镜像
docker save 导出镜像
​
#例子: docker load -i docker_nginx.tar.gz 
#例子: docker save centos:7 -o docker_centos7.tar.gz
​
docker images 查看镜像列表
docker rmi  删除镜像
docker tag  给镜像打标签

a. 案例01:下载nginx:alpine镜像并查看

bash 复制代码
#1.
docker pull 下载镜像
docker pull nginx:1.22-alpine
#2.
docker image ls 简写为docker images查看镜像
​
查找镜像:
docker search
访问hub.docker.com

镜像命名

bash 复制代码
#指定版本
只写服务名字一般下载服务的最新版本.
nginx,下载ngx最新版本 nginx:latest 
下载ngx最新稳定的版本 nginx:stable
下载指定的版本 nginx:1.20.2
#指定系统
nginx镜像默认的系统是Debian系统
docker pull nginx:1.20.2-alpine 使用alpine系统更加节约空间

b. 案例02:sl大法

保存docker镜像(save),其他节点上导入(load).

未来也可以搭建镜像仓库.

arduino 复制代码
docker image save #docker save
docker image load #docker load
​
#1.1g个节点保存docker 镜像 -o输出到指定的文件.
docker save nginx:alpine -o nginx_alpine.tar
​
#2. 导入load
docker load -i nginx_alpine.tar
swift 复制代码
docker images |awk 'NR>1{print "docker save",$1":"$2,"-o",$1"_"$2".tar"}'
​
#最后通过 |bash运行
#可以书写批量导出docker镜像脚本.

c. 案例03:删除镜像

条件:镜像不能在使用中.(没有基于这个镜像的容器).

ini 复制代码
docker image rm == docker rmi

d. 案例04:镜像清理用命令

用于清理一些临时镜像,未来我们自定义镜像的时候会有.

arduino 复制代码
docker image prune
docker images -a #可以查看系统中所有镜像,包含隐藏镜像.

e. 案例05:给镜像设置标签

给镜像设置一个新的名字. 类似于硬连接,id号保持一致,不会创建新的数据块。

应用场景:

  • 自定义镜像.
  • 搭建与使用内部镜像仓库.registry
csharp 复制代码
[root@clb1 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        alpine    cc44224bfe20   2 years ago   23.5MB
nginx        latest    605c77e624dd   2 years ago   141MB
centos       latest    5d0da3dc9764   2 years ago   231MB
[root@clb1 ~]# docker tag nginx:latest nginx:latest_3.13
[root@clb1 ~]# docker images
REPOSITORY   TAG           IMAGE ID       CREATED       SIZE
nginx        alpine        cc44224bfe20   2 years ago   23.5MB
nginx        latest        605c77e624dd   2 years ago   141MB
nginx        latest_3.13   605c77e624dd   2 years ago   141MB
centos       latest        5d0da3dc9764   2 years ago   231MB

f. 案例06:查看镜像详细信息

做镜像巡检的时候使用.

bash 复制代码
docker 家目录/var/lib/docker/
#查看 nginx:alpine镜像的信息,输出的是json格式. 
docker image inspect nginx:alpine

g. 案例07:json格式

arduino 复制代码
 #json形式数据:key value 键值对,变量和变量内容
{
 "name": "harryYang",
 "age": 38,
 "height": 100,
 "weight": "100kg"
} 
perl 复制代码
#新机型需要安装,处理json形式数据的专用命令:jq.
 yum install -y jq
 
 [root@clb1 ~]# cat json.txt  | jq
{
  "name": "harryYang",
  "age": 38,
  "height": 100,
  "weight": "100kg"
}
[root@clb1 ~]# cat json.txt  | jq .age
38
[root@clb1 ~]# cat json.txt  | jq .name
"harryYang"
#处理复杂格式docker inspect,可以理解.就是进入的命令,一层一层的进入
[root@clb1 ~]# docker image inspect nginx:latest | jq .[].Id
"sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85"

二、Docker的容器管理

运行起来的镜像可以称为容器,1个容器相当于是1个进程.

bash 复制代码
docker ps 查看容器列表 -a 查看所有容器
docker run 创建并运行容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker rm 删除容器
批量删除所有容器 docker rm -f `docker ps -qa`
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开 的快捷键ctrl +p,ctrl +q

a.查看当前运行中的容器,查看下80端口是 否被占用,如果没有运行1个nginx容器使用80端口

csharp 复制代码
[root@clb1 ~]# docker run -d -p 80:80 --name shishu_nginx nginx:latest
2d601f16f939eeec43176b7cd1199171fb3fcea459293f2cf5efa10aa30709f3
[root@clb1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                NAMES
2d601f16f939   nginx:latest   "/docker-entrypoint...."   15 seconds ago   Up 14 seconds   0.0.0.0:80->80/tcp   shishu_nginx
#删除容器
#docker rm 容器
#如果容器运行中无法删除则使用rm -f强制删除.

b.创建centos容器并进入容器

arduino 复制代码
docker run -it --name "centos_v1" centos

如果退出容器,那么容器状态会怎么样?

  • -i 进入交互模式
  • -t 分配一个终端(运行命令解释器) /bin/bash 或 /bin/sh
  • -it 进入容器并有个命令行(终端).

好处运行容器的同时可以进入到容器中,缺点:退出容器则容器结束.

容器想要放在后台(-d)一直运行的话,那么容器运行对应初始命令。

必须夯住(阻塞/前台运行),否则容器就会退出。

bash 复制代码
#基础服务前台运行
nginx -g 'daemon off;'
#nginx前台运行.
/usr/sbin/php-fpm --nodaemonize 
#php前台运行. 
/usr/sbin/sshd -D 
#ssh前台运行. 
java -jar xxx.jar 
#java前台运行.

c. 如何进入已经运行的容器

bash 复制代码
#0. 如果没有运行中的容器创建1个.
docker run -d -p 80:80 --name "nginx_alpine_v4"     nginx:alpine
#1. 进入运行中的容器中
docker exec -it nginx_alpine_v4
#2. 修改ngx首页文件内容
echo docker_nginx_alpine_v4 >/usr/share/nginx/html/index.html
#3. 浏览器测试

扩展: 如何后台持续运行纯净系统的容器.

bash 复制代码
#通过-itd + 指定命令解释器持续运行
docker run -itd --name centos_v6 centos /bin/bash

docker exec -it name xxx 镜像名字:版本 参数(一般/bin/bash 或/bin/sh)用于与已经运行中的容器进行连接.

d. exec vs attach区别

e. docker run vs docker create,start,stop,restart

docker run背后

  • docker pull #如果镜像不存在.
  • docker create 创建容器.
  • docker start 启动容器.
  • docker stop 关闭容器. #向容器中的主进程,pid 1 进程发出信号(kill),关闭.
  • docker restart重启重启.

f. 我们传输文件到容器中,如何做?

之前我们在windows/Mac与Linux之间通过lrzsz实现

在容器与主机之前用docker cp

g. 查看容器信息与状态

1、stats 查看所有运行中的容器的状态,如果要看所有加上-a选项.

docker stats

2、top 查看某一个容器的进程信息.

css 复制代码
docker top centos

h.结束容器

docker stop关闭容器 docker rm删除容器

bash 复制代码
docker kill -s 9 alpine_v4
-s表示信号 -s 9 等于 kill -9 pid强制结束.

i. commit用于自定义镜像

处理容器,生成镜像. 使用流程:

  • 运行服务镜像或系统镜像,启动后成为容器.
  • 根据我们的需求,对容器进行修改.
  • 测试完成后. 最后通过commit命令把容器保存为镜像.
  • 根据新生成的镜像创建容器并测试.
sql 复制代码
docker commit restart_alpine_v1 nginx:alpine_restart_v1
#docker commit 容器名 镜像名

三、端口映射

使用docker的时候 外界访问docker容器中的服务或端口,需要使用端口映射.本质类似于iptables防火墙的端口映射.

应用场景: 未来容器需要被外界访问(80端口).需要暴漏在外界一个端口. 用户通过端口访问容器中的某个端口.

实现方法:docker run通过-p选项实现.

本质是通过iptables nat规则实现的.nat表中创建了docker自定义的链.

1、背后做了什么

添加了对应防火墙规则iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp dport 8888 -j DNAT to- destination 172.17.0.10:80

2、用户经历了什么

3、端口映射案例

a. 1对1 端口映射

arduino 复制代码
docker run -d --name "nginx_80" -p 80:80 nginx:1.20.2-alpine

b. 映射多个端口

yaml 复制代码
#一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 86:80 nginx:1.20.2-alpine
​
#表示连续
docker run -d -p 8084-8086:8080-8082 -p 88:80 nginx:1.20.2-alpine

c. ip 绑定端口

arduino 复制代码
docker run -d --name "nginx_bind_ip" -p 172.16.1.81:12306:80 nginx:1.20.2-alpine

四、数据卷挂载

这里我们想个问题,创建了一个容器,容器里面存放很多代码,数据,软件包等等信息,不小心删除容器rm -f. 重新创建名字相同的容器,问数据还有没有?

如何解决数据持久化问题? 数据卷(挂载),让数据永久保存在宿主机中.

docker run -v 宿主机的路径:容器内部路径

ruby 复制代码
mkdir -p /app/docker/conf/nginx/conf.d/ /app/docker/code/restart/
​
docker run -d --name restart_volume_v1 -p 80:80 \
-v /app/docker/restart/conf/nginx/conf.d/:/etc/nginx/conf.d/ \
-v /app/docker/restart/conf/nginx/nginx.conf:/etc/nginx/nginx.conf \
--restart=always nginx:alpine

容器时区问题

数据卷使用与容器架构

五、容器架构自动化部分

1、手动实现创建tengine镜像

目标: 手动根据Ubuntu20.04镜像,编译安装tengine并部署bird代码.

a)下载并启动ubuntu:20.04 容器

bash 复制代码
docker run -itd --name "tengine_bird" ubuntu:20.04 /bin/bash
docker exec -it tengine_bird /bin/bash

b)配置apt源

bash 复制代码
sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
apt update #生成apt缓存

c)下载软件包

bash 复制代码
#1.安装常用软件
apt install -y vim curl
#2.下载软件包(手动下载然后从docker cp到容器中)
#下载链接:http://tengine.taobao.org/download/tengine-2.3.3.tar.gz
scp /Users/admin/Downloads/tengine-2.3.3.tar.gz root@47.96.172.71:/root/
#上传容器
tar xf tengine-2.3.3.tar.gz
docker cp  /root/tengine-2.3.3 tengine_bird:/tmp

d)编译安装三部曲

安装依赖

  • ./configure 进行编译安装的配置------》Makefile 用于编译.
  • make #编译(根据Makefile配置进行编译)
  • make install #创建目录,复制文件
csharp 复制代码
#1、安装依赖
apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev
#2、进入解压目录,编译
./configure --prefix=/app/tools/tengine-2.3.3/ \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_mp4_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=modules/ngx_http_upstream_check_module/ \
--add-module=modules/ngx_http_upstream_session_sticky_module
#判断是否完成 root@26ffc8a9750a:/tmp/tengine-2.3.3# echo $? 0
#3、make编译
make -j 1
#4、make install编译安装
make install
#5. 检查
/app/tools/tengine-2.3.3/sbin/nginx -V
#6. 创建软连接
ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine

e)收尾,启动,测试

  • 添加用户nginx
  • 创建安装目录软连接
  • nginx命令软连接到/sbin/下面.
  • 启动与本地测试.
bash 复制代码
#1. 添加用户nginx
groupadd nginx
useradd -s /sbin/nologin -g nginx nginx
#2. nginx命令软连接到/sbin/下面.
ln -s /app/tools/tengine/sbin/nginx /sbin
nginx -V
#3. 启动与本地测试.
nginx 
#启动后会在后台运行.
echo tengine.cn >/app/tools/tengine/html/index.html
curl localhost
#返回显示tengine.cn

f)生成镜像

sql 复制代码
docker commit tengine_bird tengine:2.3.3

g)运行容器

arduino 复制代码
docker run -itd -p 80:80 --name test tengine:2.3.3 nginx -g 'daemon off;'

h)关于日志

/app/tools/tengine/logs/ 存放在容器中.

关于日志的处理

  • 方案01 日志目录挂载到宿主机的某个目录中.
  • 方法02 把日志软连接到/dev/stdout 和/dev/stderr中,未来可以通过docker logs 查看日志.
bash 复制代码
ln -s /dev/stdout /app/tools/tengine/logs/access.log
#访问日志 stdout标准输出
#只要有访问日志生成就会输出到屏幕,就可以通过docker logs 查看
ln -s /dev/sdterr /app/tools/tengine/logs/error.log
#错误日志 stderr错误输出
​
#修改完成后记得重启容器.

2、自动实现Dockerfile实现

Dockerfile使用

bash 复制代码
FROM nginx:alpine
LABEL author="oldboylidao996"
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'docker file oldboyedu linux' > /usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]

根据Dockerfile构建镜像

bash 复制代码
docker build -t nginx:diy_img_test_v1 .
#注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名

运行

arduino 复制代码
docker run -d --name 'nginx_v1' -p 81:80  nginx:centos7

3、Dockerfile中的指令

都是大写

4、编译安装tengine变成Dockerfile

相关推荐
工业3D_大熊33 分钟前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc176737 分钟前
docker 相关命令
java·docker·jenkins
CP-DD42 分钟前
Docker 容器化开发 应用
运维·docker·容器
Stark-C1 小时前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
微信-since811921 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
吴半杯3 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
今天我刷leetcode了吗3 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain4 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Code_Artist5 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao12345 小时前
centos 服务器 docker 使用代理
服务器·docker·centos