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

目录

一、Dockerfile

1、概念

2、语法

3、实例

3.1、实例1

3.2、实例2

3.3、实例3

二、Docker自制镜像

1、需求

2、准备

3、构建镜像运行容器

[​编辑 4、推送至阿里云镜像服务中心](#编辑 4、推送至阿里云镜像服务中心)

[三、Docker Compose](#三、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页面出现就成功

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

相关推荐
dark_200137 分钟前
ESXI8.0 vsphere vcenter 多网卡多网段配置
运维·服务器·网络
架构文摘JGWZ38 分钟前
这款神器,运维绝杀 !!! 【送源码】
运维·安全·web安全
亿林网络数据42 分钟前
等保2.0测评之Nginx 中间件
运维·nginx·中间件
清风 00142 分钟前
在 Linux 上以 All-in-One 模式安装 KubeSphere
linux·运维·服务器
小白学习记录555551 小时前
香橙派转换模型以及在开发板上部署
linux·运维·服务器
tRNA做科研2 小时前
Bio-Linux-shell详解-1-从0开始
linux·运维·服务器
小黑爱编程2 小时前
【Linux网络】Socket套接字
linux·运维·网络
雾岛LYC听风4 小时前
3. 轴指令(omron 机器自动化控制器)——>MC_HomeWithParameter&MC_Move
运维·c#·自动化
Achanss5 小时前
C#学习笔记 .NET Core使用注意事项
笔记·学习·c#
爱分享的益达5 小时前
往年互联网大厂腾讯华为百度等校招面试笔试题合集
学习·程序人生·面试·生活