当前位置: 首页 > news >正文

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

相关文章:

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.…...

Java虚拟机(JVM):引用计数算法

一、引言 我们学习了Java内存运行时区域的各个部分&#xff0c;其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生&#xff0c;随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来就已知的…...

【AGC】Publishing api怎么上传绿色认证审核材料

【问题描述】 华为应用市场会对绿色应用标上特有的绿色标识&#xff0c;代表其通过华为终端开放实验室DevEco云测平台的兼容性、稳定性、安全、功耗和性能的检测和认证&#xff0c;是应用高品质的象征。想要自己的应用认证为绿色应用就需要在发布应用时提供绿色认证审核材料&a…...

改变住宅区空气质量,你一定要知道!

在现代城市生活中&#xff0c;住宅区的环境质量对居民的健康和舒适感起着至关重要的作用。扬尘颗粒和噪声不仅直接影响人们的日常生活&#xff0c;还可能对居民的健康和生活品质造成持续的影响。 在不断提升环保意识的同时&#xff0c;政府、社区和居民也将共同努力&#xff0c…...

【SpringCloud】Gateway使用

文章目录 概述阻塞式处理模型和非阻塞处理模型概念阻塞式处理模型 三大核心概念 工作流程使用POMYML启动类配置路由通过编码进行配置动态路由常用的Route Predicate自定义全局过滤器自定义filter 官网 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1…...

Spring之域对象共享数据

文章目录 前言一、requset域1.使用ServletAPI向request域对象共享数据2.使用ModelAndView向request域对象共享数据3.使用Model向request域对象共享数据4.使用map向request域对象共享数据5.使用ModelMap向request域对象共享数据6.Model、ModelMap、Map的关系 二、session域向ses…...

Redis巩固加强(帮助迅速梳理知识,同时适用初学者理解)

目录 Redis究竟是什么 Redis为什么能够做到这么快 Redis持久化机制 Redis如何实现过期的key的删除 Redis数据类型及应用场景 Redis的缓存穿透如何解决 什么是缓存穿透&#xff1f; 解决方案&#xff1a; 布隆过滤器 Redis如何解决缓存雪崩 什么是缓存雪崩 措施 Redis…...

Sui生态项目|集隐私通信、移动钱包、链上朋友圈和红包功能一体的社交应用ComingChat

ComingChat是在Sui网络上构建的去中心化社交平台&#xff0c;功能众多&#xff0c;其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议&#xff0c;这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。 ComingChat在Sui上提供了全面的…...

I2S/PCM board-level 约束及同步(latencyskewbitsync)

I2S/PCM是典型的低速串口&#xff0c;在两个方向上分别有两组信号&#xff0c;我们已soc为视角分为soc-adif和外设audio-codec。 那么adif输入&#xff1a; sclk_i, ws_i, sdi 当然并不是三个输入信号同时有效&#xff0c;只有adif RX slave时&#xff0c;三个输入都会有效…...

vue 富文本编辑器

安装 1、npm install wangeditor/editor --save 2、npm install wangeditor/editor-for-vue --save使用 .vue文件//展示<div style"border: 1px solid #ccc;width: 95%;"><!-- 工具栏 --><Toolbar style"border-bottom: 1px solid #ccc" …...

为什么说ChatGPT还不是搜索引擎的对手

一 前言 1950年&#xff0c;英国科学家图灵在一篇论文中预言&#xff0c;人类有可能创造出具有真正智能的机器。 著名的「图灵测试」就此诞生&#xff1a;如果一台机器能够与人类展开对话&#xff0c;而不被辨别出其机器身份&#xff0c;那么称这台机器具有智能。 也是从那时…...

2308C++协程流程

参考 #include <常用> #include <协程> #include "简异中.cpp" //用来中文定义的.元<类 T>构 同步{共针<T>值;同步(共针<T>p):值(p){输出<<"构建同步"<<行尾;//.8}同步(常 同步&s):值(s.值){输出<<&…...

C#实现稳定的ftp下载文件方法

当使用C#实现稳定的FTP下载文件的方法时&#xff0c;我们可以使用FtpWebRequest类来执行FTP操作&#xff0c;并根据需要添加错误处理和重试机制。下面是一个示例代码&#xff1a; using System; using System.IO; using System.Net;public class FTPDownloader {private const…...

八股文之计算机网络

TCP/IP 网络模型有哪几层 该模型用来解决不同设备间的进程通信&#xff0c;就需要网络通信&#xff0c;该模型就应运而生。首先是应用层&#xff0c;我们所接触的App都是在这一层实现的&#xff0c;当不同的设备需要通信时&#xff0c;就需要把数据发给传输层&#xff0c;传输…...

kotlin 比较 let apply

let 和 apply 是 Kotlin 标准库中的两个非常有用的函数&#xff0c;它们用于在代码中实现更简洁和可读的操作。它们通常在函数式编程和链式调用中使用&#xff0c;以简化代码并提高可维护性。下面是关于这两个函数的详细解释&#xff1a; let let 函数是一个作用域函数&#…...

springboot跨域踩坑笔记

事情是这样的&#xff0c;我在进行前后端联调的时候&#xff0c;发送了跨域拦截 马上在spring项目中创建一个CorsConfig类 package com.example.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.an…...

基于STM32+FreeRTOS的四轴机械臂

目录 代码&#xff1a; 注释写的较少&#xff0c;但本文出现的代码都有注释&#xff0c;所以请直接在本文里看注释 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码 2…...

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…...

redux的介绍、安装、三大核心与执行流程

redux的介绍、安装、三大核心与执行流程 一、redux的基本介绍二、redux的安装三、redux核心概念3.1 action3.2 reducer3.3 store 四、Redux代码执行流程五、加减案例练习 一、redux的基本介绍 redux中文官网Redux 是 React 中最常用的状态管理工具&#xff08;状态容器&#x…...

Redis 5环境搭建

一、环境搭建 如果是Centos8&#xff0c;yum 仓库中默认的 Redis版本就是5&#xff0c;直接yum install即可。如果是Centos7&#xff0c;yum 仓库中默认的 Redis版本是3系列&#xff0c;比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...