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。如果这个过程 结…

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

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

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

一、方案背景 雨季的水务管理对于各区县来说&#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 变为 …

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

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

win提权第二弹服务提权

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

使用STM32 再实现电动车防盗

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

3.6 条件判断语句cmp,je,ja,jb及adc、sbb指令

汇编语言 1. adc指令 adc是带进位加法指令&#xff0c;它利用了CF位上记录的进位值指令格式&#xff1a;adc 操作对象1&#xff0c;操作对象2功能&#xff1a;操作对象1 操作对象1 操作对象2 CF例如&#xff1a;adc ax,bx&#xff0c;实现的功能是&#xff1a;ax ax bx …

PyCharm中设置代码模版

前言 新创建一个.py文件后&#xff0c;我们总需要在开头写一些必要的代码&#xff0c;有什么方法能够一劳永逸&#xff0c;让这些代码自动生成呢&#xff1f; 有&#xff0c;它就是代码模版。 设置代码模版 这里先说说如何设置它。 步骤&#xff1a;首先打开PyCharm&#xff0…

MySQL介绍

一、MySQL数据库介绍 1、发展史 1996年 MySQL1.0 2008年1月16日 Sun公司收购了 MySQL 2009年4月20日 Oracle收购了Sun公司 MySQL是一种开放源代码的关系型数据库管理系统 使用最常用的数据库管理语言 SQL&#xff08;结构化查询语言&#xff09; MySQL是开放源代码的 因此所有…

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…

C语言例3-35:长度运算的例子

长度运算符的表现形式&#xff1a; sizeof(数据类型符&#xff09; 或 sizeof(变量&#xff09; 长度运算符的优先级&#xff1a; 与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。上述优先级相同的运算符的结合性都是从右至左。 长度运算的例子 代码如…

二手交易平台|基于JSP技术+ Mysql+Java+ B/S结构的二手交易平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

关于在ArkTS中添加动画没有效果这件事

先来看看错的 Entry Component struct an {State a : number 0;State ang : number 0;build() {Row(){Text(^_^).fontSize(90).position({x : 0,y : this.a}).rotate({angle : this.ang,centerX : 50%,centerY : 50%}).onClick(() > {this.a 100;}).animation({duration…

亚马逊等跨境电商平台自养号测评的五个核心因素

一、安全稳定的环境系统 尽管市场上存在大量现成的系统和软件包&#xff0c;卖个软件或设备给你&#xff0c;这种基本上都没有解决风控的能力&#xff0c;因此&#xff0c;小编推荐大家还是自己掌握相关技术&#xff0c;避免过度依赖于外部资源&#xff0c;目前&#xff0c;也…

联合和枚举

联合体类型的声明 联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在同一内存位置存储不同类型的数据。与结构体不同的是&#xff0c;联合体的所有成员共享同一块内存空间&#xff0c;因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…

Spring Web MVC入门(5)

响应 在我们前面的代码例子中, 都已经设置了响应数据Http响应结果可以是数据, 也可以是静态页面, 也可以针对响应设置状态码, Header信息等. 返回静态页面 创建前端页面index.html(注意路径) html代码如下: <!DOCTYPE html> <html lang"en"> <hea…