首页
网站导航
关于
Search
1
解决Typecho Joe主题访问fastly.jsdelivr.net速度慢的方案 | 快速优化技巧
2,188 阅读
2
解决WSL2内存不释放问题的最佳指南
1,399 阅读
3
如何在 Typecho Joe 主题的文章中增加目录
1,170 阅读
4
GO语言环境的搭建教程 - 完全指南
1,003 阅读
5
如何解决Win11电脑桌面上方显示横线问题 | 窗口11教程
1,003 阅读
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
登录
Search
标签搜索
重要
go基础
git 命令
go包
phpstorm
sublime
thinkphp6
mysql问题
软件分享
redis命令
php基础
thinkphp3.2
php第三扩展包
小蚯蚓博客
累计撰写
333
篇文章
累计收到
48
条评论
首页
栏目
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
页面
网站导航
关于
搜索到
7
篇与
的结果
2024-03-16
Docker 容器编排 - 最佳实践与技术指南
概述 通过容器编排,可以实现以下这些功能: 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理 副本数控制,容器有时候也需要集群,快的对容器集群进行版本弹性伸缩 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务 docker compose Compose 是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用 YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。 只能单机环境的容器编排,在单机上部署多个容器会变的比较方便。 docker compose 是对docker操作的增强。 安装 安装的时候,需要注意compose 的版本和docker的版本要对应上,不能太低 # 用阿里云的,看了下1.21.2好像是最新的18年最新更新 # $(uname -s)-$(uname -m) 是获取系统和架构 sudo curl -L "http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 下载最新版本的话,用这个 curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 将可执行权限应用于二进制文件: sudo chmod +x /usr/local/bin/docker-compose 创建软链: sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 测试是否安装成功: docker-compose --version compose.yml 编写 内容比较多,可以看官方文档:https://docs.docker.com/compose/compose-file/compose-file-v2/ compose.yml配置样例,yaml是个key value配置,value和冒号之间需要有空格。上下行之间有上下级关系的,如果下一行有缩进2个空格,则表示是上一行的子集。 version: "2.1" services: # 相当于一个容器,nginx-demo是随便起的 nginx-demo: image: "nginx" container_name: "nginx_compose" restart: "always" # - 的话相当于数组 networks: - wolfcode_net volumes: - /usr/local/www:/usr/share/nginx/htm # 环境变量配置 environment: APP_ENV: dev # 指定dns解析服务 dns: - 114.114.115.115 # 端口映射 ports: - 80:80 # 配置公共网卡 networks: wolfcode_net: driver: bridge ipam: driver: default config: - subnet: 188.18.0.0/16 gateway: 188.18.0.1 服务services配置 需要运行的容器配置,可以理解为原先用docker run命令后面跟的一系列配置信息,都配在这个下面。 网络networks配置 docker-compose 公共自定义网络管理,配置好以后,可以直接在services中引用该网络配置,这个配置可以多个service使用,例如自定义网卡配置 数据卷volumes docker-compose 下统一数据卷管理,可以给多个services用 compose 命令 配置检查 检查配置文件是否正确,会自动查找当前目录下是否有docker-compose.yml,并且检查是否正确 docker-compose config create 创建服务,这个只是创建容器,默认是没有运行的 # 创建docker-compose.yml里的所有services docker-compose create # 只创建docker-compose.yml里的nginx_demo services docker-compose create nginx-demo up 如果要运行的话,这个是针对第一次,或者如果docker-compose.yml文件有更新,需要重新应用最新的配置内容的话,可以使用下面命令,会自动根据最新配置补齐内容。 如果是已经有的容器,启动的话还是得用start命令 # 运行docker-compose.yml所有服务 docker-compose up -d # 只运行nginx-demo服务 docker-compose up -d nginx-demo ps 查看运行中的容器 docker-compose ps stop 停掉服务 docker-compose stop down 停掉并且删除容器等资源,甚用 docker-compose down start 启动服务 docker-compose start restart 重新启动服务 docker-compose restart scale 扩容缩容 快速启动多个服务,需要注意的是,这个时候不能指定容器名container_name: "nginx_compose",不能和主机绑定端口,不然会冲突,导致失败 services: # container_name: "nginx_compose" # 改为只暴露端口即可 ports: - 80 然后执行 # 如果原来只有3个,会增加2个 docker-compose scale nginx-demo=5 # 如果原来是5个,会自动停止2个 docker-compose scale nginx-demo=3 查看日志 查看所有服务的日志 # 查看所有服务的日志 docker-compose logs 指定查看某个服务的日志 # 查看所有服务的日志 docker-compose logs -f nginx-demo swarm 分布式 是在docker官方的,在k8s后面出来的。可以在多个机器上创建容器,可以微服务部署。在docker 1.12后,已经自带swarm了。 架构图如下所示,有个机器当做主节点,管理众多的从节点机器。 有多个管理节点,每个管理节点管理了多个worker节点,如果管理节点都挂了,基于raft协议,从工作节点里选一个当做管理节点。 我们可以利用swarm,配置很多个服务services,然后把这个服务交给节点node创建,node节点以task的形式创建。 服务的生命周期 集群搭建 集群创建 在master节点上创建管理节点,需要注意的是,管理节点也算是个工作节点 # 指定主节点的ip地址,这个地址是这台机器的地址 docker swarm init --advertise-addr 192.168.113.120 去对应的工作节点上执行上述命令即可加入集群。最好先把防火墙关闭了,不然有可能没法访问。 如何查看有几个节点呢 # master 节点上执行 docker node ls 服务创建 每个节点都创建2个nginx docker service create --replicas 2 -p 80:80 --name nginx_swarm nginx 如果有问题题话,可以删除重新创建,注意防火墙网络问题 docker service ls docker service rm 服务名称 这样就可以用相关的命令在master节点整个集群容器的数量。 拓展 最后可以用portainer来可视化管理
2024年03月16日
52 阅读
0 评论
0 点赞
2024-03-15
Docker 仓库 (Registry) - 扩展Docker 软件的资源存储
概述 通过仓库,可以把镜像存在公司的内网,速度比较快,并且比较安全。 常见的仓库 docker hub 地址是:https://hub.docker.com 阿里云私有 https://cr.console.aliyun.com/cn-hangzhou/instance/repositories,这里面都有使用说明 推送 首先要登录 # 执行后,会提示输入密码,输入阿里云密码就好了 docker login --username=iwuqiyin registry.cn-hangzhou.aliyuncs.com 镜像打tag,自己registry的tag会比较有点长 docker tag 5d0da3dc9764 registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 最后推送即可 docker push registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 拉取 # 登录 docker login --username=iwuqiyin registry.cn-hangzhou.aliyuncs.com # pull docker pull registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 自主搭建(私服仓库) nexus,这是java生态 容器启动 # 8868是网页 5000是推送的,5001是拉取 docker run -d --restart=always -p 8868:8081 -p 5000:5000 -p 5001:5001 --name nexus -v /opt/docker/nexus:/nexus-data sonatype/nexus3 然后访问:http://主机ip:8868,即可,这个估计要等下才能访问,可以通过`docker logs -f -n 50 nexus`,看下是否启动成功 详细设置使用,自行百度 # http的服务docker默认不允许,需要配置这个允许,配置完要重启 vim /etc/docker/daemon.json 镜像推送拉取的流程,和阿里云的一样。私有的仓库,像基础镜像,如果本地仓库没有,就会通过代理从远程下载到本地仓库,然后下次本地仓库就会有这个镜像了。 详细:https://www.bilibili.com/video/BV1PT411d7ci/?p=42&spm_id_from=pageDriver&vd_source=c38eab5c82d0c7cca57364b72f733942 harbor 除了Docker Hub以外最早的一个比较受欢迎的 Docker企业级Registry服务器。对资源要求比较高,内存至少要4GB,功能比较强大。 详细:https://www.bilibili.com/video/BV1PT411d7ci/?p=44&spm_id_from=pageDriver&vd_source=c38eab5c82d0c7cca57364b72f733942
2024年03月15日
58 阅读
0 评论
0 点赞
2024-03-15
Dockerfile 使用 - 最佳实践和技巧
概述 Docker 为我们提供的一个用于自定义构建镜像的一个配置文件:描述如何构建一个对象。 利用Docker提供的build命令,指定Dockerfile文件,就可以按照配置的内容将镜像构建出来。 构建镜像 commit 基于现有的容器,来构建一个新的镜像,我们可以修改nginx默认容器里的某些内容,比如改写配置,然后重新打包成镜像,这样的话新生成的镜像,下次运行容器的话,就是我们改好的那个,这个只要了解下即可,工作中用的少。 # -a 镜像作者 -m 镜像描述 nginx_commit是要打包成镜像的容器名称 打包成的镜像名称 docker commit -a "xiaoliu" -m "my nginx container" nginx_commit mynginx:latest build dockerfile的规则 # -t 表示基于dokcerfile来构建 .表示从当前目录找dockerfile docker build -t myImageName:1.0.0 . 常用指令 FROM 指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像,如果不想以任何镜像作为基础:FROM scratch,语法: FROM <image> FROM <image>:<tag> FROM <image>:<digest> 以上为三种写法,后两者为指定具体版本,第一种则使用latest也就是最新版 MAINTAINER(可选) 维护者,述这个镜像的作者,以及联系方式(可选),一般开源的软件才需要 MAINTAINER wuqiyin<silverwq@qq.com> LABEL(可选) 为镜像设置标签,一个Dockerfile中可以配置多个LABEL,语法: LABEL <key>=<value> 例如: LABEL "example.label"="Example Label" LABEL label-value=LAWEL LABEL version="1.0.0" LABEL description="可以写成多行,使用\ 符号可以拼接多行的value" ENV 设置容器的环境变量,可以设置多个,语法: ENV <key> <value> ENV <key>=<values <key>=<value> ... 两种语法的区别为: 第一种一次只能设置一个环境变量 第二种可ockerfile以一次设置多个 RUN 构建镜像的过程中要执行的命令,语法: RUN <command> RUN["executable","param1","param2","paramN"] 第一种写法就是直接写Shell脚本即可 第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数 ADD 复制命令,把主机中src的文件复制到镜像的dest位置,语法: # ADD *.jar /app.jar # 可以相对目录,模糊匹配 ADD <src> <dest> ADD ["<src>", "<dest>] 需要注意的是,如果add的是压缩包,则会自动解压 # 当前目录的解压到容器的/usr/local/src ADD nginx-1.21.tar.gz /usr/local/src WORKDIR 设置容器中的工作目录,如果该目录不存在,那么会自已创建,然后进入该目录 VOLUME 设置挂载目录,可以将主机中的指定目录挂载到容器中,语法: VOLUMET ["<dir>"] VOLUME <dir> VOLUME <dir> <dir> 例如 VOLUME /data 这里的挂载的/data目录就会在运行时自动挂载为匿名卷,任何向容器的 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。这个匿名卷不同于启动命令行里指定的匿名卷,容器被删除的时候,匿名卷也不会被删除 EXPOSE 该镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器内暴露了该端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用-p或-P参数来映射,可以暴露多个端口 语法: EXPOSE <port>/<tcp/udp> 这个最好都要暴露端口,不然的话使用-P参数的时候,不会自动绑定 # -P参数不会自动绑定 docker run -d -P 自定义镜像名称 CMD 该镜像启动容器时默认执行的命令或参数 语法: # 例如:CMD ["sh","-c","ping 127.0.0.1"] CMD ["executable","param1","param2"] CMD ["param1","param2"] # 例如:CMD ping 127.0.0.1 CMD <command> <param1> <param2> 以上为该命令的三种写法,第三种与普通Shel命令类似,第一、二两种都是可执行文件+参数的形式,另外数组内的参数必须使用双引号。 如果dockerfile里有多个cmd,只会最后一个生效,并不会报错 ENTRYPOINT 运行容器时的启动命令,感觉与CMD命令会很像,实际上还是有很大区别,简单对比一下: 相同点: 在整个Dockerfile中只能设置一次,如果写了多次则只有最后一次生效 不同点: ENTRYPOINT不会被运行容器时指定的命令所覆盖,而CMD会被覆盖,例如 docker run xxx /bin/bash,这里的/bin/bash会把cmd里的命令给覆盖了,但是entrypoint里的不会被覆盖 如果同时设置了这两个指令,且CMD仅仅是选项而不是参数,CMD中的内容会作为ENTRYPOINT的参数(一般不这么做) 如果两个都是完整命令,那么只会执行最后一条 语法: ENTRYPOINT ["executable","param1","param2"] # 例如:ENTRYPOINT ping 127.0.0.1 ENTRYPOINT <command> <param1> <param2> ARG 设置变量,在镜像中定义一个变量,当使用docker build命令构建镜像时,带上 --build-arg <name>=<value> 来指定参数值,如果该变量名在Dockerile中不存在则会抛出一个警告 语法: ARG <name>[=<default value>] USER 设置容器的用户,可以是用户名或UID,如果容器设置了以daemon用户去运行,那么RUN、CMD和ENTRYPOINT都会以这个用户去运行,一定要先确定容器中有这个用户,并且拥有对应的操作权限。 语法: USER <username> USER <PID> ONBUILD 表示在构建镜像时做某操作,不过不对当前Dockerfile的镜像生效,而是对以当前Dockerfile镜像作为基础镜像的子镜像生效,主要是为子镜像做一些操作 语法: ONBUILD [INSTRUCTION] 例: 当前镜像为A,设置了如下指令 ONBUILD RUN ls -al 镜像B:FROM 镜像A STOPSINNAL STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或SIGNAME格式的信号名,例如SIGKILL。 构建镜像默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10%。 STOPSIGNAL <signal> HELATHCHECK 容器健康状况检查,可以指定周期检查容器当前的健康状况,该命令只能出现一次,如果有多次则只有最后一次生效。 语法: THEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE 第一种:在容器内部按照指定周期运行指定命令来检测容器健康状况 第二种:取消在基础镜像 OPTIONS选项: --interval=DURATION 两次检查的间隔时间,默认30S --timeout=DURATION 命令执行的超时时间,默认30s --retries=N 当连续失败指定次数,容器会被认定为不健康,默认为3次 返回参数: 0表示success,监控状态 1表示failed,不健康状态 2表示reserved,保留值 dokerfile 样例 普通样例 # 1. 先指定当前镜像的基础镜像 ARG jdkversion=8 # docker built -t --build-arg jdkversion=11 FROM openjdk:$jdkversion # 要提前新增用户 RUN user add wolfcode #拓展:表示后续容器中所有执行命令的操作都是以wolfcode这个用户操作的 USER wolfcode # 2.描述这个镜像的作者,以及联系方式(可选) MAINTAINER wuqiyin<silverwq@qq.com> # 3.镜像的标签信息(可选) LABEL version="1.0" LABEL description="这是我的第一个Dockerfile" # 4. 环境变量 ENV JAVA_ENV=dev ENV APP_NAME test-dockerfile # 5. 在构建镜像的时候,需要执行的 shell 命令 RUN ls -al RUN mkdir /www/dockerfile/test # 6.将主机中的指定文件复制到容器的目标位置,可以简单理解为 CP 命令 ADD /usr/local/www /www # 7.设置容器中的工作目录,如果该目录不存在,那么会自已创建,然后进入该目录 WORKDIR /app # 在设置完工作目录后,执行pwd 命令,打印的目录就是/app RUN pwd # 8.镜像数据卷绑定,将主机中的指定目录挂载到容器中,也就说容器内部也会有个一模一样的目录,他们自己是相通的 VOLUME ["/usr/local/www"] # 9.设置容器启动后要暴露的端口 EXPOSE 8080/tcp # CMD和ENTRYPOINT选择其一即可,作用是描述镜像构建完成后,启动容器时默认执行的脚本 # CMD ping 127.0.0.1 CMD ["sh","-c","ping 127.0.0.1"] # 健康检查,每隔10s,检查容器是否正常,每次检查的操作不能超过3s,并且如果失败了,最多不能超过3次 HEAlTHCHECK --interval=10 --timeout=3 --retries=5 CMD ps -ef | grep java | exit 1 nginx 源码构建 #基准镜像 FROM centos:7 #作者信息 LABEL version="nginx v1" LABEL "emill"="243254384@qq.com" #调整系统时间差 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #工作目录 WORKDIR /usr/local/src/ #定义环境变量 ENV NG_VERSION nginx-1.21.0 #安装epel仓库 RUN yum -y install epel-release #安装wget RUN yum -y install wget #下载nginx文件并解压 RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz #安装编译依赖包 RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data #清理仓库 RUN yum clean all #创建nginx用户 RUN useradd -M -s /sbin/nologin nginx #切换工作目录 WORKDIR /usr/local/src/$NG_VERSION #编译安装nginx RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install #复制测试页面到容器中 # 本地需要有index.html文件 ADD index.html /usr/local/nginx/html #设置容器中要挂在到宿主机的目录 VOLUME /usr/local/nginx/html #设置sbin环境变量 ENV PATH /usr/local/nginx/sbin:$PATH #暴露80端口 EXPOSE 80/tcp ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"] # 不要守护进程方式运行,不然docker会没有进程占用,就会退出容器 #当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下) 将上述dockerfile保存,然后执行 docker build -t wuqiyin_nginx:1.0.0 .
2024年03月15日
52 阅读
0 评论
0 点赞
2024-03-14
Docker 网络通信: 最佳实践和解决方案
概述 容器内部的网络是独立的,但是有时候又需要不同容器之间的网络进行共享通信。 网络模式 docker 里的网络模式就桥接、host、none三种 docker network ls bridge 桥接 在主机中创建一个docker0的虚拟网桥,主机网卡和docker0连接,在docker0(可以理解为虚拟的交换机)上创建多对虚拟网卡,有一半在主机上vethxxx,一半在容器内eth0。 外部主机通过访问宿主机的网卡ens160,然后ens160可以访问桥接网卡docker0,docker0上通过ip转发的方式,转发到相应的veth网卡上,这个veth网卡都有相应的容器eth0网卡和它互相通信连接,这样就实现了网络链路的打通。 特点: 容器之间是在同一个子网里,可以互相访问到 外部网络必须通过主机桥接才能访问到容器,容器得到很好的隔离 容器之间只能通过ip访问,如果想要通过容器名称访问,需要指定-link参数,而且只能单向访问 实验 以桥接模式启动容器 # --net bridge 指定桥接模式 docker run -d --rm -P --name docker_net1 --net bridge centos ping 127.0.0.1 docker run -d --rm -P --name docker_net2 --net bridge centos ping 127.0.0.1 通过这种模式启动的话docker_net1只能通过ip访问到docker_net2,而不能通过容器名称访问。 docker exec -it docker_net1 ping 172.17.0.3 查看docker_net2的ip地址 不过工作中,实际不会通过ip来访问,希望通过容器名称访问,这样比较方便。 docker run -d --rm -P --name docker_net1 centos ping 127.0.0.1 # --link关联到docker_net1 docker run -d --rm -P --name docker_net2 --link docker_net1 centos ping 127.0.0.1 这种模式,只能docker_net2访问到docker_net1,docker_net1 无法访问到docker_net2,只能单向访问。 # 这样docker_net2就可以访问docker_net1 docker exec -it docker_net2 ping docker_net1 -link的实现原理是,在docker_net2里设置了host host 主机模式 容器不再拥有自己的网络空间,而是直接与主机共享网络空间,那么基于该模式创建的容器对应的ip实际就是与主机同一个子网,同一个网段。基于主机模式,相当于把容器给暴露出去了,因为和宿主机同个子网,不仅宿主机可以访问容器,外部网络也可以直接范围容器。 这种模式用的比较少,这种模式,相当于把容器当做了一个机器了,会牺牲容器的安全性,没有隔离。 none 模式 Docker会拥有自已的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息。 特点:完全隔离,与外部任何机器都无网络访问,只有自已的lo本地网络127.0.0.1,容器和容器之间也无法通过网络访问,所以安全性很高。 container 模式 不会创建自已的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等。 所以可以和某个容器共享网络,例如下图中,容器1和容器2共享,容器3和容器2共享网络。 这个方式也是用的比较少。 自定义模式(推荐) 不使用docker自带的网络模式,而是自己去定制话自己特有的网络模式。 使用下面命令创建自己的网络,驱动一般还是用桥接模式,--subnet 指定子网,可以和宿主机不一样,--gateway 指定网关地址,然后跟上一个网络名称wqynetwork docker network create --driver bridge --subnet 192.168.254.0/24 --gateway 192.168.254.1 wqynetwork 然后查看,是否创建成功 docker network ls 或者可以使用inspect查看详细信息 docker network inspect wqynetwork 自定义网络创建成功后,会创建一个自定义的桥接网卡 有了这个桥接网卡后,基于这个网卡创建的容器之间是可以相互连接的。 实验下 启动一个centos的容器,--net 指定我们自定义的网络,ping 命令表示容器启动之后执行的命令,因为容器启动之后,如果发现没有任何事情可以做,就会停止了,需要ping 来卡在,这样centos的容器就不会关闭了 # 启动两个容器 docker run -d --rm -P --name nginx_network2 --net wqynetwork centos ping 127.0.0.1 docker run -d --rm -P --name nginx_network1 --net wqynetwork centos ping 127.0.0.1 这个时候nginx_network1就可以直接访问到nginx_network2的网络了,因为他们是在同一个网络环境下的 # 通过容器名称来访问 docker exec -it nginx_network1 ping nginx_network2 # 通过nginx_network2的ip来访问也是可以的 docker exec -it nginx_network1 ping 192.168.254.2 不同模式下的连接问题 如下图中,容器1和容器2是不同的连接模式,容器1是默认的docker0网卡,容器2是自定义的wolfcode网络,他们之间无法直接连接。 如果想要让他们之间能通信的话,可以使用下面的这个命令就可以实现通信 # 把wolfcode网卡加到了容器1 docker network connect wolfcode nginx_network1 这样他们之间就可以通信了 # 容器2就可以访问容器1了 docker exec -it nginx_network2 ping nginx_network1
2024年03月14日
47 阅读
0 评论
0 点赞
2024-03-14
Docker 数据卷 (Volume) - 最佳实践和使用技巧
为什么需要数据卷 因为容器内的文件系统和宿主机的文件系统之间是隔离的,通过数据卷,可以把容器内和宿主机的文件目录关联起来。 数据卷可以理解为一卷相同的数据,会放在同一个位置。 绑定方式 匿名绑定 匿名绑定的方式,只需要指定容器内的目录即可,不需要指定容器外的目录,当容器被删除后,这个容器外的数据也会被删除,所以用的很少 docker run --rm -d -p 80:80 --name nginx_volume -v /usr/share/nginx/html nginx 查看容器的挂载信息,可以进入/var/lib/docker/volumes/d5c4ded82f96bdbbd1521b11b8dcc010c1a2298240f39277b20c0719b685d985/_data目录修改index.html文件即可 docker inspect nginx_volume 或者通过下面命令,也可以查看数据卷信息 docker volume ls 需要注意的是,如果通过-f强制删除容器的话,数据卷也不会被删除 docker rm -f nginx_volume 如果使用Dockerfile里的VOLUME指定的的匿名绑定,容器被删除的时候,也不会被删除 具名绑定 具名绑定,需要指定数据卷的名称,例如nginx-html,这种方式,如果容器删除,相应的数据不会被删除。 如果我们不关心数据存在宿主机的哪个位置的话,这个方式用起来比较方便。 docker run --rm -d -p 80:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx 查看挂载到哪个目录 docker inspect nginx_volume 因为容器删除后,没有删除数据卷,可以手动删除 docker volume rm nginx-html bind mount 可以把宿主机的某个目录,映射到容器里的某个目录去。如果宿主机的目录有内容的话,容器里的目录就直接用这个目录。如果宿主机的目录没有内容,则宿主机默认使用容器里目录的内容。如果有多个目录需要映射,则用多个-v。 docker run --rm -d -p 80:80 --name nginx_volume -v /usr/local/www:/usr/share/nginx/html -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx 这种方式好像没有创建数据卷,通过如下方式,看不到数据卷信息 docker volume ls volume 数据卷管理 创建一个volume docker volume create volume-name 查看有什么volume docker volume ls 查看volume 的详情 docker volume inspect volume-name 删除 volume docker volume rm volume-name
2024年03月14日
53 阅读
0 评论
0 点赞
2024-03-14
docker 基础命令
概述 docker 命令有点借鉴git命令的意思,有docker pull,docker push等。 镜像相关 查找镜像 默认的镜像仓库都在国外:hub.docker.com,可以改成阿里云的镜像仓库,可以见安装教程文章。 通过search命令,可以搜索一些镜像信息,例如搜索redis镜像 docker search redis 镜像拉取 拉取最新版本的镜像 # 要跟上完整的名称,默认拉取的是最新的版本 docker pull supermanito/helloworld 如下图所示,这个镜像分成了2层,所以拉取的时候看到了2个 关于镜像分层存储,主要是为了节省存储空间,例如: 拉取指定版本的镜像,例如v3版本的redis docker pull redis:3 查看本地镜像 docker images 删除镜像 rm 默认是删除容器,rmi表示删除镜像 docker rmi 镜像的ImageId 有时候一个镜像id对应多个容器,这个时候删除要通过镜像仓库名称的方式删除,不然会报错,因为同一个镜像id有多个 容器 创建并且运行一个镜像 首先查找本地的nginx镜像,如果本地没有nginx镜像,则会从远程拉取。使用run命令,加上镜像名称,即可运行起来 docker run nginx 用上述这个命令直接运行的话,有几个问题: nginx 容器会前台运行 宿主机的网络和nginx容器时候隔离开的,宿主机无法访问到容器里的网络 端口映射和后台启动 为了解决上面两个问题,可以使用-d后台运行,-p将主机的端口:映射到容器的端口里,docker使用的是iptables防火墙路由映射的功能 docker run -d -p 80:80 nginx 查看端口映射信息 docker ps 如果说,容器内有多个端口,想要一次性暴露出来,这些端口绑定到宿主机的随机端口上,可以用-P参数 docker run -d -P nginx 下图中的32768是随机端口。 设置容器名称 因为容器id比较不好记住,操作的时候不方便,所以启动的时候,可以指定名称,这样对容器的操作比较方便 docker run -d -p 81:80 --name nginxName nginx 然后,就可以通过名字来操作了 docker stop nginxName 容器退出时候自动删除容器 有时候,容器依赖一些配置,如果没有配置的话,就启动不起来,但是即使启动失败了,执行docker run 命令后,容器还是会创建了,这个时候产生的容器没啥用,还得手动去删除。所以这个时候可以使用--rm参数,容器退出后自动删除,对于测试的时候可以用,但是redis,mysql这种存储数据的最好不要用 docker run --rm supermanito/helloworld 容器因为一些原因,关闭了,需要重启 指定容器关闭时的重启策略,有三种可选策略,通过--restart参数设置 no(默认):表示不重启 on-failure:当失败时重启,还可以加上3指定最多重启3次,如果3次都失败就不再重启了,这种是针对异常关闭,如果是docker stop命令,不会重启 always:只要已关闭就自动重启,服务器重启后也能自动启动 # 容器关闭后,重启三次 docker run -d --name nginx01 -P --restart on-failure:3 nginx # docker一旦启动,容器就自动起来,不然的话默认是关闭的,需要手动启动各个容器 docker run -d --name nginx01 -P --restart always nginx 设置容器里的环境变量 有时候,我们需要通过环境变量判断一些程序逻辑,这个时候在docker启动的时候,通过-e参数(也可以--env来指定)进行指定就好了 # 设置了两个环境变量,多个环境变量,需要多个-e指定 docker run -d -P --name nginx_env -e JAVA_ENV=dev -e JAVA_VM=G1 nginx 查看容器的一些基础信息,包括环境变量: docker inspect nginx_env 我们还可以通过docker exec命令,把命令发送给容器执行,-it表示让容器启动一个终端来执行命令,要执行的env命令放在最后 [root@localhost ~]# docker exec -it nginx_env env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=9689859c69d1 TERM=xterm JAVA_ENV=dev JAVA_VM=G1 NGINX_VERSION=1.21.5 NJS_VERSION=0.7.1 PKG_RELEASE=1~bullseye HOME=/root 限制容器的资源限制 可以限制的内容很多,可以通过docker run --help查看run的一些参数信息 # -m 限制内存为8m,单位还可以是k,g,cpu设置为1个 docker run -d -rm -m 8m --cpus 1 nginx 那我们怎么知道,容器有没被限制呢,可以通过查看容器的实时状态查看 docker stats 容器id 查看运行中的容器 查看正在运行中的所有容器 docker ps 查看所有状态的容器 docker ps -a 删除容器 这个容器id,可以是完整的容器id,也可以是前缀好,只要能唯一定位到容器即可 docker rm 容器id # 一次删除多个 docker rm 74350eb761cc c7353a2bf490 强行删除进行中的容器 运行中的容器可以删除吗?正常是不要这么操作,正常要先停止容器,然后再删除就好了。如果非要删除进行中的,可以-f参数 docker rm -f 74350eb761cc 停止容器 docker stop 容器id 启动容器 docker start 容器id 查看容器日志 以下就可以输出容器的日志信息,比如nginx容器的信息,以下命令一次性输出所有 docker logs 容器id docker logs c1bd1b7f7f9a 如果想要实时查看最近的20条,可以用-f,是flow的简写 docker logs -f -n 20 ngix01 进入容器内部 因为容器相当于一个小虚拟机,容器内和容器外,文件系统是隔离开的,可以进入容器内部 docker exec -it nginx01 /bin/bash 如果要退出的话,只需要输入exit就好。 容器内和容器外的文件隔离方式其实也很简单,就从宿主机上专门申请一块磁盘目录,用于容器的存储
2024年03月14日
53 阅读
0 评论
0 点赞
2023-12-30
Docker安装教程 | 最详细的步骤图解
简介 Docker CE是免费的Docker产品的新名称,Docker CE包含了完整的Docker平台,非常适合开发人员和运维团队构建容器APP。 下载地址:https://mirrors.aliyun.com/docker-ce/?spm=a2c6h.13651104.d-5001.7.30fe3317A5jrOv 本教材是copy阿里云官网的安装教程:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11Vnzr56 配置方法 Ubuntu 14.04/16.04(使用 apt-get 进行安装) # step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # apt-cache madison docker-ce # docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial) # sudo apt-get -y install docker-ce=[VERSION] CentOS 7(使用 yum 进行安装) # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 可以看下源是否添加成功了 yum list|grep docker-ce # Step 3 sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo # Step 4: 更新并安装Docker-CE sudo yum makecache fast sudo yum -y install docker-ce # Step 4: 开启Docker服务 sudo service docker start # 注意: # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。 # vim /etc/yum.repos.d/docker-ce.repo # 将[docker-ce-test]下方的enabled=0修改为enabled=1 # # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # yum list docker-ce.x86_64 --showduplicates | sort -r # Loading mirror speeds from cached hostfile # Loaded plugins: branch, fastestmirror, langpacks # docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable # docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable # docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable # Available Packages # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos) # sudo yum -y install docker-ce-[VERSION] 安装校验 注意,输出必须有Client和Server的信息,如果只有Client的话,就会有问题。 root@iZbp12adskpuoxodbkqzjfZ:$ docker version Client: Version: 17.03.0-ce API version: 1.26 Go version: go1.7.5 Git commit: 3a232c8 Built: Tue Feb 28 07:52:04 2017 OS/Arch: linux/amd64 Server: Version: 17.03.0-ce API version: 1.26 (minimum version 1.12) Go version: go1.7.5 Git commit: 3a232c8 Built: Tue Feb 28 07:52:04 2017 OS/Arch: linux/amd64 Experimental: false 配置容器镜像地址 默认的镜像地址在国外,类似npm的仓库地址在国外,速度很慢,需要改到国内,这里使用阿里云的:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 需要注意的是,每个人账号的地址是不一样的。 相关链接 官方主页:https://www.docker.com/community-edition
2023年12月30日
160 阅读
0 评论
0 点赞