3.安装常用软件与Dockerfile

发布时间 2023-05-30 23:31:48作者: 22-10-21

5.安装常用软件

总体步骤

  1. 搜索镜像
  2. 拉取镜像
  3. 查看镜像
  4. 启动镜像
  5. 停止容器
  6. 删除容器

5.1.Tomcat安装

5.1.1.搜索镜像

docker search tomcat

image-20230530163032439

5.1.2.拉取镜像

最新版,这个版本有点问题,目前不建议使用
docker pull tomcat
8.0版本
docker pull billygoo/tomcat8-jdk8

image-20230530164617322

5.1.3.查看镜像

docker images billygoo/tomcat8-jdk8

image-20230530164637021

5.1.4.启动镜像

docker run -it -p 8080:8080 billygoo/tomcat8-jdk8;

image-20230530165705082

5.1.5.访问镜像

image-20230530165650755

5.2.Mysql安装

5.2.1.搜索镜像

docker search mysql

image-20230530165905838

5.2.2.拉取镜像

最新版
docker pull mysql
5.7版本
docker pull mysql:5.7

image-20230530170011753

5.2.3.查看镜像

docker images mysql:5.7

image-20230530170029604

5.2.4.启动镜像

启动并且设置密码为:123456
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

image-20230530170350466

5.2.5.测试启动

进入容器
docker exec -it ecbe48102416 /bin/bash
进入mysql
mysql -uroot -p

image-20230530170603286

连接测试

image-20230530171059524

image-20230530171026360

image-20230530171050282

当容器被删除后,mysql数据库的数据也会没有了!

5.2.6.实战版

①启动一个新的容器

docker run -d -p 3306:3306 --privileged=true -v /chenchen/mysql/log:/var/log/mysql -v /chenchen/mysql/data:/var/lib/mysql -v /chenchen/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
复制三个数据到主机,日志,数据和配置文件

image-20230530172121890

②新建my.cnf

image-20230530172342666

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

用于设置字符编码为UTF-8

image-20230530172314265

需要重新启动mysql

5.3.Redis安装

5.3.1.搜索镜像

docker search redis

image-20230530173234784

5.3.2.拉取镜像

docker pull redis

image-20230530173309125

5.3.3.查看镜像

docker images redis

image-20230530173321362

5.3.4.启动镜像

docker run -d -p 6379:6379 redis

image-20230530173452580

5.4.Redis集群配置

5.4.1.搭建集群

①搭建六台容器

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6661
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6662
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6663
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6664
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6665
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6666

image-20230530203438155

image-20230530204624284

参数解释:--cluster-enabled yes,开启redis集群

②进入一台容器

docker exec -it redis-node-1 /bin/bash

构建主从关系

redis-cli --cluster create localhost:6661 localhost:6662 localhost:6663 localhost:6664 localhost:6665 localhost:6666 --cluster-replicas 1

image-20230530203651884

③查看集群状态

redis-cli -p 6381
cluster info
cluster nodes

5.4.2.数据读写存储

启动redis时添加一个参数,此时redis的操作就是集群的方式

redis-cli -p 端口 -c

5.4.3.主从扩容

新建两个节点(容器)并且启动,然后进入其中一台

将其中一台作为主机加入集群

redis-cli --cluster add-node ip地址:新主机容器端口号 ip地址:旧容器节点端口号

然后进行重新分配槽号

redis-cli --cluster reshard IP地址:旧容器节点端口号

给新增的主机分配从机

redis-cli --cluster add-node ip地址:新从机容器端口号 ip:新主机容器端口号 --cluster-slave --cluster-master-id 新主机节点(容器)ID

5.4.4.主从缩容

删除从机

redis-cli --cluster del-node ip:从机端口 从机节点ID

将主机的槽号清空并且重新分配

redis-cli --cluster reshard ip:要给哪个主机分配

删除主机

redis-cli --cluster del-node ip:主机端口 主机节点ID

6.DockerFile

6.1.介绍

官网:https://docs.docker.com/engine/reference/builder/

DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

image-20230530213350494

基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数指令
  2. 按照从上到下,顺序执行
  3. :表示注释

  4. 每条指令都会创建一个新的镜像层并对镜像进行提交

6.2.构建过程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

image-20230530223043158

1.Dockerfile:需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2.Docker镜像:在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

3.Docker容器,容器是直接提供服务的。

6.3.常用保留字指令

FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from。

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令,RUN是在docker build时运行,有两种格式

  1. shell格式:RUN <命令行命令>
  2. exec格式:RUN ["可执行文件","参数1","参数2"]

EXPOSE:当前容器对外暴露出的端口

WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV:用来在构建镜像过程中设置环境变量

  • ENV MY_PATH /usr/mytest
  • 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其它指令中直接使用这些环境变量,

ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中。

  • 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
  • COPY src dest
  • COPY ["src" , "dest"]
  • <src源路径>:源文件或者源目录
  • <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定容器启动后的要干的事情,CMD是在docker run时运行

  • CNMD指令的格式和RUN 相似,也是两种格式
    1. shell格式:CMD <命令>
    2. exec格式:CMD ["可执行文件","参数1","参数2"...]
    3. 参数列表格式: CMD ["参数1"","参数2"...]。在指定了ENTRYPOINT指令后,用CMD指定具体的参数。
  • Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTRYPOINT:用来指定一个容器启动时要运行的命令

  • 类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT 指令指定的程序
  • 如果 Dockerfile 中如果存在多个ENTRYPOINT 指令,仅最后一个生效
  • 在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。

6.4.自定义镜像

6.4.1.要求

让centos7镜像具备vim、ifconfig、jdk8这三个功能

6.4.2.编写

准备好一个Dockerfile文件,必须是大写的D,然后编写脚本

#从哪个镜像写
FROM centos
#作者以及邮箱
MAINTAINER chenchen<1053374309@qq.com>
#登录之后默认地址
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
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
#暴露端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

6.4.3.构建

docker build -t 新镜像名字:TAG .
注意,TAG的后面有个```空格.```

6.4.4.运行

docker run -it 新镜像名字:TAG

6.5.虚悬镜像

合库名、标签都是的镜像,俗称dangling image

查看虚悬镜像

docker image ls -f dangling=true

删除所有虚悬镜像

docker image prune

也可以使用删除镜像的方法删除

docker rmi -f 虚悬镜像id

虚悬镜像是没有任何价值,且会占用内存的垃圾文件

FROM ubuntu
MAINTAINER chenchen<1053374309@qq.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
RUN apt-get update
RUN apt-get install net-tools
#RUN apt-get install -y iproute2
#RUN apt-get install -y inetutils-ping
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "install inconfig cmd into ubuntu success--------------ok"
CMD /bin/bash