运维学习————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页面出现就成功
去数据库连接工具中,能远程连接上就可以