当前位置: 首页 > article >正文

运维学习————Docker自制镜像并上传至阿里云以及Docker Compose的使用

目录

一、Dockerfile

1、概念

2、语法

3、实例 

3.1、实例1

3.2、实例2

3.3、实例3 

二、Docker自制镜像

 1、需求

2、准备 

3、构建镜像运行容器 

​编辑 4、推送至阿里云镜像服务中心

三、Docker Compose

1、简介

2、基本概念 

3、⼆进制安装 

3.1、入门实例

3.2、完整配置详解


一、Dockerfile

1、概念

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

2、语法

#FROM  设置镜像使用的基础镜像

FROM centos

#MAINTAINER 维护者信息(设置镜像作者)
MAINTAINER aaa

#RUN  编译镜像时运行的脚本

#包含两种模式:

1,shell 

RUN rpm -ivh /usr/local/xxx.rpm

RUN tar -zxvf /usr/local/xxx.tar.gz

2,exec

RUN ["executable","param1","param2"] 语法

RUN ["/bin/bash","-c","ls"] 等价于/bin/bash -c ls

#CMD 设置容器的启动命令

类似于 RUN 指令,⽤于运⾏程序,但⼆者运⾏的时间点不同

1、CMD 在docker run 启动镜像时运⾏

2、RUN 是在 docker build构建镜像时运⾏的

作⽤: 为启动的容器指定默认要运⾏的程序,程序运⾏结束,容器也就结束。 CMD 指令指定的程序可被 docker run 命令⾏参数中指定要运⾏的程序所覆盖.

如: CMD ["/usr/sbin/nginx","-g","daemon off;"] 等同于: /usr/sbin/nginx -g daemon off 在容器中以交互⽅式运⾏nginx(⾮守护⽅式)

#LABEL 设置镜像的标签,以键值对的形式,语法格式如下:

LABEL … ⽐如我们可以添加镜像的作者: LABEL image.authors="admin"

#EXPOSE  设置镜像暴露的端⼝ 可以是⼀个或者多个端⼝,也可以指定多个EXPOS EXPOSE [...]

EXPOSE 9090

#ENV 设置容器的环境变量

ENV PATH /usr/local/xxx/bin:$PATH


#ADD 添加外部⽂件到镜像(编译镜像时复制文件到镜像中)

ADD xxx.tar.gz /usr/local/

ADD xxx.rpm /usr/local/

ADD 指令和 COPY 的使⽤格式⼀致(同样需求下,官⽅推荐使⽤ COPY)。功能也类似,不同 之处如下:

ADD 的优点:在执⾏ 为 tar 压缩⽂件的话,压缩格式为 gzip, bzip2 以及 xz 的情况 下,会⾃动复制并解压到 。

ADD 的缺点:在不解压的前提下,⽆法复制 tar 压缩⽂件。会令镜像构建缓存失效,从⽽可能会 令镜像构建变得⽐较缓慢。具体是否使⽤,可以根据是否需要⾃动解压来决定

#COPY 复制指令,从上下⽂⽬录中复制⽂件或者⽬录到容器⾥指定路径

#容器内的指定路径,该路径不⽤事先建好,路径不存在的话,会⾃动创建。

#源⽂件或者源⽬录,这⾥可以是通配符表达式

COPY home?.txt /mydir/

#ENTERYPOINT 类似于 CMD 指令,但其不会被 docker run 的命令⾏参数指定的指令所覆盖,⽽且这些命令⾏参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运⾏ docker run 时使⽤了 --entrypoint 选项,将覆盖 entrypoint指令指定的 程序 优点:在执⾏ docker run 的时候可以指定 ENTRYPOINT 运⾏所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后⼀个⽣效

#格式: ENTERYPOINT [“executable”,“param1”,“param2”](exec模式)

ENTERYPOINT command (shell模式)

可以搭配 CMD 命令使⽤:⼀般是变参才会使⽤ CMD ,这⾥的 CMD 等于是在给 ENTRYPOINT 传参

#ARG 构建参数,与 ENV 作⽤⼀⾄。不过作⽤域不⼀样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在 此环境变量

作⽤: ARG:构建参数,只在构建过程中有效。可以通过 --build-arg 选项向 Docker 引擎传 递构建参数的值。

ENV:环境变量,在容器运⾏时有效。可以在构建过程中设置默认值,并在容器运⾏时 被使⽤。

#WORKDIR 指定⼯作⽬录。⽤ WORKDIR 指定的⼯作⽬录,会在构建镜像的每⼀层中 都存在。(WORKDIR 指定的⼯作⽬录,必须是提前创建好的)。 WORKDIR /usr/local/nginx


#VOLUME 定义匿名数据卷。

在启动容器时忘记挂载数据卷,会⾃动挂载到匿名卷。

作⽤:

1、避免重要的数据,因容器重启⽽丢失,这是⾮常致命的。

2、避免容器不断变⼤。

格式: VOLUME ["路径1", "路径2" ...]

            VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

VOLUME [“/data”]

#USER ⽤于指定执⾏后续命令的⽤户和⽤户组,这边只是切换后续命令执⾏的⽤户(⽤户和⽤ 户组必须提前已经存在)

格式: USER <用户名>[:<用户名>]

USER daemon

USER nginx

USER user       

USER uid

USER user:group 

USER uid:gid

USER user:gid    

USER uid:group

#ONBUILD ⽤于延迟构建命令的执⾏。简单的说,就是 Dockerfile ⾥⽤ ONBUILD 指定的命令,在 本次构建镜像的过程中不会执⾏(假设镜像为 test-build)。当有新的 Dockerfile 使⽤ 了之前构建的镜像 FROM test-build ,这时执⾏新镜像的 Dockerfile 构建时候,会执 ⾏ test-build 的 Dockerfile ⾥的 ONBUILD 指定的命令。

格式: ONBUILD<其它指令>


为镜像添加触发器 当⼀个镜像被其他镜像作为基础镜像时需要写上OBNBUILD 会在构建时插⼊触发器指令

#HEALTHCHECK ⽤于指定某个程序或者指令来监控 docker 容器服务的运⾏状态

格式:

HEALTHCHECK [选项] CMD :设置检查容器健康状况的命令

HEALTHCHECK NONE:如果基础镜像有健康检查指令,使⽤这⾏可以屏蔽掉其健康检 查指令

HEALTHCHECK [选项] CMD : 这边 CMD 后⾯跟随的命令使⽤,可以参考 CMD 的⽤法。

3、实例 

3.1、实例1

Tomcat:Tomcat-9.0.52

jdk-8u151-linux-x64.rpm:jdk-8u-151-linux

放在同一目录

#导入基础镜像
from centos:7
#定义作者
maintainer admin<2656799411@qq.com>
#删除镜像中centos的镜像源 不让容器与外界联系
run rm -rf /etc/yum.repos.d/*
#run["rm","-rf","/etc/yum.repos.d/*"]
#创建目录
run mkdir /usr/local/data
#复制原材料到镜像中  add会自动把apache-tomcat-9.0.52.tar.gz 解压 apache-tomcat-9.0.52
copy jdk-8u151-linux-x64.rpm /usr/local/data
add apache-tomcat-9.0.52.tar.gz /usr/local/data	
#修改tomcat名字
run cd /usr/local/data/ && mv apache-tomcat-9.0.52 tomcat
#安装jdk
run rpm -ivh /usr/local/data/jdk-8u151-linux-x64.rpm
#entrypoint 执行命令 和cmd  run 一样 不能被cmd run执行命令覆盖
entrypoint /usr/local/data/tomcat/bin/startup.sh && tail -F /usr/locat/data/tomcat/logs/catalina.out
#暴露端口
expose 8080
#构建镜像
docker build -f Dockerfile -t="tomcat:9.0.52" .
#运⾏镜像
docker run --name  tomcat9v1  -d  -p 9090:8080 tomcat:9.0.52

启动访问容器,访问ip+8080,就可以出现tomcat的页面

3.2、实例2

Tomcat:Tomcat-9.0.52

JDK:jdk-8u151-linux-x64.tar

Dockerfile:

FROM         centos
 MAINTAINER   admin<149510608@qq.com>
 #把宿主机当前上下文的hello.txt拷贝到容器/usr/local/路径下
COPY hello.txt /usr/local/helloincontainer.txt
 #把java与tomcat添加到容器中
ADD jdk-8u151-linux-x64.tar.gz /usr/local/
 ADD apache-tomcat-9.0.52.tar.gz /usr/local/
 #安装vim编辑器
RUN yum -y install vim
 #设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
 WORKDIR $MYPATH
 #配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_151
 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52
 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.52
 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 #容器运行时监听的端口
EXPOSE  8080
 #启动时运行tomcat
 # ENTRYPOINT ["/usr/local/apache-tomcat-8.0.47/bin/startup.sh" ]
 # CMD ["/usr/local/apache-tomcat-8.0.47/bin/catalina.sh","run"]
 CMD /usr/local/apache-tomcat-9.0.52/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.52/logs/catalina.out

依次执行docker build和docker run命令,和实例1一样  

 

3.3、实例3 

Dockerfile:

FROM centos:7
MAINTAINER luoxi

# 安装依赖
# 安装vim编辑器
RUN rm -rf /etc/yum.repos.d/* \
    && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo \
    && yum clean all \
    && yum makecache \
    && yum install -y wget epel-release gcc gcc-c++ \
        pcre pcre-devel openssl openssl-devel zlib zlib-devel make \
    && yum clean all \
    && rm -rf /var/cache/yum/*

# 创建nginx用户
RUN useradd -s /sbin/nologin -M nginx

# 下载并编译Nginx
ARG NGINX_VERSION=1.22.1
ENV NGINX_VERSION=$NGINX_VERSION

RUN wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz && \
      tar zxf nginx-$NGINX_VERSION.tar.gz && \
      cd nginx-$NGINX_VERSION && \
      ./configure --prefix=/usr/local/nginx \
      --user=nginx \
      --group=nginx \
      --with-http_ssl_module \
      --with-http_v2_module \
      --with-http_realip_module \
      --with-http_stub_status_module \
      --with-pcre \
      --with-stream \
      --with-stream_ssl_module \
      --with-stream_realip_module && \
      make -j $(nproc) && \
      make install && \
      rm -rf /usr/local/nginx/html/* && \
      rm -f nginx-$NGINX_VERSION.tar.gz && \
      rm -rf nginx-$NGINX_VERSION

# 创建index.html文件
RUN echo 'ok' > /usr/local/nginx/html/index.html

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置环境变量
ENV PATH $PATH:/usr/local/nginx/sbin

# 设置工作目录
WORKDIR /usr/local/nginx

# 暴露端口
EXPOSE 80

# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]

依次执行docker build和docker run命令,和实例1一样  

二、Docker自制镜像

 1、需求

把springboot+mybatis项⽬制作成镜像(Build),因为上传到dockerhub审核⽐较严格 (dockerhub服务器在国外,⽹络也可能出问题),所以上传到阿⾥云(ship), 使⽤另外⼀个台 服务器,把镜像拉取下来并运⾏(Run)。

2、准备 

Jar包:实例jar包

Jar包所需数据源:数据源

Dockerfile:

#配置依赖镜像
from irvingqiu0823/jdk1.8
#作者
maintainer admin<2472198350@qq.com>
#复制外部jar到到里面
copy shared_battery-0.0.1-SNAPSHOT.jar /app.jar
#配置环境变量
env JAVA_OPTS="-Xms512m -Xmx512m"
 #容器运⾏时,执⾏命令
entrypoint ["sh","-c","java $JAVA_OPTS  -jar /app.jar"]
#暴露端⼝
expose  8083

3、构建镜像运行容器 

依次执行docker build和docker run命令,和实例1一样 

通过ip+8085访问:

 4、推送至阿里云镜像服务中心

先自己注册一个阿里云账号,然后进入镜像服务

创建镜像仓库

按照操作指南,进行镜像的推送即可

三、Docker Compose

1、简介

主要负责服务编排。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务,并能够从这个文件中启动和停止完整的 Docker 容器 组合。

2、基本概念 

服务 (Service): 代表⼀个应⽤的容器,实际上可以启动该应⽤的多个实例。

镜像 (Image): ⽤于创建容器的基础。

容器 (Container): 镜像的⼀个运⾏实例。

⽹络 (Network): 允许容器之间通信。

卷 (Volume): 存储数据的地⽅,可以在容器间共享。

3、⼆进制安装 

下载: curl -L "https://github.com/docker/compose/releases/download/v2.27.1/docker compose-linux-x86_64" -o /usr/local/bin/docker-compose

github⽹速太慢,

可以使⽤下载好的

修改权限: chmod +x /usr/local/bin/docker-compose

查看版本: docker-compose  version

直接使用现成的就行:

docker compose:docker-compose 

3.1、入门实例

#需求:使⽤compose构建tomcat8.0容器,并做各种管理
#创建项⽬⽬录:
mkdir tomcat8-docker-compose && cd tomcat8-docker-compose
#创建 docker-compose.yml ⽂件:
vim docker-compose.yml

 docker-compose.yml:

version: '3.9'
services:
    tomcat:
        image: tomcat:9.0.52
        restart: always
        ports:
            - "8080:8080"
        volumes:
            - /tmp/tomcat/webapps:/usr/local/tomcat/webapps

 

#根据配置创建volume:
 mkdir  -p /tmp/tomcat/webapps
#构建和启动容器(运⾏compose前,必须先启动tomcat):
docker-compose up -d
#查看容器状态:
 docker-compose ps
#停止容器:
docker-compose down
#重建容器:
docker-compose up --build -d
#查看日志:
docker-compose logs -f

使⽤浏览器测试访问服务器,就会出现Tomcat的默认页面

3.2、完整配置详解

docker-compose.yml:

# 版本声明,指定 Docker Compose 文件的版本
version: '3.9'
 # 定义服务
services:
  # 定义名为 "tomcat" 的服务
  tomcat:
    # 使用官方的 Tomcat 9.0.52 镜像,基于 JRE 8
    image: tomcat:9.0.52
    # 容器退出后自动重启
    restart: always
    # 将容器内的 8080 端口映射到宿主机的 8080 端口
    ports:
      - "8080:8080"
    # 挂载宿主机的目录到容器内的 /usr/local/tomcat/webapps 目录
    volumes:
      - ./webapps:/usr/local/tomcat/webapps
    # 定义环境变量,例如设置 JAVA_OPTS
    environment:
      - JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
    # 指定依赖的服务
    depends_on:
      - database
  # 定义名为 "database" 的服务
  database:
    # 使用 MySQL 5.6 镜像
    image: mysql:5.6
    # 容器退出后自动重启
    restart: always
    # 将容器内的 3306 端口映射到宿主机的 3306 端口
    ports:
      - "3306:3306"
    # 设置 MySQL 的初始密码
    environment:
      MYSQL_ROOT_PASSWORD: example
    # 挂载宿主机的目录到容器内的 /var/lib/mysql 目录
    volumes:
      - ./mysql_data:/var/lib/mysql
 # 定义网络
networks:
  # 定义一个名为 "app-network" 的网络
  app-network:
    # 指定网络驱动
    driver: bridge
 # 定义数据卷
volumes:
  # 定义一个名为 "mysql-volume" 的数据卷
  mysql-volume:
    # 指定数据卷驱动
    driver: local

然后和上面一样,构建并启动容器

浏览器访问Tomcat页面出现就成功

去数据库连接工具中,能远程连接上就可以 


http://www.kler.cn/news/283257.html

相关文章:

  • vmware解决虚拟机空间占用不断增大问题
  • FFmpeg源码:ffurl_seek2、ffurl_seek、avio_size函数分析
  • 使用HTML实现贪吃蛇游戏
  • 小猫爬山 dfs/状压
  • Redis中的数据类型及应用场景(面试版)
  • macos 自定义用户目录方法, /Users/xxx 用户文件存储路径自定义方法
  • 构建在线教育系统源码:企业培训APP开发的技术指南
  • 在中国使用wordpress建网站的主要有三类人
  • TransmittableThreadLocal
  • Word文档被锁定无法编辑怎么办?一键快速移除Word编辑限制
  • 计算机网络803-(3)数据链路层
  • 行为型设计模式-状态(state)模式
  • 并发容器简介
  • 闪存刷新机制文献的解读
  • 记录一次两台虚拟机Oracle rac 心跳不能建立的排查
  • 二分法介绍
  • 回归预测 | Matlab实现GWO-BP-Adaboost灰狼算法优化BP神经网络集成学习多输入单输出回归预测
  • centos 服务器之间实现免密登录
  • 家里养宠物空气净化器有用吗?哪款最值得推荐?
  • 53-java中的多态是怎么实现的
  • 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型
  • 慢速连接攻击是什么?慢速连接攻击怎么防护?
  • Android Gsensor 移植
  • 智谱发布新一代基座模型
  • scrapy框架--快速了解
  • debug模式中调好,正常执行不生效
  • 安卓-广播LocalBroadcastManager
  • 标准c++---2
  • 什么是Socks5代理协议?揭秘其优势与应用
  • UDP英译汉网络词典