基于Dockerfile构建镜像应用

目录

一、镜像概述

二、镜像构建方式

三、镜像构建案例

3.1、基于已有容器创建镜像

3.2、基于本地模板创建镜像

3.3、基于Dockerfile构建镜像

3.3.1、Docker 镜像结构

3.3.2、Dockerfile介绍

3.3.3、Dockerfile详解

3.3.4、Dockerfile构建SSHD镜像

3.3.5、Dockerfile构建httpd镜像

3.3.6、Dockerfile构建nginx镜像

3.3.7、Dockerfile构建Apache镜像

3.3.8、Dockerfile构建Tomcat镜像

3.3.9、Dockerfile构建MySQL镜像

3.3.10、Dockerfile构建LNMP镜像


一、镜像概述

        Docker 镜像是Docker容器技术中的核心,也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行,在Docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。

        如果想要把已经安装的服务容器进行迁移,就需要把环境以及部署的服务生成新的镜像。

程序打包方式:

  1. 打包成Tar包
  2. 打包成rpm包
  3. 打包成镜像

二、镜像构建方式

1、基于已有的容器创建镜像

2、基于本地模板创建镜像

3、基于Dockerfile创建镜像

三、镜像构建案例

3.1、基于已有容器创建镜像

        基于现有镜像创建主要使用 docker commit 命令,即把一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像。

命令格式:

docker commit [选项] 容器ID/名称 仓库名称:[标签] 

常用选项:

  1. -m 说明信息;
  2. -a 作者信息;
  3. -p 生成过程中停止容器的运行。

        首先启动一个镜像,在容器里做相应的修改,然后将修改后的容器提交为新的镜像。需要记住该容器的ID号。

[root@localhost ~]# docker run -it centos:7 /bin/bash[root@34343130893c /]# touch zhang[root@34343130893c /]# ls  bin   dev  fastboot  lib    lost+found  mnt  proc  run   srv  tmp  var
boot  etc  home      lib64  media       opt  root  sbin  sys  usr  zhang[root@34343130893c /]# exitexit[root@localhost ~]# docker commit -m"crushlinux test images" -a "zhang" 34343130893c centos7:newsha256:aea5eeaa0c754e637272d7e6f84c863efa16cffd7df2885db00a582c1f70bb25[root@localhost ~]# docker images centos7:newREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos7      new       aea5eeaa0c75   10 seconds ago   589MB[root@localhost ~]# docker run -it centos7:new /bin/bash[root@f89114733c9c /]# ls -l zhang     -rw-r--r--. 1 root root 0 Aug  2 07:57 zhang

3.2基于本地模板创建镜像

通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为 Index of /template/precreated。

下面是使用docker导入命令将下载的centos模板压缩包导入为本地镜像的例子。

[root@docker ~]# wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz[root@docker ~]# ls -l centos-7-x86_64.tar.gz -rw-r--r-- 1 root root 221692852 Jun 24  2016 centos-7-x86_64.tar.gz[root@localhost ~]# cat centos-7-x86_64.tar.gz.1 | docker import - centos:testsha256:3ce29162069990fd00c1bfcffdf68462a5af93c90139c97a9cb3f720cc153bc5[root@localhost ~]# docker images centos:testREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       test      3ce291620699   22 seconds ago   589MB

        导入完成后,会返回生成镜像的 ID 信息。查看本地镜像列表时,可以看到新创建的镜像信息。

3.3、基于Dockerfile构建镜像

3.3.1、Docker 镜像结构

        镜像并不是一个单一的文件,而是由多层堆叠构成。可以通过docker history 命令查看镜像中各层的内容和大小,每层对应着Dockerfile 构建时的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>目录中。容器其实是在镜像的最上面加了一层读写层,在运行容器中做的任何文件改动,最终都会写到这个读写层。如果删除了容器,也就是删除了这个读写层,文件改动也就会丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

Docker镜像特点:

  1. Dockerfile中的每个指令都会创建一个新的镜像层;
  2. 镜像层可以被缓存和复用;
  3. 当Dockerfile中的指令被修改、复制的文件发生变化或者构建镜像时指定的变量值更换了,那么对应的镜像层缓存也将会失效;
  4. 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
  5. 镜像层是不可变的,如果在某一层中添加一个文件,然后在某一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker容器中不可见了。

3.3.2Dockerfile介绍

        Dockerfile是一种可以被Docker程序解释的脚本,Dockerfile由多条的指令堆叠组成,每条指令都对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译成真正的Linux 命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于源码软件中的Makefile。Docker程序将读取Dockerfile并根据指令生成定制的镜像。

        Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了Dockerfile当有定制额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成镜像即可。

 

         Dockerfile 结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

3.3.3Dockerfile详解

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

1、FROM 镜像:Tag

构建指令,必须指定且需要在Dockerfile文件中其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。

2、MAINTAINER 作者信息

构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。

4、RUN 命令    

构建指令,RUN可以运行任何被基础image支持的命令并提交到新的镜像中。如基础image选择ubuntu,那么软件管理部分只能使用ubuntu的命令。

5、CMD [“要运行的程序” , ”参数1” , ”参数2”]

设置指令,用于container(容器)启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次(最后一行),如果有多个CMD命令,则只执行最后一条。

6、ENTRYPOINT(设置container启动时执行的操作)

设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。

7、USER 用户名/UID

设置指令,设置启动容器的用户,默认是root用户。

8、EXPOSE 端口

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不使用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

9、ENV 环境变量 变量值

构建指令,在image中设置一个环境变量。

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:ENV JAVA_HOME /usr/local/java

10、ADD 源文件 目标文件

构建指令,ADD命令相对于COPY命令,可以解压缩文件并把它们添加到镜像中的功能,如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行 COPY 命令呢?当然不需要!我们可以通过 ADD 命令一次搞定。

同时ADD还可以从 url 拷贝文件到镜像中,但官方不推荐这样使用,官方建议我们当需要从远程复制文件时,最好使用 curl 或 wget 命令来代替 ADD 命令。原因是,当使用 ADD 命令时,会创建更多的镜像层,当然镜像的 size 也会更大,所以ADD命令官方推荐只有在解压缩文件并把它们添加到镜像中时才需要。

11、COPY 源文件 目标文件

COPY命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中,对于目录而言,该命令只复制目录中的内容而不包含目录自身

12、VOLUME  [“目录”]

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

13、WORKDIR 目录

设置指令相当于cd命令,为后续RUN,CMD,ENTRYPOINT指定工作目录。

14、ONBUILD 命令

指定所生产的镜像作为一个基础镜像时所要运行的命令

15、HEALTHCHECK

健康检查

在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令指定启动容器时要运行的命令操作。

3.3.4Dockerfile构建SSHD镜像

        基于Dockerfile制作镜像时首先需要建立工作目录,作为生成镜像的工作目录,然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。

[root@docker ~]# iptables -F
[root@docker ~]# setenforce 0
[root@docker ~]# systemctl stop firewalld

关闭DNS地址

[root@localhost ~]# cat /etc/resolv.conf# Generated by NetworkManager
search localdomain
nameserver 8.8.8.8[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33DNS1=8.8.8.8[root@localhost ~]# systemctl restart network[root@localhost ~]# systemctl restart docker

导入基础镜像

[root@localhost ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7
sha256:4f7ecce531315a6f09ae66026dc0ef38704f442b27c5b6f5a0432d74f3b2bf2c

建立工作目录

[root@localhost ~]# mkdir sshd[root@localhost ~]# ssh-keygenGenerating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:acYOwtr5UwxqTt4UXykNqxelbcVKgt1ekO6i5G+30js root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|       o ..+     |
|      . + = +    |
|         % =     |
|   .  o.=.X      |
|    o..*S*       |
|   o+o+=* .      |
|  .=o= +.o       |
|    o.= o E      |
|      .+.oo+     |
+----[SHA256]-----+[root@localhost ~]# cp .ssh/id_rsa.pub sshd/[root@localhost ~]# cd sshd

编写Dockerfile文件

[root@localhost sshd]# vim Dockerfile#基于的基础镜像
FROM centos:7#镜像作者信息
MAINTAINER Crushlinux <crushlinux@163.com>#镜像执行的命令
RUN yum -y install openssh-server net-tools openssh-devel lsof telnet
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ADD id_rsa.pub /root/.ssh/authorized_keys#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#开启 22 端口
EXPOSE 22#启动容器时执行指令
CMD ["/usr/sbin/sshd" , "-D"][root@localhost sshd]# lsDockerfile  id_rsa.pub

构建镜像

[root@localhost sshd]# docker build -t sshd:new .[+] Building 76.3s (12/12) FINISHED                                                 docker:default=> [internal] load .dockerignore                                                             0.0s=> => transferring context: 2B                                                               0.0s=> [internal] load build definition from Dockerfile                                          0.0s=> => transferring dockerfile: 661B                                                          0.0s=> [internal] load metadata for docker.io/library/centos:7                                   0.0s=> [1/7] FROM docker.io/library/centos:7                                                     0.0s=> [internal] load build context                                                             0.0s=> => transferring context: 507B                                                             0.0s=> [2/7] RUN yum -y install openssh-server net-tools openssh-devel lsof telnet              74.4s=> [3/7] RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config                          0.3s=> [4/7] RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key                                  0.3s => [5/7] RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key                                  0.3s => [6/7] ADD id_rsa.pub /root/.ssh/authorized_keys                                           0.0s => [7/7] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                         0.2s => exporting to image                                                                        0.7s => => exporting layers                                                                       0.7s=> => writing image sha256:177c3f1dadb60c3b1140d3548c79c778ab6fc2edd6fea33c51a5abb68ef46f94  0.0s=> => naming to docker.io/library/sshd:new                                                   0.0s[root@localhost sshd]# docker images sshd:newREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
sshd         new       177c3f1dadb6   45 seconds ago   820MB

测试容器

[root@localhost sshd]# docker run -d -p 2222:22 --name sshd-test --restart=always sshd:newe3d34cb2eb46e403eaeb5b19276f47fbaac4b1fcbf8e8bc876f07de1e003e900[root@localhost sshd]# ssh localhost -p 2222The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
RSA key fingerprint is SHA256:hO4MQtZzkyhj5i4s/TuV5lyiDKxCbe+6bD+qk7tkkR4.
RSA key fingerprint is MD5:2e:05:bb:f2:fb:83:8e:c8:18:a4:b1:3d:cc:d7:d6:85.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:2222' (RSA) to the list of known hosts.[root@e3d34cb2eb46 ~]# 

3.3.5Dockerfile构建httpd镜像

建立工作目录

[root@localhost ~]# mkdir httpd
[root@localhost ~]# cd httpd/

编写Dockerfile文件

[root@docker httpd]# vim DockerfileFROM centos:7
MAINTAINER Crushlinux <crushlinux@163.com>RUN yum -y install httpd
RUN echo "crushlinux" >/var/www/html/index.html
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeEXPOSE 80
CMD ["httpd","-DFOREGROUND"]

构建镜像

[root@localhost httpd]# docker build -t httpd:new .[+] Building 39.4s (8/8) FINISHED                                                   docker:default=> [internal] load build definition from Dockerfile                                          0.0s=> => transferring dockerfile: 330B                                                          0.0s=> [internal] load .dockerignore                                                             0.0s=> => transferring context: 2B                                                               0.0s=> [internal] load metadata for docker.io/library/centos:7                                   0.0s=> CACHED [1/4] FROM docker.io/library/centos:7                                              0.0s=> [2/4] RUN yum -y install httpd                                                           38.1s=> [3/4] RUN echo "crushlinux" >/var/www/html/index.html                                     0.4s=> [4/4] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                         0.2s => exporting to image                                                                        0.7s => => exporting layers                                                                       0.7s => => writing image sha256:14e0aee71507c7bc47d02910d884f2ba6ff010df6b93f1804a156c178dde5f12  0.0s => => naming to docker.io/library/httpd:new                                                  0.0s [root@localhost httpd]# docker images httpdREPOSITORY   TAG       IMAGE ID       CREATED              SIZE
httpd        new       14e0aee71507   About a minute ago   818MB

测试容器

[root@localhost httpd]# docker run -d -p 801:80 --name httpd-test --restart=always httpd:newaf87d01f73e443145b557c9b2f5f4a7fc59d57911144e6954243f98839f03ca2

3.3.6Dockerfile构建nginx镜像

建立工作目录

[root@localhost ~]# mkdir nginx[root@localhost ~]# cd nginx/

编写Dockerfile文件

[root@localhost nginx]# vim run.sh#!/bin/bash
/usr/local/nginx/sbin/nginx[root@localhost nginx]# vim Dockerfile#基于的基础镜像
FROM centos:7#镜像作者信息
MAINTAINER Crushlinux <crushlinux@163.com>#安装相关依赖包
RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel#下载并解压nginx源码包
RUN wget http://nginx.org/download/nginx-1.19.0.tar.gz && tar zxf nginx-1.19.0.tar.gz#编译安装nginx
RUN cd nginx-1.19.0 && ./configure --prefix=/usr/local/nginx && make && make install#开启 80 和 443 端口
EXPOSE 80#修改 Nginx 配置文件,以非 daemon 方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#复制服务启动脚本并设置权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh#启动容器时执行脚本
CMD ["/run.sh"] 

构建镜像

[root@localhost nginx]# docker build -t nginx:new .[+] Building 213.8s (13/13) FINISHED                                                docker:default=> [internal] load build definition from Dockerfile                                          0.0s=> => transferring dockerfile: 884B                                                          0.0s=> [internal] load .dockerignore                                                             0.0s=> => transferring context: 2B                                                               0.0s=> [internal] load metadata for docker.io/library/centos:7                                   0.0s=> CACHED [1/8] FROM docker.io/library/centos:7                                              0.0s=> [internal] load build context                                                             0.0s=> => transferring context: 133B                                                             0.0s=> [2/8] RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-de  192.4s=> [3/8] RUN wget http://nginx.org/download/nginx-1.19.0.tar.gz && tar zxf nginx-1.19.0.tar  4.7s=> [4/8] RUN cd nginx-1.19.0 && ./configure --prefix=/usr/local/nginx && make && make inst  14.3s => [5/8] RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf                            0.2s => [6/8] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                         0.2s => [7/8] ADD run.sh /run.sh                                                                  0.0s => [8/8] RUN chmod 775 /run.sh                                                               0.2s => exporting to image                                                                        1.7s => => exporting layers                                                                       1.7s => => writing image sha256:5d99f1af2c29dcbd2905194921e00ad167c7831d79bc7201530698e872b68cc6  0.0s=> => naming to docker.io/library/nginx:new                                                  0.0s[root@localhost nginx]# docker images nginx:newREPOSITORY   TAG       IMAGE ID       CREATED              SIZE
nginx        new       5d99f1af2c29   About a minute ago   1.1GB

测试容器

[root@localhost nginx]# docker run -d -p 802:80 --name nginx-test --restart=always nginx:new4333cb30aa0710b19a26c33cadf0d7edf09ba096f9a857178a510e8b3c2e7544

3.3.7Dockerfile构建Apache镜像

建立工作目录

[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/

 编写Dockerfile文件

#基于的基础镜像
FROM centos:7#镜像作者信息
MAINTAINER Crushlinux <crushlinux@163.com>#安装相关依赖包
RUN yum install -y wget net-tools zlib make openssl-devel apr apr-util apr-util-devel gcc gcc-c++ pcre-devel zlib-devel#下载并解压apache源码包
RUN wget https://downloads.apache.org/httpd/httpd-2.4.57.tar.gz && tar zxf httpd-2.4.57.tar.gz#编译安装apache
RUN cd httpd-2.4.57 && ./configure --prefix=/usr/local/apache && make && make install#开启 80 和 443 端口
EXPOSE 80#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#启动容器时执行脚本
CMD ["-D","FOREGROUND"]
ENTRYPOINT ["/usr/local/apache/bin/apachectl"]

 构建镜像

[root@localhost apache]# docker build -t apache:new .[+] Building 1355.0s (9/9) FINISHED                                                       docker:default=> [internal] load .dockerignore                                                                   0.0s=> => transferring context: 2B                                                                     0.0s=> [internal] load build definition from Dockerfile                                                0.0s=> => transferring dockerfile: 792B                                                                0.0s=> [internal] load metadata for docker.io/library/centos:7                                        15.6s=> CACHED [1/5] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe  0.0s=> [2/5] RUN yum install -y wget net-tools zlib make openssl-devel apr apr-util apr-util-devel   100.0s=> [3/5] RUN wget https://downloads.apache.org/httpd/httpd-2.4.57.tar.gz && tar zxf httpd-2.4.  1195.4s=> [4/5] RUN cd httpd-2.4.57 && ./configure --prefix=/usr/local/apache && make && make install    42.4s => [5/5] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                               0.2s => exporting to image                                                                              1.3s => => exporting layers                                                                             1.3s => => writing image sha256:be6218038cf6c949bb9ca734557e8883ab077abc0526d49798566ce36e864967        0.0s => => naming to docker.io/library/apache:new                 [root@localhost apache]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
apache       new       be6218038cf6   36 seconds ago   632MB

 测试容器

[root@localhost apache]# docker run -d -p 802:80 --name apache-test --restart=always apache:new
a254060199388e86c6f65231c96bb1ba900df06e0349ad67480a9f67664a4e85[root@localhost apache]# docker ps -aCONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS                                 NAMESa25406019938   apache:new   "/usr/local/apache/b…"   7 seconds ago   Up 7 seconds   0.0.0.0:802->80/tcp, :::802->80/tcp   apache-test

 

3.3.8Dockerfile构建Tomcat镜像

建立工作目录

[root@localhost ~]# mkdir tomcat[root@localhost ~]# cd tomcat/[root@localhost tomcat]# tar xf jdk-8u191-linux-x64.tar.gz [root@localhost tomcat]# tar xf apache-tomcat-8.5.40.tar.gz [root@localhost tomcat]# lsapache-tomcat-8.5.40  apache-tomcat-8.5.40.tar.gz  jdk1.8.0_191  jdk-8u191-linux-x64.tar.gz

编写Dockerfile文件

[root@localhost tomcat]# vim DockerfileFROM centos:7
MAINTAINER Crushlinux <crushlinux@163.com> ADD jdk1.8.0_191 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jarADD apache-tomcat-8.5.40 /usr/local/tomcat
RUN chmod 755 /usr/local/tomcat/bin/startup.sh
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeEXPOSE 8080CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

构建镜像

[root@localhost tomcat]# docker build -t tomcat:new .[+] Building 5.8s (10/10) FINISHED                                                  docker:default=> [internal] load build definition from Dockerfile                                          0.0s=> => transferring dockerfile: 655B                                                          0.0s=> [internal] load .dockerignore                                                             0.0s=> => transferring context: 2B                                                               0.0s=> [internal] load metadata for docker.io/library/centos:7                                   0.0s=> CACHED [1/5] FROM docker.io/library/centos:7                                              0.0s=> [internal] load build context                                                             2.9s=> => transferring context: 410.87MB                                                         2.9s=> [2/5] ADD jdk1.8.0_191 /usr/local/java                                                    0.9s=> [3/5] ADD apache-tomcat-8.5.40 /usr/local/tomcat                                          0.1s=> [4/5] RUN chmod 755 /usr/local/tomcat/bin/startup.sh                                      0.2s=> [5/5] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                         0.3s=> exporting to image                                                                        1.3s=> => exporting layers                                                                       1.3s=> => writing image sha256:c5c9b935446d83580c018dab9e006c80fea98527aec5ca7a645fe7f65e6c7d59  0.0s=> => naming to docker.io/library/tomcat:new                                                 0.0s[root@localhost tomcat]# docker images tomcat:newREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat       new       c5c9b935446d   24 seconds ago   1e+03MB

测试容器

[root@localhost tomcat]# docker run -d -p 8080:8080 --name tomcat-test --restart=always tomcat:new4fd46fee151ddfaac8f4d5df621cf661e7256ee7d4eb9d3c3059c3d3e58ca406

3.3.9Dockerfile构建MySQL镜像

 建立工作目录

[root@localhost ~]# mkdir mysql
[root@localhost ~]# cd mysql/

 编写Dockerfile文件

[root@docker mysql]# vim Dockerfile FROM centos:7
MAINTAINER Crushlinux <crushlinux@163.com>#安装mariadb数据库
RUN yum install -y mariadb mariadb-server mariadb-devel #设置环境变量,便于管理
ENV MARIADB_USER root
ENV MARIADB_PASS 123456#让容器支持中文
ENV LC_ALL en_US.UTF-8#初始化数据库
ADD db_init.sh /root/db_init.sh
RUN chmod 775 /root/db_init.sh && /root/db_init.sh#导出端口
EXPOSE 3306#设置默认启动命令
CMD ["mysqld_safe"][root@localhost mysql]# cat db_init.sh#!/bin/bash
mysql_install_db --user=mysql
sleep 3
mysqld_safe &
sleep 3
mysql -e "use mysql; grant all privileges on *.* to '$MARIADB_USER'@'%' identified by '$MARIADB_PASS' with grant option;"
h=$(hostname)
mysql -e "use mysql; update user set password=password('$MARIADB_PASS') where user='$MARIADB_USER' and host='$h';"
mysql -e "flush privileges;"

 构建镜像

[root@localhost mysql]# docker build -t mysql:new .[+] Building 75.6s (9/9) FINISHED                                        docker:default=> [internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 546B                                               0.0s=> [internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                    0.0s=> [internal] load metadata for docker.io/library/centos:7                       15.3s=> CACHED [1/4] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b  0.0s=> [internal] load build context                                                  0.0s=> => transferring context: 451B                                                  0.0s=> [2/4] RUN yum install -y mariadb mariadb-server mariadb-devel                 50.3s=> [3/4] ADD db_init.sh /root/db_init.sh                                          0.1s=> [4/4] RUN chmod 775 /root/db_init.sh && /root/db_init.sh                       8.4s => exporting to image                                                             1.2s => => exporting layers                                                            1.2s => => writing image sha256:a85df087507fc901c1ebc986024362ff0a44dc00a32621cc0dc3b  0.0s => => naming to docker.io/library/mysql:new                                       0.0s [root@localhost mysql]# docker run -d -p 3306:3306 --name mysql --restart=always mysql:new                                                                                      760e048d28415fa333d589e55583609725c99665cfb83768c7c3a79d34d7f172

测试容器

[root@localhost mysql]# yum -y install mariadb mariadb-devel[root@localhost mysql]# mysql -h 192.168.2.118 -u root -P 3306 -p123456Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> 

3.3.10、Dockerfile构建LNMP镜像

建立工作目录

[root@localhost ~]# mkdir lnmp/
[root@localhost ~]# cd lnmp/
[root@localhost lnmp]# 

编写Dockerfile文件

[root@docker lnmp]# vim Dockerfile#基础镜像
FROM centos:7#维护该镜像的用户信息
MAINTAINER Crushlinux <crushlinux@163.com> #配置Nginx 的YUM 源
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm #安装nginx
RUN yum -y install nginx#安装mysql 和php
RUN rpm --rebuilddb && yum -y install mariadb-devel mariadb-server mariadb php php-fpm#修改nginx 配置文件,使之支持PHP
ADD default.conf /etc/nginx/conf.d/default.conf#修改php-fpm 配置文件允许nginx 访问
RUN sed -i '/^user/s/apache/nginx/g' /etc/php-fpm.d/www.conf
RUN sed -i '/^group/s/apache/nginx/g' /etc/php-fpm.d/www.conf#设置环境变量,便于管理
ENV MARIADB_USER root
ENV MARIADB_PASS 123456#mysql 数据库授权
ADD db_init.sh /root/db_init.sh
RUN chmod 775 /root/db_init.sh
RUN /root/db_init.sh#添加测试页面
ADD index.php /usr/share/nginx/html/index.php#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#分别开启80 端口,443 端口,9000 端口,3360 端口
EXPOSE 80
EXPOSE 9000
EXPOSE 3306#复制脚本,设置权限,启动容器时启动该脚本
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"][root@localhost lnmp]# cat db_init.sh #!/bin/bash
/usr/bin/mysql_install_db --user=mysql
sleep 3
/usr/bin/mysqld_safe &
sleep 3
mysql -e "use mysql; grant all privileges on *.* to '$MARIADB_USER'@'%' identified by '$MARIADB_PASS' with grant option;"
h=$(hostname)
mysql -e "use mysql; update user set password=password('$MARIADB_PASS') where user='$MARIADB_USER' and host='$h';"
mysql -e "flush privileges;"[root@localhost lnmp]# cat index.php <?php
phpinfo();
?>[root@localhost lnmp]# cat default.conf server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.php index.htm;}location ~ \.php$ {root           /usr/share/nginx/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;include        fastcgi_params;}
}[root@docker lnmp]# vim run.sh #!/bin/bash
/usr/sbin/nginx && /usr/sbin/php-fpm && /usr/bin/mysqld_safe

 构建镜像

[root@localhost lnmp]# docker build -t lnmp:new .[+] Building 289.5s (19/19) FINISHED                                     docker:default=> [internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 1.29kB                                             0.0s=> [internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                    0.0s=> [internal] load metadata for docker.io/library/centos:7                       15.5s=> CACHED [ 1/14] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be3  0.0s=> [internal] load build context                                                  0.0s=> => transferring context: 1.31kB                                                0.0s=> [ 2/14] RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-rel  3.5s=> [ 3/14] RUN yum -y install nginx                                             164.5s=> [ 4/14] RUN rpm --rebuilddb && yum -y install mariadb-devel mariadb-server m  88.3s => [ 5/14] ADD default.conf /etc/nginx/conf.d/default.conf                        0.1s => [ 6/14] RUN sed -i '/^user/s/apache/nginx/g' /etc/php-fpm.d/www.conf           1.4s => [ 7/14] RUN sed -i '/^group/s/apache/nginx/g' /etc/php-fpm.d/www.conf          1.5s => [ 8/14] ADD db_init.sh /root/db_init.sh                                        0.1s => [ 9/14] RUN chmod 775 /root/db_init.sh                                         1.3s => [10/14] RUN /root/db_init.sh                                                   8.7s => [11/14] ADD index.php /usr/share/nginx/html/index.php                          0.1s=> [12/14] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime            1.3s => [13/14] ADD run.sh /run.sh                                                     0.1s => [14/14] RUN chmod 775 /run.sh                                                  1.3s => exporting to image                                                             1.5s => => exporting layers                                                            1.5s => => writing image sha256:6a083184147765140594482eb4daca6bfa30be76673ce9f40850f  0.0s=> => naming to docker.io/library/lnmp:new                                        0.0s[root@localhost lnmp]# docker images lnmpREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
lnmp         new       6a0831841477   43 seconds ago   905MB

测试容器

[root@localhost lnmp]# docker ps -a CONTAINER ID   IMAGE        COMMAND                   CREATED          STATUS          PORTS                                       NAMES
760e048d2841   mysql:new    "mysqld_safe"             24 minutes ago   Up 24 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql
a25406019938   apache:new   "/usr/local/apache/b…"   6 hours ago      Up 6 hours      0.0.0.0:802->80/tcp, :::802->80/tcp         apache-test[root@localhost lnmp]# docker rm -f $(docker ps -qa)760e048d2841
a25406019938[root@localhost lnmp]# docker run -d -p 80:80 -p 3306:3306 -p 9000:9000 --name lnmp --restart=always lnmp:new36462df3f0c37621da19fc6c37127bf2bebdf6836bde16cd9c66abaf2b31f6ff

 

 3.3.11、Dockerfile构建Redis镜像

 建立工作目录

[root@localhost ~]# mkdir redis
[root@localhost ~]# cd redis/
[root@localhost redis]# 

编写Dockerfile文件

[root@docker redis]# vim Dockerfile FROM centos:7
MAINTAINER Crushlinux <crushlinux@163.com>RUN yum -y install epel-release && yum -y install redis
RUN sed -i -e 's@bind 127.0.0.1@bind 0.0.0.0@g' /etc/redis.conf
RUN sed -i -e 's@protected-mode yes@protected-mode no@g' /etc/redis.conf
RUN echo "requirepass 123456" >> /etc/redis.confRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 6379CMD [ "/usr/bin/redis-server","/etc/redis.conf"]

构建镜像

[root@localhost redis]# docker build -t redis:new .[+] Building 564.3s (10/10) FINISHED                                     docker:default=> [internal] load build definition from Dockerfile                               0.0s=> => transferring dockerfile: 522B                                               0.0s=> [internal] load .dockerignore                                                  0.0s=> => transferring context: 2B                                                    0.0s=> [internal] load metadata for docker.io/library/centos:7                       17.3s=> CACHED [1/6] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b  0.0s=> [2/6] RUN yum -y install epel-release && yum -y install redis                541.6s=> [3/6] RUN sed -i -e 's@bind 127.0.0.1@bind 0.0.0.0@g' /etc/redis.conf          1.6s=> [4/6] RUN sed -i -e 's@protected-mode yes@protected-mode no@g' /etc/redis.con  0.9s => [5/6] RUN echo "requirepass 123456" >> /etc/redis.conf                         1.0s => [6/6] RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime              1.0s => exporting to image                                                             0.7s => => exporting layers                                                            0.7s => => writing image sha256:36158da4a29d214375266e4fc5f02397e1bca9b06ef25cc0d8b7f  0.0s=> => naming to docker.io/library/redis:new                                       0.0s[root@localhost redis]# docker images redis:newREPOSITORY   TAG       IMAGE ID       CREATED          SIZE
redis        new       36158da4a29d   47 seconds ago   459MB

测试容器

[root@localhost redis]# docker run -d -p 6379:6379 --name redis --restart=always redis:n
ew8b4175bc1627d50c3dd814168efcdbb3e7fea0d63835a8ea994f99addb53f2d7[root@localhost redis]# yum -y install redis[root@localhost redis]# redis-cli -h localhost -a 123456localhost:6379> exit[root@localhost redis]# 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clickhouse断电重启故障解决方案

业务场景 公司的一个日志系统用到了clickhouse。一线运维反映说有个生产环境因为异常断电造成服务器重启。在执行日志系统的启动脚本时&#xff0c;一直报clickhouse启动不起来&#xff0c;日志系统无法使用。 问题排查 通过阅读启动脚本代码&#xff0c;以及启动日志系统&a…

1.1k star,推荐一款程序员摸鱼神器

如果你在搬砖的过程中&#xff0c;想要看书、听歌、看图、看漫画等等&#xff0c;那么我建议你看下这个软件&#xff0c;之前也有推荐过&#xff0c;目前新的版本功能做了完善。 不过有个尴尬的点就是&#xff0c;作者增加了会员功能&#xff0c;但是对于基本使用还是没问题的…

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…

Go学习第五天

Golang中面向对象类的表示与封装 package mainimport "fmt"// 如果类名首字母大写&#xff0c;表示其他包也能够访问 type Hero struct {// 如果类的属性首字母大写&#xff0c;表示该属性是对外能够访问的&#xff0c;否则的话只能够类的内部访问Name stringAd …

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

webpack基础知识四:说说webpack中常见的Plugin?解决了什么问题?

一、是什么 Plugin&#xff08;Plug-in&#xff09;是一种计算机应用程序&#xff0c;它和主应用程序互相交互&#xff0c;以提供特定的功能 是一种遵循一定规范的应用程序接口编写出来的程序&#xff0c;只能运行在程序规定的系统下&#xff0c;因为其需要调用原纯净系统提供…

TCP的三次握手和四次挥手······详解

1、三次握手 三次握手是建立连接的过程 如图大致为三次握手的流程图&#xff1a; 当客户端对服务端发起连接时&#xff0c;会先发一个包连接请求数据&#xff0c;去询问能否建立连接&#xff0c;该数据包称为 “SYN”包 然后&#xff0c;如果对方同意连接&#xff0c;那么…

【新版系统架构补充】-传输介质、子网划分

传输介质 双绞线&#xff1a;无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;传输距离在100m内 网线安装标准&#xff1a; 光纤&#xff1a;由纤芯和包层组成&#xff0c;分多模光纤MMF、单模光纤SMF 无线信道&#xff1a;分为无线电波和红外光波 通信方式和交换方式 单工…

目标检测与跟踪 (1)- 机器人视觉与YOLO V8

目录 1、研究背景 2. 算法原理及对比 2.1 点对特征&#xff08;Point Pairs&#xff09; 2.2 模板匹配 2.3 霍夫森林 2.4 深度学习 3、YOLO家族模型演变 4、YOLO V8 1、研究背景 机器人视觉识别技术是移动机器人平台十分关键的技术&#xff0c;代表着机器人智能化、自动化…

台灯应该买什么样的才能护眼?教大家如何挑选护眼灯

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 护眼台灯怎么样选择 1、照度级别 台灯照度级别分为 A 级和 AA 级。…

【从零开始学习JAVA | 三十九篇】深入多线程

目录 前言&#xff1a; ​1.线程的寿命周期​ 2.线程的安全问题 3.锁 同步代码块&#xff1a; 同步方法&#xff1a; 死锁&#xff1a; 4.生产者和消费者模式&#xff08;等待唤醒机制&#xff09; 总结&#xff1a; 前言&#xff1a; 当今软件开发领…

图解SQL基础知识,小白也能看懂的SQL文章

本文介绍关系数据库的设计思想&#xff1a;在 SQL 中&#xff0c;一切皆关系。 在计算机龄域有许多伟大的设计理念和思想&#xff0c;例如&#xff1a; 在 Unix 中&#xff0c;一切皆文件。在面向对象的编程语言中&#xff0c;一切皆对象。 关系数据库同样也有自己的设计思想&a…

Element-plus中tooltip 提示框修改宽度——解决方案

tooltip 提示框修改宽度方法&#xff1a; 在element中&#xff0c;想要设置表格的内容&#xff0c;超出部分隐藏&#xff0c;鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…

【git技巧】什么是 .gitkeep

.gitkeep 文件的作用 就是——使 Git 保留一个空文件夹&#xff01; Git 是一个文件追踪系统&#xff0c;这也导致了 Git 的设计初衷是对文件进行追踪&#xff0c;所以&#xff0c;Git 不会追踪一个空目录。 但是&#xff0c;在某些情况下&#xff0c;我们确实是需要保留一些…

Grafana集成prometheus(2.Grafana安装)

查找镜像 docker search grafana下载指定版本 docker pull grafana/grafana:10.0.1启动容器脚本 docker run -d -p 3000:3000 --namegrafana grafana/grafana:10.0.1查看是否启动 docker ps防火墙开启 检查防火墙3000端口是否开启 默认用户及密码 admin/admin 登录 ht…

无涯教程-Perl - last 语句函数

当在循环内遇到 last 语句时&#xff0c;循环立即终止&#xff0c;程序控制在循环后的下一条语句处恢复。您可以为LABEL提供最后一个语句&#xff0c;其中LABEL是循环的标签。 last 语句可以在嵌套循环内使用&#xff0c;如果未指定LABEL&#xff0c;则该语句将适用于最近的循环…

SpringBoot实现数据库读写分离

SpringBoot实现数据库读写分离 参考博客https://blog.csdn.net/qq_31708899/article/details/121577253 实现原理&#xff1a;翻看AbstractRoutingDataSource源码我们可以看到其中的targetDataSource可以维护一组目标数据源(采用map数据结构)&#xff0c;并且做了路由key与目标…

HCIP---OSPF的优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.汇总&#xff1a; 目的&#xff1a;减少骨干区域的LSA的更新量 作用&#xff1a;OSPF的…

CI/CD—Docker初入门学习

1 docker 了解 1 Docker 简介 Docker 是基于 Go 语言的开源应用容器虚拟化技术。Docker的主要目标是build、ship and run any app&#xff0c;anywhere&#xff0c;即通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;达到应用组件级别的一次封装、到处运…