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 4096

openssl 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              # 指定容器名字 --name
    ports:
    - 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.cnf
  tomcat:
    restart: always # 只要docker启动,容器就启动
    image: daocloud.io/library/tomcat:8.5.15-jre8  # 指定镜像路径(默认官方镜像地址)
    container_name: tomcat-8080              # 指定容器名字 --name
    ports:
      - 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive SQL必刷练习题:日期交叉问题(两种思路)

思路一&#xff1a; ​ 首先想到的是借助炸裂函数&#xff0c;一行变成多行&#xff0c;就可以进行去重操作&#xff0c;然后再统计日期。 用到炸裂函数&#xff0c;就首先需要可以拿到起始和终止日期差大小的数组&#xff0c;然后再炸裂​ 那这个指定长度数组怎么获取呢&…

如何利用生成式AI准备面试?

面试准备的重要性 面试是求职过程中至关重要的一环&#xff0c;它是你与梦想职位之间的桥梁。充分的准备不仅能够增加你获得工作的机会&#xff0c;还能提高你在面试中的自信心。为什么要重视面试准备&#xff1f;因为通过它&#xff0c;你能更好地展示自己的专业能力、个人魅…

Linux chapter1 常用命令 cp

note 1 : netstat、curl、ip、nmap、dig 这些都是常用的网络诊断工具&#xff0c;它们的全称如下&#xff1a; netstat&#xff1a;Network Statistics&#xff0c;网络统计&#xff0c;用于显示网络连接&#xff0c;路由表&#xff0c;网络接口统计等网络信息。curl&#xf…

第七节:使用SMB发布Web前端程序

一、概述 一直以来&#xff0c;多数人都使用Apache、IIS、Tomcat等开源或商业Web服务器来运行Web程序&#xff0c;各种参数太多&#xff0c;与我们简单易用逻辑相左。所以在架构设计的时候&#xff0c;我们也在考虑&#xff0c;我们公司的Web程序是否能运行在SMB中&#xff0c;…

维度建模理论之维度表

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 维度表设计步骤 1&#xff09;确定维度&…

接口冒烟测试方法

接口冒烟测试方法 今年遇到了几个问题&#xff0c;与接口的功能和性能相关&#xff0c;恰巧最近公司也在组织以冒烟测试为主题的活动&#xff0c;于是乎突发奇想&#xff0c;寻思着能否将接口测试与冒烟测试结合起来&#xff0c;发掘一些新的接口测试思路与方法。 平时对接口…

canoe 以太网配置

canoe vn5620 以太网配置 首先电脑连接上VN5620&#xff0c;配置了License才能进行端口设置 从开始菜单中打开Vector Hardware Configuration 进入到配置页面&#xff0c;会出现VN5620&#xff0c;选择进行右击&#xff0c;点击第一个选项Ethernet device configuration ca…

TCP协议 及 重要机制

目录 1.TCP 协议报文格式 1.1.端口号 1.2 首部长度 和 选项 1.3 保留位 1.4 检验和 1.5 32位序号和确认序号 2. TCP的重要机制 2.1 确认应答 2.2 超时重传 2.3 连接管理 2.3.1 三次握手 2.3.2 四次挥手 2.4 滑动窗口 2.5 流量控制 2.6 拥塞控制 2.7 延时应答 2…

el-transfer 穿梭框

用到了jquery&#xff0c;所以需要下载jquery包&#xff0c;"jquery": "^3.6.0" <template><div>选中的{{result}}---数据<el-transfer v-model"result" :data"transferData" filter-placeholder"冷冻盒编号&qu…

全网最详细介绍如何实现图片存储阿里OSS实现资源持久化存储

什么是阿里云OSS 阿里云OSS&#xff08;Object Storage Service&#xff0c;对象存储服务&#xff09;是阿里云提供的一种存储服务&#xff0c;它支持任意类型的数据存储&#xff0c;如图片、视频、日志文件等。OSS以对象&#xff08;Object&#xff09;的形式组织数据&#x…

【深度学习】手动实现RNN循环神经网络

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 01 回顾 02 RNN神经网络原理 03 RNN神经网络实现 04 RNN神经网络实验 RNN的特别结构使得RNN具备了短期记忆能力&#xff0c;使其能够学习部分语义信息…

Teamcenter自定义Send To命令列表

需求 在TC中&#xff0c;选中目标后&#xff0c;右击&#xff0c;出现"Send To"&#xff0c;有时候需要对其进行添加或删减。以隐藏“Validation Manager”为例。 技术细节 进入“Command Suppression”应用。 设置需要隐藏的命令&#xff0c;以隐藏“Validation…

全栈的自我修养 ———— 微信小程序开发电脑测试api请求正常,移动端请求异常!!

小编今天也是在电脑测试时候发送请求http到服务器是可以通的&#xff0c;但是到了手机端就不可以了&#xff0c;经过小编仔细钻研&#xff0c;终于发现了以下问题&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff0…

数据库学习之关系数据库与关系

2.1关系数据库与关系 1. 什么是数据模型&#xff1f;什么是关系数据模型 数据模型是对现实世界物体的一种抽象&#xff0c;是严格定义的一组概念的集合&#xff0c;这些概念精确描述了物体的静态特性&#xff0c;动态特性和完整性约束。 静态特性&#xff1a;数据结构 动态特…

Java - 数组 Array

一、概念 结构是一种线性表&#xff08;元素排列成直线的结构&#xff09;&#xff0c;创建数组会开辟一块连续的内存空间&#xff0c;长度固定无法更改&#xff0c;元素可以重复且只能是同一种类型&#xff08;Object类型数组除外&#xff09;。优点查询快&#xff1a;由于元…

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

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

代码中加了@ApiModelProperty注解,swagger不显示注释?

前言 今天接了一个需求&#xff0c;因为只是涉及到字段内容的更改&#xff0c;就把以前的接口copy过来&#xff0c;只改了一个sql。结果后面和前端联调的时候&#xff0c;前端告诉我swagger返回的字段没有注释&#xff0c;我寻思我家里swagger的注解&#xff0c;为什么没显示呢…

类和对象详解

目录 1.面向对象 1.1什么是面向对象 1.2与面向过程的比较 2类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.3.1什么是实例化 2.3.2类和对象的说明 2.3.3this关键字 2.3.4什么是this引用 2.3.5this引用的特性 3.对象的构造和实例化 3.1对象的初始化…

AIOCR:AI文字识别web集成系统@Kylin+RISCV

基于kotti_ai的AI文字识别web集成系统 AIOCR项目目标&#xff1a; 在KylinRISCV搭建一个kotti_ai构架的网站&#xff0c;提供AI OCR文字识别web服务。 二期目标&#xff1a;在AIOCR的基础上提供chatgpt和文心一言等大模型调用&#xff0c;建立综合大模型应用平台。 功能&am…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…