Docker容器:docker镜像的创建及dockerfile案例

文章目录

  • 一.docker镜像的三种创建方法
    • 1.基于现有镜像创建
      • 1.1 启动镜像
      • 1.2 生成新镜像
    • 2.基于本地模板创建
      • 2.1 OPENVZ 下载模板
      • 2.2 导入容器生成镜像
    • 3.基于dockerfile创建
      • 3.1 dockerfile结构及分层
      • 3.2 联合文件系统
      • 3.3 docker镜像加载原理及过程
    • 4.dockerfile操作常用的指令
      • 4.1 FROM指令
      • 4.2 MAINTAINER 指令
      • 4.3 RUN指令
      • 4.4 ENTRYPOINT指令
      • 4.5 CMD指令
      • 4.6 EXPOSE指令
      • 4.7 ENV指令
      • 4.8 ADD指令
      • 4.9 COPY指令
      • 4.10 VOLUME指令
      • 4.11 USER指令
      • 4.12 WORKDIR指令
      • 4.13 ONBUILD指令
      • 4.14 HEALTHCHECK指令
    • 5.编写 Dockerfile注意
  • 二.dockerfile构建镜像实例
    • 1.dockerfile构建apache
    • 2.dockerfile构建sshd
    • 3.dockerfile构建systemd
    • 4.dockerfile构建nginx
    • 5.dockerfile构建tomcat
    • 6.dockerfile构建mysql
  • 拓展
    • 创建实例时网络报错解决

一.docker镜像的三种创建方法

创建镜像有三种方法:基于现有镜像创建、基于本地模板创建及基于dockerfile创建

1.基于现有镜像创建

1.1 启动镜像

#首先启动一个镜像,在容器里做修改
docker run -itd centos:7 /bin/bash
#创建并启动镜像
docker ps 
#查看启动的镜像信息

在这里插入图片描述

1.2 生成新镜像

#将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
docker commit -m "new-images" -a  "test" 693b1c3a61ed  centos:test
#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行;docker images
#查看新生成的镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LseXvi3g-1692527315767)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817160913364.png)]

2.基于本地模板创建

2.1 OPENVZ 下载模板

#通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated
#使用wget工具来下载一个名为debian-7.0-x86-minimal.tar.gz的OpenVZ模板文件。确保在执行该命令之前,已经安装了wget工具,如果没有安装可以使用以下命令来进行安装:
yum install wget -y wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-so5x0tOT-1692527315767)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817161411568.png)]

2.2 导入容器生成镜像

#查看这个模板导入到docker的debian:test镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

3.基于dockerfile创建

3.1 dockerfile结构及分层

(1)dockerfile结构大致分为4个部分

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成 image 即可, 省去了敲命令的麻烦。

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。

Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

(2)dockerfile镜像的结构分层

  • Dockerfile 中的每个指令都会创建一个新的镜像层
  • 镜像层将被缓存和复用
  • 当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
  • 某一层的镜像缓存失效,它之后的镜像层缓存都会失效
  • 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在容器中不可见了不会影响在镜像中的数据.

3.2 联合文件系统

(1)联合文件系统(unionFS)概念

联合文件系统(unionFS):分层、轻量级并且高性能的文件系统,即一层一层叠加然后制作成的镜像,底层为内核加载,然后是rootfs系统,再上层是只可读的基础镜像,镜像启动后成为容器即为可读可写层此层保存数据等,然后可以再打包成一个新的镜像保存数据

(2)特点

一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

我们下载的时候看到的一层层的就是联合文件系统。

3.3 docker镜像加载原理及过程

(1)Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS

(2)bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。

(3)在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

(4)我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

(5)为什么容器中的centos大小只有200M

因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

4.dockerfile操作常用的指令

4.1 FROM指令

用于指定生成新的镜像所基于的基础进项,dockerfile的第一条命令必须是FROM指定本次生成镜像是基于那个基础镜像进程的,每创建一个镜像需要一个FROM。

4.2 MAINTAINER 指令

说明新镜像的维护人信息

4.3 RUN指令

在所基于的镜像上执行命令,并提交到新的镜像中,例如执行yum安装等

4.4 ENTRYPOINT指令

(1)ENTRYPOINT [“要运行的程序”, “参数 1”, “参数 2”]

(2)设定容器启动时第一个运行的命令及其参数,此指令为在使用docker exec 进入容器时就添加的命令参数。
(3)可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。

(4)示例

ENTRYPOINT [“rm”, “-rf”, “/*”]

4.5 CMD指令

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

(2)此指令为指定进入容器之后的第一个命令或脚步,进入容器后在容器中的shell中执行的第一个命令,dockerfile中只能有一条CMD命令若有多条CMD则只执行最后一条命令

(3)如果在docker run时指定了命令或者镜像中有ENTRYPOINT指令则CMD程序不会执行。

(4)docker RUN优先级>ENTRYPOINT指令>CMD指令

(5)示例

CMD java -jar xxxxx.jar 8090 ——启动微服务

4.6 EXPOSE指令

(1)EXPOSE “端口号”

(2)指定dockerfile生成的新镜像加载到 Docker 时要开启的端口

4.7 ENV指令

(1)ENV 环境变量 变量值

(2)设置一个环境变量的值,会被后面的 RUN 使用
linxu PATH=$PATH:/opt
ENV PATH $PATH:/opt

4.8 ADD指令

(1)ADD 源路径 目标路径

(2)ADD指令用于将源文件复制到dockerfile产生的新镜像中,要求源文件必须与dockerfile在同一文件夹下,或者同一个url下。有以下注意事项:

  • 源路径为文件时,目标路径以/结尾则dockerfile将目标文件视为目录将源路径的文件存到模板路径的目录下,且若模板路径不存在则自动创建模板路径;
  • 源路径为文件时,目标路径不以/结尾则dockerfile将目标路径视为文件,则直接将目标路径文件内容覆盖但名称不会改变,如果模板路径不存在则会创建一个以目标路径为名的文件,内容为源路径的文件内容;
  • 源路径为文件夹时,若目标路径存在则直接将原路径的文件夹拷贝到模板路径的目录下;
  • 若目标路径不存在,则自动创建一个以目标路径为名的文件夹将源文件夹拷贝到目录下;
  • 若源文件是个归档文件或压缩文件,docker会自动帮忙解压。URL下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。

4.9 COPY指令

(1)copy 源文件/目录 目标文件/目录

(2)只复制本地主机上的文件/目录 复制目标点为镜像中。要求本机文件必须与dockerfile在同一路径下。

(3)ADD与copy对比:

  • 都有本地复制文件和目录到镜像的功能;
  • ADD复制归档文件和压缩文件会自动解压;
  • 都要求与dockerfile在同一文件夹;URL拉取目录来复制;
  • COPY只能复制本地主机文件到镜像中,ADD可以复制到url中。

4.10 VOLUME指令

(1)volume [“目录”]

(2)在容器中创建一个挂载点

4.11 USER指令

(1)USER 用户名/uid

(2)指定运行容器时的用户

4.12 WORKDIR指令

为后续的RUN/CMD/ENTRYPOINT指定工作目录,可以理解为切换到指定的目录执行RUN等其他指令。

4.13 ONBUILD指令

(1)指定所生成的镜像作为一个基础镜像时所要允许的命令,调用有ONBUILD命令时的镜像会先执行ONBUILD命令。在使用其他镜像时,仔细检查ONBUILD命令的内容。

(2)当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生任何实质性影响。 但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

(3)查看 是否有别的dockerfile ,需要删除,这是别人的,如不想让使用,会造成一定的问题:OnBuild rm - rf /*

4.14 HEALTHCHECK指令

健康检查

5.编写 Dockerfile注意

在编写 Dockerfile 时,有严格的格式需要遵循:

(1)第一行必须使用 EROM 指令指明所基于的镜像名称;

(2)之后使用 MAINTAINER 指令说明维护该镜像的用户信息;

(3)然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。

(4)最后使用 CMD 指令指定启动容器时要运行的命令操作。

二.dockerfile构建镜像实例

1.dockerfile构建apache

#创建并进入文件夹,每个服务一个文件夹
mkdir  /opt/apache
cd     /opt/apache
#创建Dockerfile文件
vim Dockerfile
#内容如下:
FROM  centos:7
#基于的基础镜像指定为centos:7,注意本机要有此基础镜像
MAINTAINER this  is  apache  image  <test>
#说明镜像维护人信息为,指定用户为test
RUN yum -y update
RUN yum -y install httpd 
#镜像RUN指令指定启动容器后的运行命令,yum安装update和httpd服务
EXPOSE 80
#开启80端口
ADD index.html /var/www/html/index.html
#复制宿主机index.html文件到容器的 /var/www/html/index.html
ENTRYPOINT ["/usr/sbin/apachectl"]
CMD ["-D","FOREGROUND"]
#使用前台启动apache注意使用绝对路径,如果后台启动,启动完shell就结束了容器就结束了,保存退出。
echo "this is  test web">index.html
#准备网站的网页,注意必须在和Dockerfile文件相同的目录
docker build -t  httpd:centos .  
#将dockerfile 文件生成镜像注意最后有个点。
docker images
#可查看已经有httpd的包
docker run -d -p 40330:80  httpd:centos 
#测试安装是否成功:新镜像运行容器,映射本主机的40330端口为容器的80端口
访问192.168.198.11:40330 进行测试是否可以访问容器的httpd网页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cG1RXPeG-1692527315768)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818142849580.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znlGp896-1692527315768)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818111927581.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tV25R8kE-1692527315769)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818112324233.png)]

扩展:

创建Dockerfile的配置文件还有两种方法:

(1)方法一:

#创建Dockerfile文件
vim DockerfileFROM  centos:7
#基于的基础镜像指定为centos:7,注意本机要有此基础镜像
MAINTAINER this  is  apache  images  <test>
#说明镜像维护人信息为,指定用户为test
RUN yum -y install httpd 
#镜像RUN指令指定启动容器后的运行命令,yum安装httpd服务
EXPOSE 80
#开启80端口
ADD index.html /var/www/html/index.html
#复制宿主机index.html文件到容器的 /var/www/html/index.html
CMD /usr/sbin/apachect -D FOREGROUND
#使用前台启动apache注意使用绝对路径,如果后台启动,启动完shell就结束了容器就结束了,保存退出。

后再接着准备网站的网页,访问等操作

(2)方法二:

vim Dockerfile
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <test>
#镜像操作指令安装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
#保存退出
#准备执行脚本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行
#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

后再接着准备网站的网页,访问等操作

2.dockerfile构建sshd

#创建并进入文件夹,每个服务一个文件夹
mkdir  /opt/sshd
cd     /opt/sshd
vim Dockerfile
#第一行必须指明基于的基础镜像
FROM centos:7
#作者信息
MAINTAINER this is ssh image <ssh>
#镜像的操作指令
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo 'abc1234' | passwd --stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config						#不使用PAM认证
RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd	#取消pam限制
RUN ssh-keygen -t rsa -A														#生成密钥认证文件
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd" , "-D"]			#/usr/sbin/sshd -D 用于前台启动sshd服务
#生成镜像
docker build -t sshd:centos .
#启动容器并修改root密码
docker run -d -P sshd:centos
docker ps -a
#登入端口镜像
ssh localhost -p 32771
#查看镜像地址
ifconfig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZA56qfkl-1692527315769)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818145542392.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgzZjXbB-1692527315770)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818145618752.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYMLVXWo-1692527315770)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818145656547.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQbAbPAM-1692527315770)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818145921173.png)]

3.dockerfile构建systemd

mkdir /opt/systemctl
cd /opt/systemctl
#创建systemd目录
vim Dockerfile
#编辑Dockerfile文件内容如下
FROM sshd:centos
#以sshd:centos为基础镜像,注意要做上面的sshd实例,不然无此进项不能制作systemd镜像
MAINTAINER this is systemctl image <systemd>
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" ]
CMD ["/usr/sbin/init"]
docker build -t systemd:centos .
#生成systemd镜像
docker run --privileged -d -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init
#启动容器,并挂载宿主机目录挂载到容器中,和进行初始化
#--privileged:使container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
docker ps -a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qKGQDlEM-1692527315770)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818150629351.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgm8rbwn-1692527315771)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818150816039.png)]

#进入容器
docker exec -it c62554f63779  /bin/bash
systemctl start sshd
systemctl status sshd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofKeAKhV-1692527315771)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818150943837.png)]

方法二:

方法二:
docker run --privileged -it -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init &

4.dockerfile构建nginx

mkdir /opt/nginx
cd /opt/nginx/
cp /opt/nginx-1.12.2.tar.gz /opt/nginx
#创建nginx目录,将nginx安装包放到创建的nginx目录下,必须与Dockerfile文件在同一目录下
vim Dockerfile
#编辑nginx的dockerfile文件内容如下
FROM centos:7
#基于基础镜像,centos
MAINTAINER this is nginx image <nginx>
#用户信息,镜像维护用户为nginx
RUN yum -y update
#此内容若保存可注释掉
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#安装编译安装工具
ADD nginx-1.12.2.tar.gz /opt/
#上传nginx软件压缩包,docker自动解压
WORKDIR /opt/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定工作目录
EXPOSE 80
EXPOSE 443
#指定http和https端口
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#关闭nginx 在后台运行
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
#添加宿主机中run.sh到容器中
#CMD ["/usr/local/sbin/nginx", "-g", "daemon off;"]
vim run.sh
#创建run.sh脚本,注意必须和dockerfile在同一路径下,内容如下
#!/bin/bash
/usr/local/nginx/sbin/nginx
#创建新镜像
docker build -t nginx:centos .
docker run -d -P nginx:centos
docker ps -a 
#查看nginx容器,访问80对应的随机端口验证,443的端口验证不了,ngingx中每家ssl模块#访问之前需提前关闭防火墙
systemctl stop firewalld
setenforce 0
访问:http://192.168.198.11:32776/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ev0beWkw-1692527315771)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818155857492.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3tky45L-1692527315771)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818155915797.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8CNvv3P-1692527315772)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818155937569.png)]

5.dockerfile构建tomcat

#创建tomcat目录
mkdir /opt/tomcat
cd /opt/tomcat
#将相关安装包提前导入到opt目录下
cp /opt/jdk-8u91-linux-x64.tar.gz /opt/tomcat
cp /opt/apache-tomcat-8.5.16.tar.gz /opt/tomcat
vim DockerfileFROM centos:7
MAINTAINER this is tomcat image <tomcat>
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"]
#创建新镜像
docker build -t tomcat:centos .docker run -d --name tomcat01 -p 1818:8080 tomcat:centos 
docker ps
http://192.168.198.11:1818

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nvOBNTu-1692527315772)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818160849272.png)]

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ifzrqaX9-1692527315772)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818161153605.png)]

6.dockerfile构建mysql

mkdir /opt/mysqld
cd /opt/mysqld
#将安装包提前导入到/opt目录下
cp /opt/mysql-boost-5.7.20.tar.gz /opt/mysqld
vim DockerfileFROM centos:7
MAINTAINER this is mysql image <lnmp>
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make;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_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1;make -j4;make install
ADD my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data;cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/;systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME [ "/usr/local/mysql" ]
CMD ["/usr/sbin/init"]
vim /etc/my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1sql_mode=NO_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
#创建新镜像
docker build -t mysql:centos .#启动容器,并进行初始化
docker run --name=mysql_server -d -P --privileged mysql:centos /usr/sbin/init#进容器给权限
docker ps -a
CONTAINER ID   IMAGE            COMMAND                   CREATED             STATUS             PORTS                                                                                NAMES
63d9dc876f59   mysql:centos     "/usr/sbin/init"          8 seconds ago       Up 5 seconds       0.0.0.0:32777->3306/tcp, :::32777->3306/tcp                                          mysql_server

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IU0tuFnj-1692527315773)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818165906561.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NNjBENGi-1692527315773)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818170028067.png)]

#进入容器,授权远程连接 mysql
docker exec -it mysql bash
systemctl status mysqldmysql -u root -p
grant all privileges on *.* to 'root'@'%' identified by 'abc123';
grant all privileges on *.* to 'root'@'localhost' identified by 'abc123';
flush privileges;#在客户端连接mysql容器
mysql -h 192.168.80.10 -u root -P 32777 -pabc123

因mysql占用较大企业mysql不建议安装在容器中

拓展

创建实例时网络报错解决

报错:[Warning] IPv4 forwarding is disabled. Networking will not work.

解决方法:

vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker

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

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

相关文章

蓝奥声智能工业安全用电监测与智慧能源解决方案

能源管理变得越来越重要。如今&#xff0c;能源成本已成为国内预算的核心因素&#xff0c;因此用电监控对大多数现代企业来说都很重要。许多企业在日常能源消耗监控中面临着一些挑战&#xff0c;因为它们的规模庞大&#xff0c;基础设施多样化&#xff0c;灵活性低&#xff0c;…

更好的 3D 网格,从重建到生成式 AI

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 这些生成的 3D 模型通常提取为标准三角形网格。网格表示提供了许多好处&#xff0c;包括支持现有软件包、高级硬件加速和支持物理仿真。但是&#xff0c;并非所有网格都是平等的&#xff0c;这些优势只…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本&#xff08;5.1.3&#xff09;、RocketMQ-Dashboard 版本的百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码&#xff1a;1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种&#xff0c;是信息检索领域的重要算法&#xff1a; TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分&#xff08;relevance scoring&#xff09;算法。在此之前&#xff0c;Elasticsearch 使…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

Certify The Web (IIS)

一、简介 Certify The Web 适用于 Windows的SSL 证书管理器用户界面&#xff0c;与所有 ACME v2 CA 兼容&#xff0c;为您的 IIS/Windows 服务器轻松地安装和自动更新来自 Letencrypt.org 和其他 ACME 证书授权机构的免费 SSL/TLS 证书&#xff0c;设置 https 从未如此简单。 …

【中危】PowerJob 未授权访问漏洞 (CVE-2023-36106)

漏洞描述 PowerJob 是一款开源的分布式任务调度框架。 在 PowerJob 受影响版本中存在错误的访问控制漏洞。由于没有对/container/list接口做鉴权&#xff0c;未授权的攻击者可以构造 appId 参数访问 /container/list接口获取应用容器的标识、运行状态、日志等敏感信息。 漏洞…

java+springboot+mysql小区自来水实时监控管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区自来水实时监控管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;楼栋管理&#xff1b;租户管理、用水管理&…

糖尿病视网膜病变,黄斑病变,年龄相关检测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Git分支操作---讲解二】

Git分支操作---讲解二 查看分支创建分支切换分支修改分支切换分支合并分支合并分支【冲突】(只会修改主分支不会修改其他分支)什么时候会有冲突&#xff1f; 查看分支 创建分支 切换分支 修改分支 切换分支 合并分支 合并分支【冲突】(只会修改主分支不会修改其他分支) 什么时…

python 打印沁园春 雪 居中对齐 文本对齐

以下是python 中使用 DebugInfo 模块居中对齐打印《沁园春・雪》的效果 引入模块 pip install DebugInfopython代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugInfo import * # endregion诗文 沁园春 雪 作者: 毛主席 北国风光&#xff0c;千里冰封…

Blazor前后端框架Known-V1.2.13

V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

PySpark安装及WordCount实现(基于Ubuntu)

先盘点一下要安装哪些东西&#xff1a; VMwareubuntu 14.04&#xff08;64位&#xff09;Java环境&#xff08;JDK 1.8&#xff09;Hadoop 2.7.1Spark 2.4.0&#xff08;Local模式&#xff09;Pycharm &#xff08;一&#xff09;Ubuntu VMware 和 ubuntu 14.04&#xff08;…

数据结构与算法:计算机科学的基石

文章目录 数据结构&#xff1a;构建数据的框架算法&#xff1a;问题的解决方案编程语言&#xff1a;实现数据结构的工具结论 &#x1f389;欢迎来到数据结构学习专栏~数据结构与算法&#xff1a;计算机科学的基石 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&…

python schedule库使用教程

schedule 是一个 Python 库&#xff0c;用于在指定的时间间隔或特定时间点执行任务。它可以帮助你创建定时任务&#xff0c;例如定时运行函数、脚本等。以下是一个简单的 schedule 库的使用教程。 安装 首先&#xff0c;你需要安装 schedule 库。你可以使用以下命令通过 pip …

速通蓝桥杯嵌入式省一教程:(八)ADC测量模拟电压

ADC(Analog to Digital Converter)&#xff0c;模拟数字转换器&#xff0c;是电子工程师必须掌握的一个内容。由于单片机、计算机等是由0和1组成的&#xff0c;因此其无法直接测量或使用连续的模拟信号&#xff0c;需要用ADC将模拟信号转换为离散的数字信号。ADC的具体原理在此…

uni-app 打包生成签名Sha1

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法&#xff1a; 安装JRE环境&#xff08;推荐使用JRE8环境&am…

CH02_重构的原则(什么是重构、为什么重构、何时重构)

什么是重构 重构&#xff08;名词&#xff09;&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察行为的前提下&#xff0c;提高其可理解性&#xff0c;降低其修改成本。 重构&#xff08;动词&#xff09;&#xff1a;使用一系列重构手法&#xff0…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

【RabbitMQ】RabbitMQ整合SpringBoot案例

文章目录 1、前情提要【RabbitMQ】2、RabbitMQ-SpringBoot案例 -fanout模式2.1 实现架构总览2.2 具体实现2.2.1生产者2.2.1消费者 1、前情提要【RabbitMQ】 【RabbitMQ】消息队列-RabbitMQ篇章 RabbitMQ实现流程 2、RabbitMQ-SpringBoot案例 -fanout模式 2.1 实现架构总览…