Dockerfile Docker Compose(实战总结)

Dockerfile & Docker Compose(实战总结)

Dockerfile

Dockerfile 是用来构建Docker镜像文件,是由一条条构建镜像所需的指令构成的脚步。

步骤:

  1. 编写Dockerfile 文件
  2. docker build 构建镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

体系结构:

  • FROM:基础镜像,当前的镜像基于哪个镜像
  • MAINTAINER:镜像作者、邮箱
  • WORKDIR:设置工作目录,终端默认登陆进来的工作目录
  • EXPOSE:当前容器对外暴露的端口
  • USER:指定镜像以什么样的用户执行,默认是root
  • ENV:设置环境变量 (可以写多条),构建镜像中的环境变量
  • ADD:将宿主机的文件复制到容器内,如果是一个压缩文件, 将会在复制 后自动解压
  • COPY:和ADD相似,但是如果有压缩文件并不能解压
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • RUN:容器构建时需要运行的命令,等同于操作shell脚步,例子:RUN yum -y install vim
  • CMD:指定一个容器启动时运行的命令,可以有多个CMD,但只有最后一个会生效。在构建容器时,会被 docker run 后面指定的参数覆盖。
  • ENTRYPOINT:和CMD相似,但是并不会被docker run指定的参数覆盖,而是追加参数
  • ONBUILD:当创建一个被继承的Dockerfile,会被触发,触发器

RUN和CMD的区别:

CMD是在docker run时运行
RUN是在docker build时运行

例子:构建JDK镜像

# 来自基础镜像
FROM centos:7
# 指定镜像创建者信息
MAINTAINER goodyan<good.qq.com>
# 切换工作目录 /usr/local
WORKDIR /usr/local
# 创建一个存放jdk的路径
RUN mkdir /usr/local/java
# 安装vim插件
RUN yum -y install vim
# 将jdk压缩包复制并解压到容器中/usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
CMD ["/bin/bash"]

构建镜像语法:

# -f 后可以省略,会生成在当前目录上
docker build -f / dockerfiel文件位置) -t 要生成的镜像名:[版本号] .
docker build -f /home/dockerdir/dockerfiel -t tomcatNew:1.0 .
# 查看是否构建成功
docker images

将本地镜像推送到阿里云镜像仓库

# 1.登录阿里云Docker Registry, 密码为开通服务时设置的密码
docker login --username=用户名 registry.cn-xxx(每个人地址不一样)
# 2.标记此镜像为阿里云仓库的镜像
docker tag [镜像id] registry.cn-xxxx.xxx.com/xxx/jdk:[镜像版本号]
# 3.提交 
docker push 镜像名:[镜像版本号]

Docker网络

容器间的互联和通信以及端口映射,容器IP变了可以通过服务名直接网络通信不受影响。Docker默认提供了3种网络模式,

  • bridge 默认的桥接模式,并将容器连接到一个docker0
  • host 容器将不会虚拟出自己的网卡,使用宿主机的IP和端口
  • container模式 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace
  • none 该Docker容器没有网卡、IP、路由等信息

基本命令:

# 查看ip
ifconfig 或者 ip addr# 查看docker网络模式列表
docker network ls# 创建新的网络
docker network create 网络名# 删除的网络名
docker network rm 网络名# 查看的网络名
docker network inspect 网络名# 连接络名
docker network connect 网络名# 中断络名
docker network disconnect 网络名# 查看某个容器的网关信息(倒数20行内)
docker inspect 容器id | tail -n 20
# 查看到bridge  就是桥接模式,Gateway:网关,IPAddress:ip(注意:这里的ip,每次创建/删除容器,IP会变)

桥接模式

# 查看的bridge 网络信息,通过grep 获取名称项目(默认是docker0)
docker network inspect bridge | grep name# 创建2个容器,后查看ip
ip addr
# 会看到多了很多veth的xxx,它们与eth0与匹配# 我们进入某个容器内部,再查看IP
ip addr
# 会看到etho的xxx 与外面的对应,一个容器内部的etho,对应外部的veth

host 模式

# 查看的bridge 网络信息,通过grep 获取名称项目(默认是docker0)
docker network inspect host# 它的容器里的IP和端口,与宿主机一致,创建容器的 -p 命令就会失效

自定义网络

# 可以解决,ping IP 和 ping 服务名 都可以成功# 创建新的网络(yan_work)
docker network create yan_work# 查看docker网络模式列表
docker network ls# 创建2个容器
docker run -it -p 8081:8080 --network yan_work --name tom81 镜像名:标签名 /bin/bash
docker run -it -p 8082:8080 --network yan_work --name tom82 镜像名:标签名 /bin/bash# 分别进入2个容器
docker exec -it 容器名称|容器id /bin/bash# 分别查看ip(查看它们是否处于同一网段上)
ip addr# 分别ping对应的ip地址,和服务名(是否ping成功,同一个网络会成功)
ping tom81
ping tom82

Docker部署

微服务打包Docker镜像

# 步骤1. 准备SpringBoot项目,进行打包
mvn package install# 步骤2. 启动命令,进行测试是否启动成功
windows系统启动:java -jar xxx.jar
Linux系统启动:nohup java -jar xxx.jar# 步骤3.创建dockerfiel文件,与jar包存在同一目录(vim Dockerfiel)
# Dockerfiel文件内容:
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]# 步骤4.上传服务器,构建镜像
docker build -f /home/xxx/dockerfiel文件地址(如果在当前目录可省略-f)-p 端口映射 -t 镜像名:1.0 .# 步骤5.查看镜像
docker images# 步骤6.运行启动镜像
docker run -id --name=容器名 镜像名:标签名
或 docker run -d --name 容器名 -p 端口外:端口内 镜像名:标签名

IDEA集成Docker实现打包

步骤1:修改docker服务配置文件

# 修改配置文件
vim /lib/systemd/system/docker.service
# 修改内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
(修改ExecStart那行,并开启2375端口,0.0.0.0代表任何ip都可以访问)# 重新加载配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker.service
# 查看端口是否开启
netstar -nlpt   # 如果没有这个命令,安装插件 yum install net-tools
# 关闭防火墙 / 开发端口号的防火墙
firewall-cmd --list-ports # 查看
firewall-cmd --zone=public --add-port=2375/tcp --permanent # 设置
firewall-cmd --reload     # 重启

步骤2:IDEA工具配置连接Docker

步骤3:使用 docker-maven-plugin插件 ,实现自动化部署

修改pop.xml文件

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><!--鏡像名字--><imageName>${docker.image.prefix}/${project.artifactId}</imageName><imageTags><imageTag>latest</imageTag>
<!--          <imageTag>${project.version}</imageTag>--></imageTags><baseImage>java</baseImage><maintainer>821521880@qq.com</maintainer><workdir>/ROOT</workdir><cmd>["java", "-version"]</cmd><entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint><!--连接Docker 输入对应的IP地址 --><dockerHost>http://123.56.94.235:2375</dockerHost><!-- 这里是复制 jar 包到 docker 容器指定目录配置 --><resources><resource><targetPath>/ROOT</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration>
</plugin>

然后我们执行打包命令,就在Docker服务生成镜像

mvn clean package docker:build

步骤4:打包自动化,自动化部署

<!-- 当执行打包命令,就自动执行 build语句 -在pop.xml文件里添加->
<executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions>

Docker认证命令配置

使用CA加密认证,访问Docker更加安全

  1. 创建ca文件夹,存放CA私钥/公钥
mkdir -p /usr/local/ca
cd /usr/local/ca/
  1. 生成私钥/公钥
openssl genrsa -aes256 -out ca-key.pem 4096# Enter pass phrase for ca-key.pem:
# 执行后,需要输入2次密码,设置密码openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
# 执行完,需要输入刚才设置的密码。
# 然后依次输入 1国家名字 cn 2省份名称 bj 3城市 bj 4组织名称 good ... 个人信息
  1. 生成server-key.pem文件
openssl genrsa -out server-key.pem 4096
# 执行完,/usr/local/ca 目录下会有3个文件
  1. CA来签署公钥
openssl req -subj "/CN=IP地址(或者域名www.goodysr.cn)" -sha256 -new -key server-key.pem -out server.csr
# 例子
openssl req -subj "/CN=121.40.176.56" -sha256 -new -key server-key.pem -out server.csr
  1. 配置白名单
echo subjectAltName=IP:IP地址,IP:0.0.0.0 >> extfile.cnf
# 例子
echo subjectAltName = IP:121.40.176.56,IP:0.0.0.0 >> extfile.cnf
  1. 将Docker使用属性设置仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
  1. 生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf# 执行完,要输入刚才设置的密码,输入密码
  1. 生成客户端的key.pem
openssl genrsa -out key.pem 4096openssl req -subj '/CN=client' -new -key key.pem -out client.csr
  1. 使用密钥适合客户端身份验证
echo extendedKeyUsage = clientAuth >> extfile.cnf# echo extendedKeyUsage = clientAuth >> extfile-client.cnf
  1. 生成cert.pem签名证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf# 输入完,要设置密码
  1. 删除不需要的文件
rm -v client.csr server.csr
  1. 修改权限,避免密钥损坏
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
  1. 归集服务器证书
cp server-*.pem  /etc/docker/
cp ca.pem /etc/docker/# 以上两步操作都在ca文件夹内,如果当前不在ca文件夹,需加上路径
# 把证书复制到/etc/docker/目录下
  1. 修改Docker配置
vim /lib/systemd/system/docker.service
# 修改内容
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem \--tlscert=/etc/docker/server-cert.pem \--tlskey=/etc/docker/server-key.pem \-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock# 重新加载配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker
# 开放2375端口
/sbin/iptables -I INPUT -p tcp --dport 2376 -j ACCEPT
# 查看信息
iptables-save
# 重启Docker
service docker restart
  1. 将服务器生成的私钥密钥,保存到本地环境
/usr/local/ca 目录下的 ca.pem ca-key.pem cert.pem key.pem 
保存到本地的 ca 目录下

Portainer图形化管理工具

  1. 下载portainer镜像
docker search portainer
docker pull portainer/portainer
  1. 启动镜像
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
  1. 开放端口号
firewall-cmd --list-ports
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload
  1. 访问9000地址

第一次登录需要创建用户,选择第一个。

Docker Compose

高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

安装

  1. 下载:https://github.com/docker/compose/releases
# 下载方式:
# 1.下载适应版本的 Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# 肯能网络原因,如果下载失败就下载另一个地址
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname-m` > /usr/local/bin/docker-compose# 2.手动下载
# https://github.com/docker/compose/releases
# 下载 docker-compose-Linux-X86_64 文件,上传服务器 /usr/local/bin/ 目录下
# 重命名 docker-compose 
mv docker-compose-Linux-X86_64 docker-compose# 3.修改文件权限
chmod 777 docker-compose# 4.把文件方法bin目录下,配置可执行文件的系统变量,可以在任何目录下执行docker-compose命令
mv docker-compose /usr/local/bin/# 5.查看版本信息,看是否安装成功
docker-compose version

使用

创建容器

需要通过docker-compose.yml模板文件,定义一组相关的应用容器作为一个项目。

案例1管理一个tomcat、mysql:

version: '3'        # 表示该docker-compose.yml文件使用的是Version 2 file format
services:           # 为project定义服务。mysql:            # 定义服务名称,随便起名restart: always # 只要docker启动,容器就启动image: daocloud.io/library/mysql:5.7.6  # 指定镜像路径(默认官方镜像地址)container_name: mysql-3306              # 指定容器名字 --nameports:- 3306:3306                             # 端口号映射environment:MYSQL_ROOT_PASSWORD: root             # Mysql Root的密码TZ: Asiz/Shanghai                     # 指定时区volumes:- /opt/mysql/data:/var/lib/mysql        # 映射宿主机目录- /opt/mysql/conf/mysql.cnf:/etc/mysql/mysql.cong.d/mysql.cnftomcat:restart: always # 只要docker启动,容器就启动image: daocloud.io/library/tomcat:8.5.15-jre8  # 指定镜像路径(默认官方镜像地址)container_name: tomcat-8080              # 指定容器名字 --nameports:- 8080:8080                            # 端口号映射environment:TZ: Asiz/Shanghai                      # 指定时区volumes:- /opt/tomcat/webapps:/usr/local/tomcat/webapps    # 映射宿主机目录- /opt/tomcat/logs:/usr/local/tomcat/logs

操作:

# 启动(执行上面命令创建容器)
docker-compose -f 文件名.后缀(如果当前文件不再当前目录需要指定,可省略) up -d# 登录到容器中
docker-compose exec 容器名 bash# 停止所有容器
docker stop ${docker ps -qa}
docker-compose stop # 关闭所有容器# 删除docker-compose文件内所有容器
docker-compose down

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python coding with ChatGPT 打卡第23天| 回溯算法:理论基础

文章目录 视频讲解回溯法的效率解决的问题如何理解回溯法回溯框架 视频讲解 回溯算法理论篇 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法的效率 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法…

区域规划(Regional Planning)的学习笔记

目录 一、概念题 1.区域的概念、类型、特性 2.区域分析的概念、主要内容 3.自然环境、自然资源的概念 4.区域自然资源评价的内容 5.可持续发展理论定义 6.经济增长、经济结构定义 7.产业结构概念 8.人口增长分析的含义、指标 9.技术进步概念、类型 10.技术进步对区域…

【C++ leetcode】双指针问题(续)

3. 202 .快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

Python中的列表推导式(List Comprehension)

Python中的列表推导式&#xff08;List Comprehension&#xff09;是一种强大且简洁的语法结构&#xff0c;用于快速创建列表。它通过一行代码就能完成原本需要多行代码才能实现的循环迭代与列表添加操作。列表推导式在Python中非常常用&#xff0c;它使得代码更加简洁、易读和…

wayland(xdg_wm_base) + egl + opengles 光照模型实例(十五)

文章目录 前言一、获取 glm 库文件二、使用环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照效果的3d 立方体1. egl_wayland_light.cpp2. Matrix.h 和 Matrix.cpp3. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c4. 编译5. 运行总结参考资料前言 本文主要介绍如何…

蓝桥杯2023省赛:阶乘求和

题目链接&#xff1a; 1.阶乘求和 - 蓝桥云课 (lanqiao.cn) 说明&#xff1a; 说难也不难&#xff0c;说简单也不简单&#xff0c;就是考你敏不敏锐。想到末尾位数为0加起来就不影响了&#xff0c;以及阶乘里产生一个10就多一个0就很容易了。 还有蓝桥杯常考的&#xff1a;…

ArcGIS Pro、R和INVEST:三位一体的生态系统服务评估框架

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

flutter->Scaffold左侧/右侧侧边栏

//appBar的 leading/actions 和 Scaffold的drawer/endDrawer 冲突只能存在一个 import package:flutter/material.dart;void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});overrideWidget build(BuildContext context) {ret…

Bert模型输出:last_hidden_state转换为pooler_output

1. BERT模型的输出 在BERT模型中&#xff0c;last_hidden_state和pooler_output是两个不同的输出。 (1) last_hidden_state: last_hidden_state是指BERT模型中最后一个隐藏层的隐藏状态。它是一个三维张量&#xff0c;其形状为[batch_size, sequence_length, hidden_size]。其…

智慧水务:雨季山区水域水务智能化监控与监测管理方案

一、方案背景 雨季的水务管理对于各区县来说&#xff0c;无疑是一项至关重要的任务。夏季雨水充沛&#xff0c;江河湖泊水位上涨&#xff0c;山洪、上游排水等情况时有发生&#xff0c;给各地的水务设施和防汛工作带来了严峻的挑战。针对区县的各类水域监管场景&#xff0c;需…

免费的chatgpt网站(包含最新版4.0)

相信每个人在生活工作学习中都逃不过用chatgpt来解决一些问题&#xff0c;下面我长话短说&#xff0c;为大家简单介绍几款免费且好用的chatgpt网站 1、YesChat 网址&#xff1a;YesChat-ChatGPT4V Dalle3 Claude 3 All in One Free 第一个就给大家介绍一个狠角色&#xff0c;最…

C 语言中位取反操作符 ~ 和逻辑取反操作符 !

在 C 语言中&#xff0c;有两种取反操作符&#xff0c;分别是位取反操作符 ~ 和逻辑取反操作符 !。 位取反操作符 ~&#xff1a; 位取反操作符 ~ 是一个一元操作符&#xff0c;用于执行按位取反操作。它会将操作数的每个位取反&#xff0c;即将 0 变为 1&#xff0c;将 1 变为 …

c语言入门基础题-自己的解法c小白

编程2&#xff1a;企业发放奖金根据利润提成。利润不高于十万时&#xff0c;奖金可提10%&#xff0c;高于十万时&#xff0c;低于十万部分不变&#xff0c;高于十万部分可提7.5%,20万到40万时&#xff0c;高于20万部分可提5%&#xff0c;40万到六十万时高于四十万部分可提3%&am…

代码随想录算法训练营第五十二天|LeetCode300 最长递增子序列、LeetCode674 最长连续递增序列、LeetCode718 最长重复子数组

300.最长递增子序列 思路&#xff1a;确定dp数组及其下标含义&#xff0c;dp[i]表示以nums[i]为结尾的最长递增子序列长度。递推公式&#xff0c;遍历i以前的子序列&#xff0c; 如果nums[i]>nums[j]&#xff0c;dp[i]就等于max(dp[i],dp[j]1),找到当前最长的递增序列长度。…

备战蓝桥杯Day29 - 拼接最大数字问题

问题描述 有n个非负整数&#xff0c;将其按照字符串拼接的方式拼接为一个整数如何拼接可以使得得到的整数最大? 例: 32,94,128,1286,6,71可以拼接除的最大整数为 94716321286128。 问题思路 1.比较两个字符串的第一个数字&#xff0c;数值大的在前面&#xff0c;数值小的在…

算法打卡day21|回溯法篇01|理论知识,Leetcode 77.组合

回溯法理论知识 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。所以回溯函数也就是递归函数&#xff0c;指的都是一个函数。 回溯法的效率 回溯法并不是什么高效的算法。因为回溯的本质是穷举&#xff0c;…

win提权第二弹服务提权

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

python多进程调用class类遇到的坑

测试环境 Python 3.9.17 系统&#xff1a;macOS Ventura 13.0.1 测试1 多进程采用test.run方式调用函数。 发现&#xff0c;调用的test.run 函数没运行 def multiprocessing_get_slow_log():pool Pool(3)sp Spider()conn sp.mysql_conncur conn.cursor()sql "&qu…

使用STM32 再实现电动车防盗

项目需求 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警&#xff0c; 吓退小偷。 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警&…

Java并发编程-Java中的锁

1.简介 Java 中的锁是用于控制多线程对共享资源访问的一种机制&#xff0c;以防止数据的不一致性和脏读。Java 提供了多种锁机制&#xff0c;包括内置的同步机制&#xff08;synchronized&#xff09;和在 java.util.concurrent.locks 包中提供的显式锁&#xff08;如 Reentra…