Docker容器:docker数据管理、镜像的创建及dockerfile案例

news2024/12/26 21:27:03

文章目录

  • 一、docker数据管理
    • 1.为何需要docker数据管理
    • 2.数据管理类型
    • 3.数据卷
    • 4.数据卷容器
    • 5.容器的互联
  • 二.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数据管理

1.为何需要docker数据管理

因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在;还有一种方式,容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。

2.数据管理类型

管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)

3.数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作,可以互相同步内容

#拉取CentOS 7的Docker镜像
docker pull centos:7
#使用docker run命令来创建并运行一个基于CentOS 7镜像的容器
docker run -itd  centos:7 /bin/bash

mkdir /var/www
#宿主机创建目录
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
#创建容器centos7并命名为web1.将宿主机的/var/www目录挂载到容器中的/data1卷中
# -v 选项表示容器中创建数据卷
echo "this is web1" > /data1/a.txt
exit
#数据卷中创建内容a.txt并退出
cd /var/www/
#进入宿主机的挂载目录
cat a.txt
#验证容器中数据卷内容
echo 123>abc.txt
#宿主机的挂载目录创建一个文件夹
docker start web1
docker exec -it web1   /bin/bash 
#开启web1容器并进入
ls /data1
#显示data1数据卷验证其中是否有abc.txt

在这里插入图片描述

4.数据卷容器

–volumes-from 要挂载那个容器名称/id号 #用于容器之间的挂载
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

docker run --name web3 -v /data1 -v /data2 -it centos:7 /bin/bash
#创建数据卷容器web3 并创建2个data目录
echo "this is web3" > /data1/abc.txt
echo "This is web3" > /data2/ABC.txt
#web3容器2个data下创建文件
docker run -it --volumes-from web3 --name web4 centos:7 /bin/bash
#使用 --volumes-from 来挂载 web3 容器中的数据卷到新的容器
cat /data1/abc.txt
cat /data2/ABC.txt

在这里插入图片描述

5.容器的互联

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

docker run -itd -P --name web01 centos:7 /bin/bash
#创建并运行源容器取名web1
docker run -itd -P --name web03 --link web01:web01 centos:7 /bin/bash、
#创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联

在这里插入图片描述
在这里插入图片描述

#进入web03容器
docker exec -it web03 /bin/bash
ping 90fd4a7ad12f

在这里插入图片描述

#查看web01的地址
docker inspect web01

在这里插入图片描述

#进入web03pingweb01的IP地址
ping 172.17.0.5

在这里插入图片描述

二.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
#查看新生成的镜像

在这里插入图片描述

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

在这里插入图片描述

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网页

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扩展:

创建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服务
#生成镜像
docker build -t sshd:centos .

#启动容器并修改root密码
docker run -d -P sshd:centos
docker ps -a
#登入端口镜像
ssh localhost -p 32771
#查看镜像地址
ifconfig

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

方法二:

方法二:
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/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

#进入容器,授权远程连接 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/910665.html

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

相关文章

基于Jenkins构建生产CICD环境、jenkins安装

目录 Jenkins简介 安装配置Jenkins Jenkins简介 Jenkins是一个用Java编写的开源的持续集成工具。在与Oracle发生争执后&#xff0c;项目从Hudson项目独立。官方网站&#xff1a;https://jenkins.io/。 Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中&#xff…

Web 3.0 安全风险,您需要了解这些内容

随着技术的不断发展&#xff0c;Web 3.0 正在逐渐成为现实&#xff0c;为我们带来了许多新的机遇和挑战。然而&#xff0c;与任何新技术一样&#xff0c;Web 3.0 也伴随着一系列安全风险&#xff0c;这些风险需要被认真对待。在这篇文章中&#xff0c;我们将探讨一些与Web 3.0 …

【excel密码】如何禁止移动、删除excel工作表?

想要工作表不被他人移动、删除等操作&#xff0c;该如何设置&#xff1f;今天分享如何设置才能够禁止excel工作表移动、删除。 打开excel工作表&#xff0c;点击工具栏中的审阅 – 保护工作簿 点击保护工作簿之后&#xff0c;会有弹框出现&#xff0c;输入想要设置的excel密码…

新的后端渲染:服务器驱动UI

通过API发送UI是一种彻底的新方法&#xff0c;将改变传统的UI开发。 一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI&#xff0c;也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性&#xff0c;正在改变 UI 开发的传统范例。 服务器驱动 UI 不仅仅是…

Web 事务管理

Web在执行的过程中需要保证一致性&#xff0c;从而需要引入事务来对SQL事件进行事务的管理。具体而言可以参考这篇博客MySQL事务(transaction)。 具体而言&#xff0c;我们获得一个这样的需求&#xff0c;删除一个部门&#xff0c;在删除部门的过程中需要删除部门下的所有员工…

无人机航管应答机 ping200XR

产品概述 ping200XR是一个完整的系统&#xff0c;旨在满足航管应答器和自动相关监视广播(ADS-B)的要求&#xff0c;在管制空域操作无人航空系统(UAS)。该系统完全可配置为模式A&#xff0c;模式C&#xff0c;模式S转发器和扩展ADS-B发射机的任何组合。ping200XR包括一个精度超…

几个Web自动化测试框架的比较:Cypress、Selenium和Playwright

介绍&#xff1a;Web自动化测试框架对于确保Web应用程序的质量和可靠性至关重要。它们帮助开发人员和测试人员自动执行重复性任务&#xff0c;跨多个浏览器和平台执行测试&#xff0c;并在开发早期发现问题。 以下仅代表作者观点&#xff1a; 本文探讨来3种流行的Web自动化测…

怎么把视频转换成mp4格式?分享几种视频格式转换方法

将视频格式转换成MP4格式的好处包括&#xff1a;更广泛的兼容性&#xff0c;因为MP4是一种通用格式&#xff0c;大多数设备和平台都支持&#xff1b;更小的文件大小&#xff0c;因为MP4使用高效的压缩算法&#xff0c;可以将视频文件压缩到更小的大小&#xff1b;更好的视频质量…

Linux常用命令——diff3命令

在线Linux命令查询工具 diff3 比较3个文件不同的地方 补充说明 diff3命令用于比较3个文件&#xff0c;将3个文件的不同的地方显示到标准输出。 语法 diff3(选项)(参数)选项 -a&#xff1a;把所有的文件都当做文本文件按照行为单位进行比较&#xff0c;即给定的文件不是文…

element-ui中二次封装一个带select的form组件

带select的form组件 样式 代码 <template><el-form-item label"是否有" class"append" prop"tag"><el-form-itemprop"isShare"><el-select v-model"query.tag"><el-option v-for"(item, …

Shell编程基础02

0目录 1.case语法 2.grep 3.sed 4.awk 5.linux安装mysql 1.case语法 创建一个txt文档 执行 查询用户名 case 用法 写一个计算器脚本 加入函数 补充查看进程命名 2.find grep命令 Find 查询当前目录下 以sh结尾的文件 Grep 查询义开头的 或者加入正则表达…

AIGC 施展“物理魔法”,3D视觉突破“精度极限”

点击关注 文&#xff5c;姚悦&#xff0c;编&#xff5c;王一粟 “没有艺术&#xff0c;全是物理&#xff01;物理让你快乐&#xff0c;不是吗&#xff1f;” 近日&#xff0c;在世界计算机图形会议 SIGGRAPH 2023 上&#xff0c;英伟达创始人、CEO 黄仁勋宣布&#xff0c;将…

小型便携式气象站的功能特点

小型便携式气象站是一种&#xff0c;集多种传感器和自动化功能于一体的气象观测设备&#xff0c;具有便携性和自动化的特点。能够自动测量和记录各项气象参数&#xff0c;为人们提供实时气象数据。 小型便携式气象站的功能特点如下&#xff1a; 1.小型便携式气象站轻便便携&a…

秒懂算法│博弈论

博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到取胜的目的。…

StreamingWarehouse的一些思考和未来趋势

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 一篇笔记。 以Hudi、Iceberg、Paimon这几个框架为例&#xff0c;它们支持高效的数据流/批读写、数据回溯以及数据更新。具备一些传统的实时和离线数仓不具备的特性&#xff0c;主要有几个方面&#xff1a; 这…

【30天熟悉Go语言】10 Go异常处理机制

作者&#xff1a;秃秃爱健身&#xff0c;多平台博客专家&#xff0c;某大厂后端开发&#xff0c;个人IP起于源码分析文章 &#x1f60b;。 源码系列专栏&#xff1a;Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列&#xff08;含&#xff1a;Ribbon、Feign&…

2023国赛数学建模A题B题C题D题资料思路汇总 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022年数学建模c题思路_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛a题题目_UST数模…

三维模型OSGB格式轻量化的数据压缩与性能平衡分析

三维模型OSGB格式轻量化的数据压缩与性能平衡分析 在三维模型应用中&#xff0c;OSGB格式轻量化处理是一种常见的技术手段&#xff0c;它可以通过数据压缩、简化、滤波等操作&#xff0c;降低三维模型数据的存储空间和传输带宽需求&#xff0c;提高应用程序的性能和用户体验。但…

python35种绘图函数总结,3D、统计、流场,实用性拉满

文章目录 基础图误差线三维图等高线图场图统计图非结构坐标图 基础图 下面这8种图像一般只有两组坐标&#xff0c;直观容易理解。 函数坐标参数图形类别plotx,y曲线图stackplotx,y散点图stemx,y茎叶图scatterx,y散点图polarx,y极坐标图stepx,y步阶图barx,y条形图barhx,y横向条…

中国社科院大学-美国杜兰大学能源管理硕士招生信息详情

中国社科院大学-美国杜兰大学能源管理硕士招生信息详情 金融硕士 中国社科院大学-美国杜兰大学能源管理硕士招生信息详情 能源与气候是21世纪人类所面临的最严峻挑战&#xff0c;当今世界能源格局面临深度调整&#xff0c;全球应对气候变化行动加速&#xff0c;国家间科技竞争…