使用 Dockerfile 部署镜像实例

Posted 奋斗的蜗牛灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Dockerfile 部署镜像实例相关的知识,希望对你有一定的参考价值。

Dockerfile 中的命令都是在编译、生成镜像时执行的,通过新镜像创建容器时,服务都已经在容器中了。

建议一个 Dockerfile 使用一个目录,不同的Dockefile 不放在同一个目录中。

Dockerfile 文件名可以都用 Dockerfile
也可以修改,修改后需用 -f 修改后的名称 .
默认文件名用 Dockerfile 就不用-f 指定

docker build -t test -f dockerfile .
大概构建步骤
1. FROM 指定基础镜像名
2. 准备本地镜像软件源码包 或者 在线下载镜像
3. RUN yum安装镜像需要的软件
4. RUN 需要执行的其他命令
5. ENV 定义变量
6. WORKDIR 切换目录
7. EXPOSE 开放服务端口
8. 启动服务!通过 CMD  ENTRYPOINT 执行命令,执行脚本启动服务 或者 直接通过命令启动服务
   建议多条操作放在脚本中,通过 CMD  ENTRYPOINT 执行脚本,比如mysql 的配置文件

构建 httpd 镜像

mkdir /opt/apache/
cd /opt/apache/

vim Dockerfile

FROM 定义基础镜像名
MAINTAINER this is apache image <20210727> 新建维护信息
RUN yum install -y httpd
EXPOSE 80
#修改站点首页文件,将当前目录中的 index.html 复制到 /var/www/html/ 中ADD index.html /var/www/html/
ENTRYPOINT ["/usr/sbin apachectl -D FORGGROUND"]


#或者
#ENTRYPOINT ["/usr/sbin apachectl"]
#CMD ["-D","FOREGROUND"]

保存并退出
#构建新镜像,-t 指定镜像名
docker build -t apache:centos7 .

通过构建SSH镜像,远程进入容器

目的:通过构建SSH镜像远程容器

mkdir /opt/sshd   #创建dockerfile 所在工作目录
cd /opt/sshd

vim Dockerfile

FROM centos:7	#第一行必须指明基于的基础镜像
MAINTAINER this is sshd dockerfile 20210728 <duan>	 #作者信息与注释信息
#镜像的操作指令
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo '123456' | passwd --stdin root

#注释修改/etc/ssh/sshd_config文件内容: 不使用PAM认证,s/ 替换字符
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config	

#取消pam限制,指定要替换的字符串后,在操作行行首加上#,-r 使用正则		
#\\s代表正则表达式中的一个空白字符,\\s+ 可以匹配至少有一个的空格字符
RUN sed -ri '/^session\\s+required\\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd	

#生成SSH密钥认证文件,-A 指定生成密钥类型文件
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 程序
#也可以用 CMD /usr/sbin/sshd -D
#构建生成新镜像,别忘了,代表当前目录下的dockerfile文件
#FROM 的时候会检查本地有没有centos 镜像,有就用,没有就下载
cd /opt/sshd
docker build -t sshd:centos .

#发现是一层一层执行的,Docker 文件系统就是Aufs
#构建完成后查看构建出的新的镜像
docker images

#启动容器并修改root密码 ,进入容器
docker run -d -P sshd:centos
docker ps -a

# 通过ssh登录本机容器,49154 是-P指定出来的端口
ssh localhost -p 49154  


通过ssh 和 容器端口号,直接远程连接容器

Systemctl 镜像

自带的 Systemctl 有时候使用不了,如 上面钢构建的 sshd 服务,需要重新构建

-------------Systemctl镜像----------
mkdir /opt/systemctl
cd /opt/systemctl

vim Dockerfile

FROM sshd:centos  #指定基础镜像为sshd:centos,既有 sshd 服务,又有 centos7 服务
MAINTAINER this is systemctl image <duan>
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"]   不在这执行,可以在运行容器的时候指定执行命令
#执行命令的优先级
#1. docker run 时指定的命令
#2. ENTRYPOINT 指定的命令
#3. CND 指定的命令

//生成镜像
docker build -t systemd:centos .

//启动容器,并挂载宿主机目录挂载到容器中,和进行初始化
docker run --privileged -d -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init 
#--privileged:使container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
#-v 创建数据卷  ro 只读权限


docker ps -a

//进入到上面创建的sshd:centos容器中
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 
#执行 docker stop 容器ID 退出容器
#或者结尾加 & 放到后台执行 



nginx 镜像

通过本地源码压缩软件包,进行编译镜像

要把源码包和 Dockefile 文件放在同一个目录中。

----------------nginx镜像----------------
mkdir /opt/nginx
cd /opt/nginx/
cp /opt/nginx-1.12.0.tar.gz /opt/nginx

vim Dockerfile

#基于centos7基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <duan>
#添加环境包,Nginx 使用C语言写的
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 \\
--user=nginx \\
--group=nginx \\
--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到容器中,run.sh脚本中是启动nginx服务的命令,
#也可以将启动nginx 命令直接放在CMD中如:CMD ["/usr/local/nginx/sbin/nginx"]
#脚本文件一定要在Dockerfile镜像的目录中,在同一目录中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]


vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx


//创建新镜像
docker build -t nginx:centos .

docker run -d -P nginx:centos

docker ps -a

http://192.168.10.70:49160

目录结果,准备文件



nginx 服务部署成功

Tomcat 镜像

-----------------tomcat 镜像--------------------
mkdir /opt/tomcat
cd /opt/tomcat 
#将jdk  tomcat 软件包放到目录中 ,tomcat是通过 java 开发的
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 <duan>
ADD jdk-8u91-linux-x64.tar.gz /usr/local/     #将源文件复制到镜像中,如果源文件是个归档文件(压缩文件),则docker会自动帮解压
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程序


//创建新镜像,指定镜像名
docker build -t tomcat:centos .
//创建容器  执行端口
docker run -d --name tomcat01 -p 1216:8080 tomcat:centos 
 
http://192.168.10.70:1216

Mysql 镜像


----------------------------mysql镜像------------------------------------
mkdir /opt/mysqld
cd /opt/mysqld

vim Dockerfile

FROM centos:7
MAINTAINER this is mysql image <duan>
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_CHARSET=utf8  \\
-DDEFAULT_COLLATION=utf8_general_ci \\
-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 && 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 \\
--user=mysql \\
--basedir=/usr/local/mysql \\
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/libdocker部署springboot项目共享宿主机环境

docker数据管理和镜像创建dockerfile部署

docker数据管理和镜像创建dockerfile部署

Dockerfile部署镜像实例

云原生之使用Docker部署Rockylinux容器应用服务

dockerfile部署vue+springboot+redis