网站建设费算广告费吗,网站设计风格及色彩搭配技巧 -,网站如何做信息表,wap 在线一、Dockerfile概念
Dockerfile 是一个文本文件#xff0c;文件中包含了一条条的指令#xff08;instruction#xff09;#xff0c;用于构建镜像。每一条指定构建一层镜像#xff0c;因此每一条指令的内容#xff0c;就是描述该层镜像应当如何构建。 1、dockerfile是 自…一、Dockerfile概念
Dockerfile 是一个文本文件文件中包含了一条条的指令instruction用于构建镜像。每一条指定构建一层镜像因此每一条指令的内容就是描述该层镜像应当如何构建。 1、dockerfile是 自定义镜像 的一套规则 2、dockerfile由多条指令构成dockerfile的每一条指令都会对应于docker镜像中的每一层。 dockerfile的原理就是镜像分层 二、Docker 镜像的创建
创建镜像有三种方法分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。
1基于现有镜像创建
1首先启动一个镜像在容器里做修改
docker create -it centos:7 /bin/bash
docker ps -a 2然后将修改后的容器提交为新的镜像需要使用该容器的 ID 号创建新镜像
docker commit -m new -a centos 000550eb36da centos:test #常用选项 -m 说明信息 -a 作者信息 -p 生成过程中停止容器的运行。
docker images
-m new:说明是新创建的 -a centos:基于本地镜像centos创建 2基于本地模板创建
通过导入操作系统模板文件可以生成镜像模板可以从 OPENVZ 开源项目下载下载地址为http://openvz.org/Download/template/precreated
或 wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#导入为镜像 cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test 3基于Dockerfile 创建
unionFS是一种多个文件系统层叠在一起的形成单一的一个逻辑文件系统的技术也就是叠加。
例如有两块小容量的硬盘可以把他们挂载到同一目录下使用联合文件系统将他们组合成一个单位的逻辑文件系统(类似于逻辑文件系统)。
//联合文件系统UnionFS UnionFS(联合文件系统Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统它支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS (叠加)及 Devicemapper 都是一种 UnionFS。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承基于基础镜像没有父镜像可以制作各种具体的应用镜像。
特性一次同时加载多个文件系统但从外面看起来只能看到一个文件系统联合加载会把各层文件系统叠加起来这样最终的文件系统会包含所有底层的文件和目录。
我们下载的时候看到的一层层的就是联合文件系统。 三、镜像加载原理
3.1UnionFS结构 Docker的镜像实际上由一层一层的文件系统组成这种层级的文件系统就是UnionFS。 bootfs主要包含bootloader和kernelbootloader主要是引导加载kernelLinux刚启动时会加载bootfs文件系统。 在Docker镜像的最底层是bootfs这一层与我们典型的Linux/Unix系统是一样的包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了此时内存的使用权已由bootfs转交给内核此时系统也会卸载bootfs。 rootfs在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版比如Ubuntu,Centos等等。 我们可以理解成一开始内核里什么都没有操作一个命令下载debian这时就会在内核上面加了一层基础镜像再安装一个emacs会在基础镜像上叠加一层image接着再安装一个apache又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是此时的每一层rootfs都是read-only的我们此时还不能对其进行操作。当我们创建一个容器也就是将Docker镜像进行实例化系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。 总结
bootfs为镜像最底层引导加载宿主机的内核所有镜像运行的容器都是共享主机的内核。
rootfs在bootfs之上在内核上加了一层基础镜像提供了linux目录文件等运行环境这一层为镜像的初始每按装一个服务都会再叠加一层image这一层只能读。
当我们创建一个容器也就是将Docker镜像进行实例化系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs这时就可读可写。 3.2 为什么Docker里的centos的大小才200M 因为对于精简的OSrootfs可以很小只需要包含最基本的命令、工具和程序库就可以了因为底层直接用宿主机的kernel(内核)自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版bootfs基本是一致的rootfs会有差别因此不同的发行版可以公用bootfs。 四、Dockerfile
Docker镜像是一个特殊的文件系统除了提供容器运行时所需的程序、库、资源、配置等文件外还包含了一些为运行时准备的一些配置参数如匿名卷、环境变量、用户等。镜像不包含任何动态数据其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本用这个脚本来构建、定制镜像那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile是一个文本文件其内包含了一条条的指令(Instruction)每一条指令构建一层因此每一条指令的内容就是描述该层应当如何构建。有了Dockerfile当我们需要定制自己额外的需求时只需在Dockerfile上添加或者修改指令重新生成 image 即可 省去了敲命令的麻烦。
除了手动生成Docker镜像之外可以使用Dockerfile自动生成镜像。Dockerfile是由多条的指令组成的文件其中每条指令对应 Linux 中的一条命令Docker 程序将读取Dockerfile 中的指令生成指定镜像。
Dockerfile结构大致分为四个部分基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令每条指令可携带多个参数支持使用以“#“号开头的注释。 4.1、Docker 镜像结构的分层
镜像不是一个单一的文件而是有多层构成。容器其实是在镜像的最上面加了一层读写层在运行容器里做的任何文件改动都会写到这个读写层。如果删除了容器也就删除了其最上面的读写层文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
1Dockerfile 中的每个指令都会创建一个新的镜像层 2镜像层将被缓存和复用 3当Dockerfile 的指令修改了复制的文件变化了或者构建镜像时指定的变量不同了对应的镜像层缓存就会失效 4某一层的镜像缓存失效它之后的镜像层缓存都会失效 5镜像层是不可变的如果在某一层中添加一个文件然后在下一层中删除它则镜像中依然会包含该文件只是这个文件在 Docker 容器中不可见了。 4.2、Dockerfile 操作常用的指令
1FROM 镜像 指定新镜像所基于的基础镜像第一条指令必须为FROM 指令每创建一个镜像就需要一条 FROM 指令。 会问创建镜像需要from指令做构建怎么做构建。 答 FROM centos:7 其中centos:7就为基础镜像 2MAINTAINER 名字 说明新镜像的维护人信息(作者的信息谁写的) 3RUN 命令 在所基于的镜像上执行命令并提交到新的镜像中会叠加一层叠加的命令都会在其中。 安装一个应用创建一个文件都属于新的镜像因为叠加了一层。 cd cp ENTRYPOINT和RUN比较RUN的优先级高如果没有RUN那会使用ENTRYPOINT
4ENTRYPOINT [要运行的程序, 参数 1, 参数 2] 设定容器启动时第一个运行的命令及其参数。 可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。 ENTRYPOINT [rm, -rf, /*] CMD和ENTRYPOINT对比ENTRYPOINT的优先级高
5CMD [要运行的程序, 参数1, 参数2] 上面的是exec形式shell形式CMD 命令 参数1 参数2启动容器时默认执行的命令或者脚本Dockerfile只能有一条CMD命令。如果指定多条命令只执行最后一条命令。(也就是只能运行最后一条命令,也就是只能用一条) 如果在docker run时指定了命令或者镜像中有ENTRYPOINT那么CMD就会被覆盖。 CMD 可以为 ENTRYPOINT 指令提供默认参数。 ENTRYPOINT [rm] CMD [cp ,-rf,“*”] ENTRYPOINT的优先级比CMD的优先级高他会把下面的命令给覆盖掉这里的cp是无效的 java -jar xxxxxxx.jar 8090 docker run指定的命令----》ENTRYPOINT---》CMD docker run----》ENTRYPOINT---》CMD 优先级由大到小 6EXPOSE 端口号 指定新镜像加载到 Docker 时要开启的端口 EXPOSE 8090 7ENV 环境变量 变量值 设置一个环境变量的值会被后面的 RUN 使用 linxu PATH$PATH:/opt ENV PATH $PATH:/opt 8ADD 源文件/目录 目标文件/目录 也就是复制
将源文件复制到镜像中源文件要与 Dockerfile 位于相同目录中或者是一个 URL 有如下注意事项 1、如果源路径是个文件且目标路径是以 / 结尾 则docker会把目标路径当作一个目录会把源文件拷贝到该目录下。 如果目标路径不存在则会自动创建目标路径。 /home/ky26/zhaichen.txt /home/ky26/
2、如果源路径是个文件且目标路径是不以 / 结尾则docker会把目标路径当作一个文件。 如果目标路径不存在会以目标路径为名创建一个文件内容同源文件 如果目标文件是个存在的文件会用源文件覆盖它当然只是内容覆盖文件名还是目标文件名。 如果目标文件实际是个存在的目录则会源文件拷贝到该目录下。 注意这种情况下最好显示的以 / 结尾以避免混淆。 A B /home/ky26 /home/ky26 3、如果源路径是个目录且目标路径不存在则docker会自动以目标路径创建一个目录把源路径目录下的文件拷贝进来。 如果目标路径是个已经存在的目录则docker会把源路径目录下的文件拷贝到该目录下。
4、如果源文件是个归档文件压缩文件则docker会自动帮解压。 URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝都不会自动解压。 9COPY 源文件/目录 目标文件/目录 功能单一大部分会用ADD 只复制本地主机上的文件/目录复制到目标地点源文件/目录要与Dockerfile 在相同的目录中 10VOLUME [“目录”] 在容器中创建一个挂载点 11USER 用户名/UID 指定运行容器时的用户 12WORKDIR 路径 /home 为后续的 RUN、CMD、ENTRYPOINT 指定工作目录 13ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令。 当在一个Dockerfile文件中加上ONBUILD指令该指令对利用该Dockerfile构建镜像比如为A镜像不会产生实质性影响。 但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像比如为B镜像时这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了在构建B镜像的过程中首先会执行ONBUILD指令指定的指令然后才会执行其它指令。也就是会把所有的命令运行完之后再执行ONBUILD命令 OBuild rm - rf /* 注请各位自己在生产中如果有的是别的dockerfile 请自习阅读否则后果自付 14HEALTHCHECK 健康检查 4.3在编写 Dockerfile 时有严格的格式需要遵循
●第一行必须使用 FROM 指令指明所基于的镜像名称 ●之后使用 MAINTAINER 指令说明维护该镜像的用户信息 ●然后是镜像操作相关指令如 RUN 指令。每运行一条指令都会给基础镜像添加新的一层。 ●最后使用 CMD 指令指定启动容器时要运行的命令操作。 4.4Dockerfile 案例 --------Dockerfile 案例-------- #建立工作目录 mkdir /opt/apache cd /opt/apache vim Dockerfile #基于的基础镜像 FROM centos:7 #维护镜像的用户信息 MAINTAINER this is apache image hmj #镜像操作指令安装apache软件 RUN yum -y update RUN yum -y install httpd #开启 80 端口 EXPOSE 80 #复制网站首页文件 ADD index.html /var/www/html/index.html //方法一 #将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #启动容器时执行脚本 CMD [/run.sh] //方法二 ENTRYPOINT [ /usr/sbin/apachectl ] #启动时是后台启动启动完就退出了所以要加-D CMD [-D, FOREGROUND] #-D 前台启动 BACKGROUND 后台 FOREGROUND 前台 //准备执行脚本 vim run.sh #!/bin/bash rm -rf /run/httpd/* #清理httpd的缓存 /usr/sbin/apachectl -D FOREGROUND #指定为前台运行 #因为Docker容器仅在它的1号进程PID为1运行时会保持运行。如果1号进程退出了Docker容器也就退出了。 //准备网站页面 echo this is test web index.html //生成镜像 docker build -t httpd:centos . #注意别忘了末尾有. #在Dockerfile所在目录下构建新镜像 httpd:centos7 //新镜像运行容器 docker run -d -p 1234:80 httpd:centos #后台运行容器并暴露端口1234 这里的1234也可以随便取数字 //测试 http://192.168.88.10:1234/ ########如果有网络报错提示######## [Warning] IPv4 forwarding is disabled. Networking will not work. 解决方法 vim /etc/sysctl.conf net.ipv4.ip_forward1 sysctl -p systemctl restart network systemctl restart docker 五、Dockerfile总结(面试总结)
5.1 创建镜像
①、基于现有镜像创建
docker run创建并启动容器再通过docker exec/cp 等容器操作指令修改容器内容然后再去用docker commit提交成新的镜像。
②、基于本地模板创建
从网上下载现有的镜像模板或使用docker export 导出本地容器快照模板
docker import将快照导入成本地镜像。
③、Dockerfile构建镜像的创建 先用FROM指定基础镜像再用MAINTIANER指定维护人信息然后用RUN EXPOSE ADD
ENV USER等指令构建镜像的过程最后使用CMD命令或ENTRYPOINT指令启动容器时的执行命令。
注意优先级RUNENTRYPOINTCMD
如果在同一个dockerfile中存在ENTRYPOINT和CMD时ENTRYPOINT会覆盖CMD命令
CMD为ENTRYPOINT提供选项和参数。 5.2 ADD和COPY的区别
Dockerfile中的copy指令和add指令都可以将主机上的资源复制或加入到容器镜像中都是在构建镜像的过程中完成。
copy只能用于复制节省资源 ADD复制的同时如果复制的对象是压缩包ADD还可以解压比较消耗资源 COPY指令和ADD指令的唯一区别 在于是否支持远程URL获取资源COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中而ADD指令还支持通过URL从远程服务器赌球资源并复制到镜像中。 满足同等功能的情况下推荐使用COPY指令ADD指定更擅长读取本地tar文件并解压缩。 总结①copy更节省资源②ADD可以将压缩文件解压后复制③COPY只支持本机复制到镜像ADD支持URL复制到镜像。④ADD会自动创建目标目录 5.3 如何缩小docker构建的镜像大小
尽可能缩小指令的数量比如把RUN的Linux指令进行合并
尽可能使用最简洁的基础镜像
使用多阶段(多级)构建 5.4 为什么docker的centos镜像只有200M多
因为docker镜像只有rootfs和其它镜像层共用宿主机的linux内核bootfs所以很小。 **bootfs rootfs **作用是 加载、引导内核程序 挂载使用linux操作系统 等等一些关键的目录文件 就是说bootfs用内核的rootfs用自己的。 对于一个精简的osrootfs可以很小只需要包括最基本的命令工具和程序库就可以了因为底层直接用host的kernel自己只需要提供rootfs就行了所以对于不同的linux发行版bootfs基本是一致的rootfs会有差别所以不同的发行版可以共用bootfs。 总的来说就是dcoker的centos镜像中内核是使用host主机的系统才是自己的。 5.5 dockerfile镜像分层的原理
用overlay2存储引擎的方式叠加上去最上面的容器层是可读可写的其它镜像是可读的他们是共用的内核资源共用的操作系统里所必须的引导程序挂载系统之间的文件这些文件它和内核之间共享所有它比实际的centos要小。 5.6 容器之间的相互通信的方式
docker 0 、 数据卷容器 、 --link 隧道 、 container 模式直连接口同一个network namespaces里通过同一个网卡的方式在同一个名称空间里 共有一个IP通过localhost交互/自己的ip或端口交互 5.7 你用过哪些dockerfile命令
FROM: 指定系统
MAINTAINER :指定维护人信息
RUN 运行命令
ENV 指定环境变量
ADD 复制文件
EXPOSE 指定端口
CMD 执行命令
USER : 运行容器的用户 5.8 你用dockerfile怎么创建一个镜像出来
Dockerfile例主要包含信息有
①基础镜像
②镜像源信息
③镜像操作指令
④容器启动时执行的命令
大概步骤
先把所需要的安装包放在指定目录。
然后在该目录下创建一个Dockerfile文件进行添加指令首先是FROM 指定基础镜像。然后MAINTAINER设置维护人信息然后使用RUN执行相关命令。EXPOSE 指定端口最后执行CMD命令运行服务或脚本如果运行脚本需要在指定路径写上脚本
最后执行docker build -t 进行构建镜像。 5.9 CMD和ENTRYPOINT区别
1、相同点
都是容器启动时加载的命令启动模式如下
exec容器加载时使用的启动的第一个任务进程
shell容器加载时使用的第一个bash/bin/bash 、/bin/sh、/bin/init
2、不同点
cmd是容器环境启动时默认加载的命令
entrypoint是容器环境启动时第一个加载的命令程序/脚本程序init。
如果entrypoint使用了shell模式CMD指令会被忽略
如果entrypoint使用了exec模式。CMD指定的内容被追加为entrypoint指定命令的参数
如果entrypoint使用了exec模式CMD也应该使用exec模式 5.10 如果存在多个CMD或多个ENTRYPOINT有哪些是生效的
如果存在多个CMD只会有最后一个生效
如果存在多个ENTRYPOINT只会是第一个生效 六、Docker镜像实战
5.1、构建ssh镜像
mkdir /sshd
cd /sshd
vim Dockerfile
#编写dockerfile文件内容FROM centos:7
#指定基础镜像MAINTAINER lp
#指定维护者信息RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
#下载所需软件RUN echo 123 |passwd --stdin root
#修改root密码RUN sed -i s/UsePAM yes/UsePAM no/g /etc/ssh/sshd_config
#关闭pam认证模块RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#创建秘钥对方式-t 指定秘钥方式-f 指定验证文件RUN sed -ir /^session\srequired\spam_loginuid.so/ s/^/#/ /etc/pam.d/sshd
#响应修改PAM认证模块RUN mkdir -p /root/.ssh chown root.root /root chmod 700 /root/.ssh
#修改root目录的文件EXPOSE 22
#开放22端口CMD [/usr/sbin/sshd,-D]
#容器加载时启动shhd并开启守护进程生成镜像 启动容器并修改root密码 5.2 构建Systemctl镜像
mkdir /opt/systemctl
cd /opt/systemctlvim DockerfileFROM sshd:centos
MAINTAINER this is systemctl image lp
ENV container docker
#除了systemd-tmpfiles-setup.service删除其它所有文件
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ /sys/fs/cgroup ]//生成镜像 //启动容器并挂载宿主机目录挂载到容器中和进行初始化
#--privileged使container内的root拥有真正的root权限。否则container内的root只是外部的一个普通用户权限。
//进入容器 docker exec -it a0d624d2bfa9 bash
systemctl status sshd
方法二 docker run --privileged -it -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init 5.3 nginx镜像
mkdir /opt/nginx
cd /opt/nginx/
cp /opt/nginx-1.12.0.tar.gz /opt/nginxvtsvim Dockerfile#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image lp
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包并解压
ADD nginx-1.12.0.tar.gz /opt/
#指定工作目录
WORKDIR /opt/nginx-1.12.0
RUN ./configure \
--prefix/usr/local/nginx \
--usernginx \
--groupnginx \
--with-http_stub_status_module make make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
RUN echo daemon off; /usr/local/nginx/conf/nginx.conf #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD [/run.sh] vim run.sh #!/bin/bash /usr/local/nginx/sbin/nginx //创建新镜像 查看服务分配的端口号 根据端口号进行nginx页面访问 5.4 构建tomcat镜像
mkdir /opt/tomcat
cd /opt/tomcat
cp /opt/jdk-8u91-linux-x64.tar.gz /opt/tomcat
cp /opt/apache-tomcat-8.5.16.tar.gz /opt/tomcatvim DockerfileFROM centos:7
MAINTAINER this is tomcat image lp
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
#CMD [/usr/local/tomcat/bin/catalina.sh,run]
ENTRYPOINT [/usr/local/tomcat/bin/catalina.sh,run] 导入需要的tomcat压缩包和jdk压缩包 //创建新镜像 指定端口号为1212 http://192.168.88.10:1212
使用指定的端口号1212对页面进行访问 5.5 构建mysql镜像
mkdir /opt/mysqld
cd /opt/mysqldvim DockerfileFROM centos:7
MAINTAINER this is mysql image hmj
RUN yum -y install gcc gcc-c ncurses ncurses-devel bison cmake make
RUN useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX/usr/local/mysql \
-DMYSQL_UNIX_ADDR/usr/local/mysql/mysql.sock \
-DSYSCONFDIR/etc \
-DSYSTEMD_PID_DIR/usr/local/mysql \
-DDEFAULT_CHARSETutf8 \
-DDEFAULT_COLLATIONutf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE1 \
-DWITH_ARCHIVE_STORAGE_ENGINE1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE1 \
-DMYSQL_DATADIR/usr/local/mysql/data \
-DWITH_BOOSTboost \
-DWITH_SYSTEMD1 make make install
RUN chown -R mysql:mysql /usr/local/mysql/
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc/
RUN chown mysql:mysql /etc/my.cnf
ENV PATH/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld \
--initialize-insecure \
--usermysql \
--basedir/usr/local/mysql \
--datadir/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
ADD run.sh /usr/local/src
RUN chmod 755 /usr/local/src/run.sh
RUN sh /usr/local/src/run.sh
#CMD [/usr/sbin/init]vim my.cnf
[client]
port 3306
default-character-setutf8
socket /usr/local/mysql/mysql.sock[mysql]
port 3306
default-character-setutf8
socket /usr/local/mysql/mysql.sock[mysqld]
user mysql
basedir /usr/local/mysql
datadir /usr/local/mysql/data
port 3306
character_set_serverutf8
pid-file /usr/local/mysql/mysqld.pid
socket /usr/local/mysql/mysql.sock
server-id 1sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES vim run.sh
#!/bin/bash
/usr/local/mysql/bin/mysqld
systemctl enable mysqld //创建新镜像 //启动容器并进行初始化 //进容器给权限 //进入容器授权远程连接 mysql mysql -u root -p grant all privileges on *.* to root% identified by abc123; grant all privileges on *.* to rootlocalhost identified by abc123; flush privileges;
//在客户端连接mysql容器 mysql -h 192.168.88.10 -u root -P 49153 -pabc123