Docker 学习日志
Docker 学习日志
2022-07-02 08:30:04 星期六
环境安装
使用vm虚拟机在 centos7环境下
1.yum update |yum更新
2.yum install -y yum-utils |下载所需要的包
3.yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |设置yum源 遇到下载错误的源需要到/etc/yum.repos.d/ 下删除 删除缓存 yum clean all
4.yum makecache fast |更新源生成索引
5.yum install docker-ce docker-ce-cli containerd.io |安装Docker
6.systemctl start docker |启动Docker 或 service docker start
7.docker version |查看docker版本
8.docker start hello-world |测试
9.vim /etc/docker/daemon.json |docker配置文件 设置镜像仓库
点击查看代码
{
"registry-mirrors": [
"http://docker.mirrors.ustc.edu.cn",
"https://ymcatvqb.mirror.aliyuncs.com",
"http://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"http://mirror.baidubce.com",
"http://mirror.ccs.tencentyun.com"
],
"dns": ["8.8.8.8","8.8.4.4"]
}
10.systemctl daemon-reload
11.systemctl restart docket.service |重启服务
12.docker images 查看当前运行的镜像
——————————————————————————————————————————————
docket是一个容器 ,类似轻量级虚拟机可跨平台使用,主要运行镜像服务docket是一个容器 ,类似轻量级虚拟机可跨平台使用,主要运行镜像服务
镜像命令
docker images 查看镜像服务
docker pull 下载镜像
docker rmi 删除镜像
容器命令————————————
有镜像才可以创建容器,
docker pull 新建容器 例 docker pull centos 创建centos环境的容器
**docker run [可选参数] image 启动 后进入容器窗口 **
参数--name="Name"容器名称 -d后台运行 -it交互方式运行,进入容器查看内容
-p 指定容器端口 主机端口:容器端口 ip:port 其他端口 -P随机指定端口 -c执行命令
容器窗口下 exit 退出容器并停止 ctrl+P+Q 退出不停止
docker ps -a 查看历史运行和当前运行 -n显示最近创建的容器
docker rm 容器id 删除容器
docker start/stop 启动停止容器
后台启动容器
docker run -d 容器名id
但如果没有前台守护进程会自动停止
2022.6.30
docker logs -tf --tail 条数 容器id 显示日志
docker top 容器id 查看容器进程信息可查看PID
docker inspect 容器id 查看容器信息
docker exec -it 容器id bashshell 进入容器后开启一个新的终端,方便操作
docker attach 容器id 进入当前正在执行的终端,不会开启新的进程
docker cp 容器id 绝对路径 容器窗口下查看是否存在文件 拷贝文件到主机 -v卷的技术
docker cp 容器id:/**/** 当在容器里不能修改文件 则使用命令拷贝到主机修改后拷贝回去
docker cp /**/** 容器id:/**/
也可使用docker run -v 挂载目录:容器目录
portainer (可视化)docker图形工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
doocker镜像加载原理
unionFS(联合文件系统)
是一种分层轻量并且高性能文件系统
特性:一次同时加载多个文件系统,但从外面看来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
bootfs是docker最底层包含boot加载器和内核,bootload主要引导加载kernel,当boot加载完成内核在内存中,权限由bootfs转给内核,系统也会卸载bootfs
rootfs(root file system)在bootfs之上,包含系统标准目录和文件
只包含必要文件 所以docker镜像非常小 作为容器启动服务,其他额外功能将不存在需要重新添加
分层理解
当下载一个服务 其他服务可能需要其中的一个依赖不必重新下载可以直接复用
特点:docker镜像是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
即:运行之后镜像层无法改变,也会创建一个容器层在镜像层之上可以进行修改
commit镜像
创建一个自己的镜像
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:tag
保存一个自己设置好的镜像
运行自己的镜像 镜像名称:tag
docker run -v 主机目录:容器目录 相当于双向绑定
特点:修改只需在本地主机修改,容器自动同步,删除了容器本地的数据卷不会丢失
匿名挂载
-v 容器内路径
-v 名称:容器路径
docker volume ls 查看所有卷的情况,可以查看匿名挂载目录\具名挂载
dockerfile
构建docker 镜像的构建文件
名字可以随意
docker build -f 文件名 -t 名称/系统名 , 注意后面有的点 创建镜像
文件内容 为指令 每个命令为镜像的一层
--volume-from 可以挂载数据卷容器 相当于两个容器挂载同一个主机目录 也可容器内两个目录挂载
docker run docker02 --volume-from docker01 镜像名 容器2挂载容器1 相当于同步了两个容器
删除其中一个容器依旧可以访问 因为数据有备份
DockerFile 命令
FROM 指定基础镜像
MAINTAINER 维护人信息
RUN 构建镜像时执行命令
ADD COPY文件,自动解压,添加内容
WORKDIR 指定工作目录
VOLUME 设置卷,挂载
EXPOSE 指定对外端口
CMD 启动时要运行的命令,只有最后一个会生效
ENTRYPOINT 指定这个容器启动时要运行的命令 与CMD区别可以追加参数命令
ONBUILD 当构建被继承,这时会运行ONBUILD指令
COPY 文件拷贝到镜像中
ENV 构建的时候设置环境变量
当编写FROM centos 时因为centos8停止了源服务需要指定centos的版本号否则会报错 改为FROM centos:7
--------Dockerfile---------------
FROM centos:7
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.64.tar.gz /usr/local/
ADD jdk-8u331-linux-x64.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_331
ENV CLASSPATH $JAVA_HOME/lib/jt.jar:$JAVA_HOME/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.64
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.64/bin/logs/cataline.out
docker run -d -p 9090:8080 --name diytomcat -v tomcatconf:/usr/local/apache-tomcat-9.0.64/conf -v /home/docker/build/tomcat/test:/usr/local/apache-tomcat-9.0.64/webapps/test:rw -v /home/docker/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.64/logs diytomcaat
如果想要挂载到webapps 需要使用具名挂载 否则会覆盖容器目录
docker login
docker tag
docker push 上传镜像先登录再按照官方要求改镜像名称在push否则会失败
Docker网络
docker network ls 可以查看docker网卡
docker inspect 容器id 可以查看容器网卡配置
在主机可以ping通容器的容器ip
每启动一个docker容器,docker就会给docker容器分配一个ip,安装了docker就会有一个docker0的网卡
docker0网卡使用的是桥接模式,使用的是evth-pair技术 启动容器时会在主机上创建一个veth的网卡 容器内的网卡会与主机的veth网卡绑定
容器网卡是一对虚拟设备接口,他们都是成对出现的,一段连接协议一段相连,因为有这个特性所以evth-pair充当桥梁,连接各种虚拟设备
Openstac,docker容器之间,ovs连接都是使用evth-pair技术
利用镜像名称去寻找服务ip
--link
docker run -d -P --name tomcat03 --link tomcat02 tomcat
使 tomcat03 的容器文件/etc/hosts 中增加对tomcat02名称和id的域名解析 指定容器所在的ip (不建议)
自定义网络
网络模式
bridge: 桥接 默认
none:不配置网络,用户可以稍后进入容器,自行配置
host:和主机共享网络
container :容器和另外一个容器共享 可多个共享
docker run --net
docker network --driver 网络类型
connect 加入网络
create 创建网络
disconnect 退出网络
inspect 查看
ls 列表
prune 删除所有网络
rm 删除一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 创建网络
docker run -d -P --name tomcat04 --ip 192.168.0.254 --network mynet tomcatroute 添加到网络
方便管理
部署集群redis
高可用 负载均衡
创建网络
docker network create redisnet --subnet 172.38.0.0/16
创建redis文件节点
for port in $(seq 1 6);
do
mkdir -p 路径$(port)/conf
touch 路径$(port)/conf/redis.conf
cat << EOF >路径$(port)/conf/redis.conf
port 6379
bind 0.0.0
cluster-enable yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
运行redis容器
for port in $(seq 1 6);
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}
-v 路径$(port)/data:/data
-v 路径$(port)/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.1${port} redis:5.0.14-alpine3.16 redis-server /etc/redis/redis.conf;
done
创建集群
docker exec -it redis-1 /bin/sh 进入redis
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
java 发布spring微服务 到docker
-
打包 jar文件
-
创建dockerfile
-
FROM java:8 COPY ./*.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","./app.jar"]
-
拷贝文件到服务器 执行 docker build -t isoname .
-
查看镜像 docker ps
-
镜像创建成功执行 docker run -d -P --name name isoname
-
发布完成
-
转载:ps:根据阿里云官方配置说明,需要将源文件内的http更改为https,作者没有更改,不知为何要这么做,
阿里云官方配置方法:
https://developer.aliyun.com/article/704987
https://developer.aliyun.com/article/691851
更多仓库官方安装方法
网易163 yum源,安装方法查看:http://mirrors.163.com/.help/
中科大的 yum源,安装方法查看:https://lug.ustc.edu.cn/wiki/mirrors/help
sohu的 yum源,安装方法查看: http://mirrors.sohu.com/help/
阿里云的 yum源,安装方法查看: https://mirrors.aliyun.com/
清华大学的 yum源,安装方法查看: https://mirrors.tuna.tsinghua.edu.cn/
浙江大学的 yum源,安装方法查看: http://mirrors.zju.edu.cn/
中国科技大学yum源,安装方法查看: http://centos.ustc.edu.cn/
7.11
Docker Compose
管理多个容器
定义、运行多个容器
docker-compose.yml 文件
文件格式
————————————————————
version:'2.0' #版本
services: #服务
web:
build:.
ports:
- "5000:5000"
volumes:
- .:/code
-logvolume01:/var/log
links:
- redis
redis:
image:redis
volumes:
logvolume01:{}
——————————————————
compose:概念
服务services,容器,应用,数据库
项目project:关联的容器
——————————————————
compose:概念
服务services,容器,应用,数据库
项目project:关联的容器
下载compose standalone
curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
配置好 4个文件后 分别是 dockerfile 、docker-compose.yml 、requirements.txt 、app.py
docker-compose up -d 后台启动
docker-compose up --build 重新构建
docker-compose 下载好项目文件 yml后可以直接安装部署
例如:wordpress 博客
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
节点多建议用k8s
————————————————————————————
docker swarm 扩缩容 集群
工作模式分为管理节点和工作节点
管理节点要有3以上的奇数 选举出主从
搭建集群
docker swarm
ca Display and rotate the root CA
init Initialize a swarm 初始化一个集群 --advertise-addr string 对外连接
join Join a swarm as a node and/or manager 加入一个集群
join-token Manage join tokens 设置管理节点
leave Leave the swarm 离开一个集群
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm 更新一个集群
docker swarm join-token worker 可以查看加入群组的命令 \manager
docker node ls 查看群组信息
docker node inspect 节点id 查看节点信息
首先初始化 docker swarm init --advertise-addr 公网地址
之后加入群组 docker swarm join-token worker/manager
Raft 一致性算法 可用性
Raft协议 共识算法,多个节点对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。
当一个主节点挂了将会选举新的节点新的节点作为leader,所以至少需要3个主节点
双主双从:一个主节点挂了 另外一个主节点不可用,管理节点至少要两台才能选举出leader,如果是群集至少需要3台保证可靠
保证大多数节点存活才可用,管理节点只要>1,群集至少大于3台:3台管理节点,保证有一个节点挂了其他的可用
弹性、扩缩容 集群
灰度发布
docker run 容器启动不具备扩缩容
docker service 一个服务,具有动态扩缩容,和更新 前提要做swarm集群
随机分布
docker service scale 服务名=5 扩展容器为5个
docker service rm 服务名 删除服务
概念总结
swarm 集群管理和编排 docker可以初始化一个swarm集群,分为管理者和工作者节点
node 就是一个docker节点多个节点组成一个网络集群
service 任务,管理节点或工作节点运行,运行任务
task 容器内的命令,细节任务
swarm 网络
"PublishMode": "ingress"
ingress:特殊的overlay网络 负载均衡的功能 ipvs VIP 会绑定集群的多个ip
Overlay:相当于一个交换机,由于容器之间不能互相ping通 都交给了overlay网络 和桥接类似
Swarm:
Docker Stack
Commands:
deploy Deploy a new stack or update an existing stack 部署服务
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
stack部署集群服务
compose部署单机服务
stack和compose都是使用yml文件
Docker Secret
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
安全,配置密码,证书方面
Docker Config
Commands:
create Create a config from a file or STDIN
inspect Display detailed information on one or more configs
ls List configs
rm Remove one or more configs
配置
k8s
命令-> 管理 -> api -> 调度 -> 工作节点(创建Task容器 维护)
kubectl get pod -> kubectl service api