Fast Reverse Proxy (FRP)
镜像源
docker hub
k8s.gcr.io
quay.
Docker
https://docs.docker.com/engine/install/centos/
容器虚拟化
打破代码即应用的观念,从系统环境开始,自底至上打包应用
一次镜像,处处运行
同类产品
Docker 大势已去,Podman 即将崛起!
https://zhuanlan.zhihu.com/p/449364769
容器和虚拟机的区别
Docker不需要加载一个完整的LinuxOS
| Docker容器 | VM | |
|---|---|---|
| 操作系统 | 共享主机OS | 主机上运行Linux虚拟机 |
| 存储大小 | 小,便于存储与传输 | 大,vmdk、vdi等 |
| 运行性能 | 接近主机直接执行 | 虚拟机消耗 |
| 移植性 | 灵活 | 笨重 |
| 硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
| 部署速度 | 秒级 | 10s以上 |
Linux容器(Linux Container)是与系统其他部分隔离开的一系列进程,从一个镜像运行,并由镜像提供支持进程所需的全部文件
虚拟机是虚拟一套硬件后运行一个完整操作系统,在操作系统上运行应用
容器内的应用进程直接运行于宿主内核,容器内没有自己的内核且没有进行硬件虚拟,比虚拟机更加轻便,宿主机可部署多个容器
容器间相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响
优点
- 应用部署方便
- 扩容、运维方便
- 资源利用率高
Docker是一个依赖于Linux内核环境的容器工具,其在所依赖的LInux环境下构建了隔离的文件环境,其执行效率接近于部署的LInux主机。
Docker容器运行使用Linux主机实际硬件资源,虚拟机使用虚拟硬件资源
Docker必须部署在LInux内核系统上,所以其他系统需要安装虚拟机,如windows需要安装linux虚拟机,再在虚拟机上安装Docker
Docker要求Linux内核版本3.8及以上,64位
# CentOS查看系统信息
cat /etc/redhat-release
uname -r
Docker Image
镜像:容器=类:对象
虚悬镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> da0523cf8ab6 9 seconds age 70.3MB
Docker Container
容器是用镜像创建的运行实例,容器为镜像提供了一个隔离的运行环境,一个容器只能运行一个镜像
Docker Volume
数据卷,将容器和数据解耦,方便操作数据,保证数据安全
Docker Repository
镜像仓库是集中存放镜像文件的场所
Docker Registry
存放仓库的地方,官方Registry是Docker Hub
Docker架构
C/S架构,Docker守护进程运行在Linux主机上,客户端以Socket连接守护进程并管理Linux主机上的众多容器。
- 用户使用Docker Client与Docker Daemon建立通信
- Docker Deamon作为Docker架构中主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求
- Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job形式存在
- Job运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph Driver将下载镜像以Graph的形式存储
- 当需要为Docker创建网络环境时,通过网络管理驱动Network Driver创建并配置Docker容器网络环境
- 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec Driver来完成
- Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来实现具体对容器进行的操作
Docker镜像
UnionFS,联合文件系统,一种分层、轻量级、高性能文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFS是Docker基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种应用镜像
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接使用Host的Kernel,Docker镜像只需提供rootfs,对于不同Linux发行版,bootfs基本一致,rootfs略有区别,所以bootfs可以公用
Docker镜像层是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像顶部,通常称之为容器层,容器层之下为镜像层
安装配置
yum -y install gcc
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker
systemctl stop docker
ps -ef|grep docker
docker version
docker run hello-world
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# 个人阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://23oa6wnj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置文件daemon.json
默认路径/etc/docker/daemon.json
阿里云容器镜像服务
Docker Registry是Docker官方提供的用于构建镜像仓库的工具
{
"registry-mirrors": ["http://harbor.test.com"], #镜像加速地址
"insecure-registries": ["harbor.test.com","registry.cn-shenzhen.aliyuncs.com"], # Docker如果需要从非SSL源管理镜像,这里加上。
"max-concurrent-downloads": 10
}
systemctl reload docker # s
镜像仓库
1)创建命名空间
2)创建镜像仓库
https://cr.console.aliyun.com/cn-beijing/instance/credentials
# 登录阿里云Docker Registry
docker login --username=danielyoungchina registry.cn-shanghai.aliyuncs.com
# 从Registry中拉取镜像
docker pull registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
# 标记镜像
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
# 向Registry中推送镜像
docker push registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
镜像加速器
阿里云容器镜像服务:
# 个人阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://23oa6wnj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
系统级命令
systemctl start docker # 启动
systemctl stop docker # 停止
systemctl restart docker # 重启
systemctl status docker # 状态
systemctl enable docker # 开机启动
docker info # 概要信息
docker --help # docker帮助文档
docker 具体命令 --help # docker某命令帮助文档
docker update cef8c24d12fe --restart=always # docker自启
镜像级命令
docker images # 查看镜像
docker images -qa #
# REPOSITORY(镜像仓库)、TAG(镜像标签)、IMAGE ID(镜像ID)、CREATED(创建时间)、VIRTUAL SIZE(真实大小)
# 不指定tag将默认使用latest
docker search hello-world # 搜索镜像
# NAME(名称)、DESCRIPTION(描述)、STARS(星标)、OFFICIAL(官方)、AUTOMATED(自动构建)
docker pull repository:tag # 拉取镜像
docker search --limit 5 redis #其实都是两杠,一杠是简写
df -h
docker system df
docker rmi feb5d9fea6a5 # 删除镜像
docker rmi -f feb5d9fea6a5 # 删除镜像
docker rmi -f image1:tag1 image2:tag2 # 删除多个镜像
docker rmi -f $(docker images -qa) # 删除全部镜像
容器级命令
# 容器命令
docker run -it ubuntu /bin/bash # 运行容器
# --name 容器名称
# -d 守护式运行容器并返回容器ID
# -i 交互式运行容器 interactive
# -t 分配伪输入终端 tty
# -P 随机端口映射
# -p 执行端口映射
# -p hostPort:containerPort 端口映射 -p 8080:80
# -p ip:hostPort:containerPort 配置监听地址 -p 10.0.0.100:8080:80
# -p ip:containerPort 随机分配端口 -p 10.0.0.100:80
# -p hostPort:containerPort:udp 指定协议 -p 8080:80:tcp
# -p 81:80 -p 443:443 指定多个
# run -> exit -> 容器停止
# run -> ctrl+p+q -> 容器不停止
docker run:
1.先从本地寻找镜像
2.找到就以该镜像产生容器并运行
3.没找到访问DockerHub
4.在DockerHub找到就下载到本地并以该镜像产生容器运行
5没找到返回失败错误
docker start 容器id或者容器名 # 启动容器
docker stop 容器id或者容器名
docker restart 容器id或者容器名
docker kill 容器id或者容器名 # 强制停止容器
docker rm 容器id或者容器名 # 删除已停止容器
docker rm -f $(docker ps -a -q)
docker ps # 当前正在运行的容器
# CONTAINER ID(容器ID)、IMAGE(镜像)、COMMAND、CREATED(创建时间)、STATUS(状态)、PORTS(端口)、NAMES(名称)
# -a 全部(包括正在运行和运行过的)
# -l 最近创建的容器
# -n 显示最近创建的容器
# -q 静默模式,仅显示容器编号
docker ps -a --filter "status=exited"
docker logs 容器id
docker logs -f
docker logs --help
docker top 容器id #
docker inspect 容器id
# 进入正在运行的容器并以命令行交互
docker exec -it 容器id bash # 在容器中打开新的终端,用exit退出不会导致容器停止
docker attach 容器id # 直接进入容器启动命令的终端,用exit退出会导致容器停止
1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出
2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
3、这个是 docker 的机制问题
docker pause
docker unpause
docker容器中软件配置文件可以挂载到本地
docker exec -it canal bash
docker save,保存镜像为tar,包括镜像历史记录
docker load,加载镜像tar为镜像
docker export,导出容器为tar,不包含对应镜像的历史记录,即无commit历史
docker import,导入容器tar为镜像,可以重新指定镜像新名称
数据挂载时可以使用docker维护的数据卷,或者直接使用主机目录挂载(推荐)
docker exec -it mr redis-cli # 使用redis-cli连接redis
数据卷命令
docker volume create # 创建一个volume
docker volume inspect # 显示一个或多个volume信息
docker volume ls # 列出所有的volume
docker volume prune # 删除未使用的volume
docker volume rm # 删除一个或多个volume
# 注:数据卷挂载至容器时数据卷不存在Docker会自动创建数据卷
挂载数据卷
docker run --name containerName -v html:root/html -p 8080:80 imageName
例子:创建一个容器,修改容器内的HTML目录内的index.html内容
- 创建容器并挂载数据卷到容器内的HTML目录
- 进入html数据卷所在位置,并修改HTML内容
需要查看挂载点(似乎也可以直接挂载)
需要看看该镜像在制作时数据放到了哪儿
例子:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
- 创建目录/tmp/mysql/data、/tmp/mysql/conf、/tmp/mysql/conf/my.cnf
- 到DockerHub中查询选定镜像默认目录位置
- 挂载/tmp/mysql/data到mysql容器内数据存储目录
- 挂载/tmp/mysql/conf到mysql容器内配置文件目录
到dockerhub可以镜像下可以看到数据具体目录
docker run通过-v参数挂载文件或者目录到容器中,挂载方式有两种,第一种是一般目录挂载,第二种是数据卷挂载,区别在于数据卷挂载是由Docker管理的目录,数据卷挂载耦合度低,目录较深不容易查看,一般目录挂载耦合度低,目录较浅容易查看,
备份文件
# 备份文件
docker cp ddb1ae909a66:/tmp/a.txt /root
# 导出容器
docker export 容器ID > 文件名.tar
# 导入容器
docker import 镜像用户/镜像名:tag
# 将容器提交为新镜像
docker commit -m="描述信息" -a="作者" 容器ID 待创建镜像名:待创建镜像标签
数据挂载
自定义镜像
docker build -t javaweb:1.0.0 ./
docker run -name javaweb -p 8090:8090 -d javaweb:1.0.0
# http://192.168.25.128:8090/hello/count
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
JDK1.8
#1.指定基础镜像,并且必须是第一条指令
FROM centos:centos7
#2.指明该镜像的作者和其电子邮件
MAINTAINER Davis_Jones "grassself@gmail.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/
#4.一个复制命令,把jdk安装文件复制到镜像中
COPY jdk-8u321-linux-x64.tar.gz /usr/local/
# 安装JDK
RUN tar -zxvf ./jdk-8u321-linux-x64.tar.gz \
&& mv ./jdk1.8.0_321 ./jdk8
#5.配置环境变量
ENV JAVA_HOME=/usr/local/jdk8
ENV PATH=$JAVA_HOME/bin:$PATH
#容器启动时需要执行的命令
CMD ["java","-version"]
bulid和run命令的重新编排
Dockerfile
Dockerfile是一个用于描述镜像构建过程的文本文件
| 指令 | 描述 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,用于后续指令 | ENV key value |
| COPY | 拷贝本地文件到镜像目录 | COPY ./mysql-5.7.rpm /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
| EXPOSE | 指定容器运行时监听的端口 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
https://docs.docker.com/engine/reference/builfer
- 基础镜像可以是基本操作系统如centos:6,也可以是别人制作好的镜像如java:8-alpine
- 基础镜像层包含最基本的系统函数库、环境变量、文件系统
例子:基于Ubuntu镜像构建一个新镜像,运行一个Java项目
新建一个空文件夹docker-demo
拷贝docker-demo,jar文件到docker-como目录
拷贝jdk8,tar.gz到docker-demo目录
拷贝Dockerfile到docker-demo目录
进入docker-demo
运行命令
docker build -t javaweb:1.0
Dockerfile由一行行命令语句组成,并且支持用“#”开头作为注释,一般的,Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行的指令。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
Docker需要将Linux作为基础镜像是不是因为运行JavaWeb项目需要基础环境配置,如JDK,配置环境变量的同时就要Linux操作系统,而根绝DIcker机制,仅仅主机内核是不够的???
scratch
https://www.zhangshengrong.com/p/l51g6BbAX0/
docker就是形成一个独立的环境,不受外部环境变量的影响,比如某个库依赖不一样,在同一个外部环境下,不好分离,用docker就没这个问题,环境相互独立
docker network
docker network rm custom_network
docker network disconnect custom_network bbox05
docker network connect bridge bbox05
创建一个基于 bridge 网络模式的自定义网络模式 custom_network,完整命令如下:
docker network create custom_network
网络模式
| 网络模式 | 描述 |
|---|---|
| bridge | 默认网络模式,为每一个容器分配和设置IP等,将容器连接到docker0虚拟网桥 |
| host | 使用主机IP和端口 |
| none | 容器有单独Network Namespace,但并未进行设置,如IP等 |
| container | 新容器与指定容器共享IP、Port Range |
DockerCompose
GitHub - docker/compose: Define and run multi-container applications with Docker
GitHub - docker/compose: Define and run multi-container applications with Docker
# 修改权限
chmod +x /usr/local/bin/docker-compose
微服务一般不暴露端口,nacos和gateway会暴露
微服务文件夹里应该是jar包
docker-compose所有的服务都可以用服务名访问,所以需要将各个微服务中的域名改为服务名emmmm
打包插件
docker-compose文件中每个微服务有个depends_on属性,说明这个微服务的启动依赖于哪一个微服务,就会先启动被依赖的那个
Docker Image
Docker-Nginx
# nginx
docker pull nginx:1.23.1
Docker-MySQL
# mysql8.0.29 docker pull mysql:8.0.29在Linux的/opt下创建mysql文件夹(docker容器中软件配置文件可以挂载到本地)
进入mysql文件夹执行
docker run -p 3306:3306 --name mysql1 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql123456 --privileged -d mysql:8.0.29
Docker-Redis
# redis6.2.7
docker pull redis:6.2.7
docker run --name redis -p 6379:6379 -d redis: redis-server --appendonly yes
Docker-gitlab-ce
docker pull gitlab/gitlab-ce:14.10.5-ce.0
Docker-RabbitMQ
docker pull rabbitmq:3.9-management
docker run \
-e RABBITMQ_DEFAULT_USER=rabbit \
-e RABBITMQ_DEFAULT_PASS=rabbit \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3.9-management
Docker-PosegreSQL
docker pull postgres:14.5
Docker-Sonarqube
docker pull sonarqube:8.9.6-commun
/etc/docker/daemon.json
docker tag java-springboot-test:1.0.0 192.168.25.128:80/test-repo/java-springboot-test:1.0.0
docker login -u admin -p harbor12345 192.168.25.128:80
docker push 192.168.25.128:80/test-repo/java-springboot-test:1.0.0
docker pull 192.168.25.128:80/test-repo/java-springboot-test:1.0.0
默认port443 https
停止所有容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
删除所有镜像
docker rmi $(docker images -q)
docker启动常用容器命令及配置说明
https://blog.csdn.net/weixin_45698637/article/details/124213429
crictl logs
# t
/etc/docker/daemon.json
{
"registry-mirrors":["https://c05xby84.mirror.aliyuncs.com"],
"insecure-registries":["192.168.1.112:80"]
}
systemctl
daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载
systemctl --help
192.168.1.112
docker login 192.168.1.112:80 # 80不可省略
docker tag alpine 172.21.9.203:80/library/alpine
docker pull 111.111.111.111:5000/sunhengzhe/express-app:v1
docker run -d -p 8080:8080 192.168.1.112:80/library/tomcat
docker build -t 192.168.1.112:80/library/test-for-cicd:v1 . -f dockerfile
docker run -d -p 8080:8080 192.168.1.112:80/library/test-for-cicd:v1
git archive --remote=git@repo.gstianfu.com:common/status_code master status_code.json|tar -x
通配符与正则表达式
https://www.jianshu.com/p/25f3d0cd5fdc
systemctl daemon-reload
systemctl restart docker
dockerfile
https://blog.csdn.net/weixin_45310323/article/details/130270944
https://blog.csdn.net/wkf_java/article/details/125713232
Ref
重要,https://blog.csdn.net/weixin_39906114/article/details/111157328