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

news2024/11/26 11:53:08

文章目录

  • 一.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构建httpd
    • 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 
#查看启动的镜像信息

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UT00M1AJ-1692527315766)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230817160315795.png)](https://img-blog.csdnimg.cn/7329ed37bcce49c7956e72995b30621c.png)

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构建httpd

#创建并进入文件夹,每个服务一个文件夹
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 Dockerfile

FROM  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服务
#启动容器并修改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 56b06afcef9a  /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 Dockerfile

FROM 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-dtssDbm7-1692527315772)(C:\Users\zhao\AppData\Roaming\Typora\typora-user-images\image-20230818161103541.png)](https://img-blog.csdnimg.cn/1d86c9f97fa746c69b36042d58c5dc80.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 Dockerfile

FROM 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 = 1

sql_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 mysqld

mysql -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.coloradmin.cn/o/903641.html

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

相关文章

16.ingress

文章目录 ingress外部访问externalIP组成Ingress-Nginx部署 nginx-ingress-controllerDaemonSetHostNetwork创建 ingress控制器创建ingress资源 DeploymentNodePort模式Ingress HTTPS 代理访问生成证书和私钥创建secret资源创建Ingress资源 Nginx 进行 BasicAuthnginx进行重写总…

18----注释

本节是markdown教程的最后一节&#xff0c;也是最简单的一节----注释。 我们常见的注释可能是这样的&#xff1a; 也可能是这样的&#xff1a; 注释无处不在&#xff0c;就让我们抱着一丝期待&#xff0c;来看看markdown的注释吧&#xff01; 一、基本用法&#xff1a; Ma…

深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)

谈到并发&#xff0c;我们不得不说AQS(AbstractQueuedSynchronizer)&#xff0c;所谓的AQS即是抽象的队列式的同步器&#xff0c;内部定义了很多锁相关的方法&#xff0c;我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。 …

13.实现业务功能--板块信息

目录 获取在首页中显示的版块 1. 实现逻辑 2. 创建扩展 Mapper.xml 3. 修改 DAO 4. 创建 Service 接口 5. 实现 Service 接口 6. 生成测试方法 7. 实现 Controller 8. 实现前端页面 在数据库中执行以下 SQL 语句&#xff1a; INSERT INTO t_board (id, name, article…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

GAN:对抗生成网络,前向传播和后巷传播的区别

目录 GAN&#xff1a;对抗生成网络 损失函数 判别器开始波动很大&#xff0c;先调整判别器 生成样本和真实样本的统一&#xff1a;真假难辨​编辑 文字专图片​编辑 头像转表情包​编辑 头像转3D​编辑 后向传播 1. 前向传播&#xff08;forward&#xff09; 2. 反向传播&…

自我管理篇--“90%的简历会被刷掉”这个现象背后的原因

以上简历模板资源的排版可能不是最优&#xff0c;但工作经历可以借鉴 文章目录 一、简历问题出在什么地方二、如何提升简历的质量三、如何避免常见的简历错误四、如何让你的简历脱颖而出五、如何准备面试 为什么90%的简历会被淘汰 在当今竞争激烈的就业市场中&#xff0c;求职者…

OCR扫描仪应该怎么选?

选择OCR扫描仪时&#xff0c;以下几个因素需要考虑&#xff1a; 1. 扫描质量&#xff1a;确保选购的OCR扫描仪能够提供高质量的扫描结果。关注分辨率&#xff08;通常以dpi表示&#xff09;&#xff0c;辨识度和颜色深度等技术指标&#xff0c;以满足您的需求。 2. 扫描速度&a…

电脑报错vcomp100.dll丢失怎样修复?这三个方法可以解决

vcomp100.dll是微软Visual C 2005 Redistributable Package的一部分&#xff0c;它包含了运行某些程序所需的C运行时库。当电脑中的vcomp100.dll文件丢失或损坏时&#xff0c;可能会导致一些程序无法正常运行&#xff0c;甚至出现系统崩溃等问题。 那么&#xff0c;当遇到这样的…

openpnp - 自动换刀的设置

文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…

Laravel 框架构造器的排序分组.子查询 JOIN 查询 构造器的增删改 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

go1.21.0.windows-amd64.msi

go1.21.0.windows-amd64.msi Windows 10 or greater required.

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 &#x1f338;struts2漏洞扫描工具&#x1f338;step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令&#xff0c;获取flag &#x1f338;Goby插件工具headshot&#x1f338;step1 输入ip和端口 检测step2 cmd 输入指令 &…

LeetCode 833. Find And Replace in String【字符串,哈希表,模拟】1460

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

stm32单片机开关控制LED灯(中断方式)(proteus电路图)

注意了&#xff1a;一般人都是用按键button实现这个功能&#xff0c;但是我就是喜欢用Switch&#xff0c;然后我就用了Switch&#xff0c;喜欢的朋友欢迎看一看 不同地方在于&#xff1a;这里是interrupt 函数 void EXTI0_IRQHandler(void) {/* USER CODE BEGIN EXTI0_IRQn 0…

【Apollo学习笔记】——规划模块TASK之LANE_CHANGE_DECIDER

文章目录 前言LANE_CHANGE_DECIDER功能简介LANE_CHANGE_DECIDER相关配置LANE_CHANGE_DECIDER总体流程LANE_CHANGE_DECIDER相关子函数PrioritizeChangeLaneUpdateStatusIsClearToChangeLaneHysteresisFilter 参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算法原理与实…

线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)

1.4.1 方阵 矩阵里&#xff0c;行数列数的矩阵叫做方阵方阵有很多很好的特殊属性 1.4.2 行列式 行列式是方阵的一种特殊运算如果矩阵行数列数相等&#xff0c;那么这个矩阵是方阵。行列数的计算方式和矩阵的不同只有方阵才有行列式行列式其实是&#xff0c;矩阵变化的一个面…

SLAM-VIO视觉惯性里程计

SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷&#xff1a;融合IMU优势&#xff1a;相机-IMU标定松耦合紧耦合基于滤波的融合方案&#xff1a;基于优化的融合方案&#xff1a; 前言 VIO&#xff08;visual-inertial odometry&#xff09;即视觉惯性里程计&#xff0c;有时…

第十三章MyBatis高级映射

多对一映射 创建数据表 student是主表class_id关联class表的id class表 student表 创建pojo Class类 Data AllArgsConstructor NoArgsConstructor public class Class {private Long id;private String name;private List<Student> students; }Student类 Data A…

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…