(三)Docker----基础镜像(制作镜像),实现动静分离,本地镜像上传docker仓库

一. Docker 镜像与制作

从镜像大小上面来说,一个比较小的镜像只有十几 MB,而内核文件需要一百多兆, 因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的 rootfs,即系统正常运行所必须的用户空间的文件系统,比如/dev/,/proc,/bin,/etc 等目录,所以容器当中基本是没有/boot目录的,而/boot 当中保存的就是与内核相关的文件和目录。

为什么没有内核
由于容器启动和运行过程中是直接使用了宿主机的内核,所以没有直接调用过物理硬件,所以也不会涉及到硬件驱动,因此也用不上内核和驱动,另外有内核的那是虚拟机

Docker 制作类似于虚拟机的镜像制作,即按照公司的实际业务务求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生产实例,这样可以极大的简化相同环境的部署工作
Docker 的镜像制作分为手动制作和自动制作(基于 DockerFile)

手动制作nginx 镜像(不建议)

下载镜像并初始化系统
基于某个基础镜像之上重新制作,因此需要先有一个基础镜像,本次使用官方提供的 centos 镜像为基础:

[root@docker-server1 ~]# docker pull centos
[root@docker-server1 ~]# docker run -it docker.io/centos /bin/bash 
[root@37220e5c8410 /]# yum install wget -y
[root@37220e5c8410 /]# cd /etc/yum.repos.d/

	#更改 yum 源
[root@37220e5c8410 yum.repos.d]# rm -rf ./* 
[root@37220e5c8410 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo 
http://mirrors.aliyun.com/repo/Centos-7.repo

[root@37220e5c8410 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo 
http://mirrors.aliyun.com/repo/epel-7.repo

yum 安装并配置 nginx

	#yum 安装 nginx
[root@37220e5c8410 yum.repos.d]# yum install nginx –y 
	
	#安装常用命令
[root@37220e5c8410 yum.repos.d]# yum install -y vim wget pcre pcre-devel zlib \
zlib-devel openssl openssl-devel iproute net-tools iotop 

关闭 nginx 后台运行

	#关闭 nginx 后台运行
[root@37220e5c8410 yum.repos.d]# vim /etc/nginx/nginx.conf 
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
daemon off; #关闭后台运行

自定义 web 页面

[root@37220e5c8410 yum.repos.d]# vim /usr/share/nginx/html/index.html
[root@37220e5c8410 yum.repos.d]# cat /usr/share/nginx/html/index.html 
Docker Yum Nginx #自定义 web 界面

提交为镜像
在宿主机基于容器 ID 提交为镜像
另一个窗口,不能关闭上一个窗口

     -a指定邮箱
     -m 备注
     -c 指定原生的docker指令
[root@docker-server1 ~]# docker commit -m "nginx image" f5f8c13d0f9f entos-nginx:v1

在这里插入图片描述

带 tag 的镜像提交
提交的时候标记 tag 号: #标记 tag 号,生产当中比较长用,后期可以根据 tag 标记启动不同版本启动 image启动

[root@docker-server1 ~]# docker commit -m "nginx image" f5f8c13d0f9f centos-nginx:v1

从自己镜像启动容器

[root@docker-server1 ~]# docker run -d -p 80:80 --name my-centos-nginx jack/centos-nginx /usr/sbin/nginx
ce4ee8732a0c4c6a10b85f5463396b27ba3ed120b27f2f19670fdff3bf5cdb62

访问测试
在这里插入图片描述

DockerFile 制作nginx 镜像(建议)

DockerFile 可以说是一种可以被 Docker 程序解释的脚本,DockerFile 是由一条条的命令组成的,每条命令对应 linux 下面的一条命令,Docker 程序将这些DockerFile 指令再翻译成真正的 linux 命令,其有自己的书写方式和支持的命令,Docker 程序读取 DockerFile 并根据指令生成 Docker 镜像,相比手动制作镜像的方式,DockerFile 更能直观的展示镜像是怎么产生的,有了 DockerFile,当后期有额外的需求时,只要在之前的 DockerFile 添加或者修改响应的命令即可重新生成新的 Docke 镜像,避免了重复手动制作镜像的麻烦

在这里插入图片描述
下载镜像并初始化系统

docker pull centos

docker run -it docker.io/centos /bin/bash 

cd /opt/ #创建目录环境

mkdir dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv

目录结构按照业务类型或系统类型等方式划分,方便后期镜像比较多的时候进行分类

cd dockerfile/web/nginx/

pwd
/opt/dockerfile/web/nginx

编写 Dockerfile
vim ./Dockerfile #生成的镜像的时候会在执行命
令的当前目录查找 Dockerfile 文件,所以名称不可写错,而且 D 必须大写

vim  Dockerfile
#My Dockerfile
	"#"为注释

	#第一行先定义基础镜像,后面的本地有效的镜像名,
	如果本地没有会从远程仓库下载,第一行很重要
	#FROM 是父镜像
FROM centos 
	#镜像维护者的信息
MAINTAINER qcq 123456@qq.com

#USER #容器运行时的用户名和 UID

#WORKDIR /a #当前工作目录
#WORKDIR b #指定工作目录,最终为/a/b

#VOLUME ["/dir_1", "/dir_2" ..] 设置容器挂载主机目录

	#容器环境变量
ENV HOST 192.168.1.120

	# RUN 命令也会使用这面指定的用户执行
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
		#自动解压压缩包
			#包文件导入
	ADD nginx-1.10.3.tar.gz /usr/local/src/ 
	RUN cd /usr/local/src/nginx-1.10.3 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install
	RUN cd /usr/local/nginx/
		#将配置好的文件导入
	ADD nginx.conf /usr/local/nginx/conf/nginx.conf
	RUN useradd nginx -s /sbin/nologin

RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
RUN echo "test nginx page" > /usr/local/nginx/html/index.html

EXPOSE 80 443 #向外开放的端口

	#运行的命令,每个 Dockerfile 只能有一条,如果有多条则只有最后一条被执行
CMD ["nginx"] 

Dockerfile 构建的镜像里面的 CMD 命令,即指定的命令优先级更高,Dockerfile 的优先级较低一些

准备源码包与配置文件

	 #配置文件关闭后台运行
cp /usr/local/nginx/conf/nginx.conf .
	 #nginx 源码包
cp /usr/local/src/nginx-1.10.3.tar.gz .

执行镜像构建

如果Dockerfile有改变重新构建就可以

	# 最后面是在那个目录下
docker build -it jack/nginx-1.10.3:v1 /opt/dockerfile/web/nginx/

在这里插入图片描述
开始构建
在这里插入图片描述
查看是否生成本地镜像
docker images

从镜像启动容器

docker run -d -p 80:80 --name yum-nginx nginx:v2 /usr/sbin/nginx
	#只是测试一下
docker run -it --rm -p 80:80 --name yum-nginx nginx:v2 bash

在这里插入图片描述

手动制作编译版本 nginx 镜像(不建议)

过程为在 centos 基础镜像之上手动编译安装 nginx,然后再提交为镜像。

下载镜像并初始化系统

docker pull centos
docker run -it docker.io/centos /bin/bash 、

[root@86a48908bb97 /]# yum install wget -y
[root@86a48908bb97 /]# cd /etc/yum.repos.d/
	#更改 yum 源
[root@86a48908bb97 yum.repos.d]# rm -rf ./* 
[root@86a48908bb97 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-7.repo

[root@86a48908bb97 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-7.repo

编译安装 nginx

	#安装基础包
[root@86a48908bb97 yum.repos.d]# yum install -y vim wget tree lrzsz gcc gcc-c++ \
automake pcre pcre-devel zlib zlib-devel openssl \
openssl-devel iproute net-tools iotop 

[root@86a48908bb97 yum.repos.d]# cd /usr/local/src/
[root@86a48908bb97 src]# wget http://nginx.org/download/nginx-1.10.3.tar.gz
[root@86a48908bb97 src]# tar xvf nginx-1.10.3.tar.gz
[root@86a48908bb97 src]# cd nginx-1.10.3
[root@86a48908bb97 nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --withhttp_sub_module
[root@86a48908bb97 nginx-1.10.3]# make && make install
[root@86a48908bb97 nginx-1.10.3]# cd /usr/local/nginx/

关闭 nginx 后台运行

[root@86a48908bb97 nginx]# vim conf/nginx.conf
user nginx;
worker_processes auto;
daemon off;
	#创建软连
[root@86a48908bb97 nginx]# ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx 

创建用户及授权

[root@86a48908bb97 nginx]# useradd nginx -s /sbin/nologin
[root@86a48908bb97 nginx]# chown nginx.nginx /usr/local/nginx/ -R

自定义 web 界面

[root@86a48908bb97 nginx]# echo "My Nginx Test Page" > 
/usr/local/nginx/html/index.html

提交为镜像:

[root@docker-server1 ~]# docker commit -m "test nginx" 86a48908bb97 jack/nginxtest-image
sha256:fce6e69410e58b8e508c7ffd2c5ff91e59a1144847613f691fa5e80bb68efbfa


[root@docker-server1 ~]# docker commit -m "test nginx" 86a48908bb97 jack/nginx-test-image:v1
sha256:474cad22f28b1e6b17898d87f040dc8d1f3882e2f4425c5f21599849a3d3c6a2

从自己的镜像启动容器

[root@docker-server1 ~]# docker run -d -p 80:80 --name my-centos-nginx 
jack/nginx-test-image:v1 /usr/sbin/nginx
8042aedec1d6412a79ac226c9289305087fc062b0087955a3a0a609c891e1122

访问测试
查看 Nginx 访问日志:在容器当中

装数据库

docker run -it -p 3306:3306 -d  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.34

在这里插入图片描述
在另一个窗口打开

在另一个机器上安装客户端
在这里插入图片描述
在这里插入图片描述

二. 构建基础镜像:基础的命令等

作用:用于制作指定镜像前的操作
也就是会将这个镜像提交为一个base基础镜像
制作其他镜像以这个镜像为基础

缺点:如果给最上面的镜像加东西
就得把下面所有的镜像重新构建build
在这里插入图片描述

1. 基础镜像

vim /opt/centos/Dockerfile
FROM centos

RUN yum install  vim iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl  openssl-devel zip unzip zlib-devel  net-tools lrzsz tree  telnet lsof tcpdump wget libevent libevent-devel bc  systemd-devel bash-completion traceroute  -y

RUN useradd nginx -u 1101 && useradd tomcat -u 1102
  #修改 时区
RUN rm -rf /etc/localtime &&  ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

构建镜像

		在本地
docker build -t centos-base:v1 .

构建镜像---->脚本
在这里插入图片描述
执行bash build-command.sh

最后测试:主要是命令—时区

docker  run -it --rm centos-base:v1 bash

2. 构建jdk镜像

cd /opt/web/jdk

	上传 jdk 二进制包
rz

[root@ jdk]#vim Dockerfile 
	#父镜像为centos-base:v1
FROM centos-base:v1
	该文件必须在本目录下
ADD jdk-8u211-linux-x64.tar.gz /usr/local/src  
RUN ln -sv /usr/local/src/jdk1.8.0_211 /usr/local/jdk
	该文件必须在本目录下
ADD profile /etc/profile                                                                                                                       
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin

通过脚本构建

[root@docker-server1 jdk]# cat build-command.sh 
#!/bin/bash
docker build -t jdk-base:v1 .

最后测试

docker  run -it --rm jdk-base:v1 bash

在这里插入图片描述

将镜像上传到 harbor

[root@docker-server1 jdk]# docker push 192.168.10.205/centos/centos-7.2.1511-
jdk1.7.0.79

镜像仓库验证

从其他 docker 客户端下载镜像并启动 JDK 容器: #启动的时候本地没有镜像,会从仓库下载,然后从镜像启动容器

在这里插入图片描述

3. 构建 tomcat Base 镜像

编辑 Dockerfile

[root@docker-server1 tomcat8-base]# pwd
/opt/dockerfile/system/centos/tomcat8-base
[root@docker-server1 tomcat8-base]# cat Dockerfile 
#Tomcat Base Image
FROM centos-7.5-jdk:v1

ADD apache-tomcat-8.0.49.tar.gz /apps 
RUN ln -sv /apps/apache-tomcat-8.0.49 /apps/tomcat && mkdir -p /data/tomcat/webapps 

上传 tomcat 压缩包

[root@docker-server1 tomcat8-base]# ll apache-tomcat-8.0.49.tar.gz 
-rw-r--r-- 1 root root 9413703 Jul 2 10:06 apache-tomcat-8.0.49.tar.gz

通过脚本构建 tomcat 基础镜像

[root@docker-server1 tomcat8-base]# cat build-command.sh 
#!/bin/bash
docker build -t tomcat-base:v1 .

执行构建

在这里插入图片描述
测试:端口映射

docker  run -it --rm -p 8080:8080 tomcat-base:v1 bash

在这里插入图片描述

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

tomcat构建业务镜像 1

创建 tomcat-app1 和 tomcat-app2 两个目录,代表不同的两个基于 tomcat 的业务

准备 Dockerfile

[root@docker-server1 tomcat-app1]# pwd
/opt/dockerfile/system/centos/tomcat-app1

[root@docker-server1 tomcat-app1]# cat Dockerfile 
#Tomcat Web Image
FROM tomcat-base:v1 

ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
		#将数据与配置分开写
RUN mkdir /data/tomcat/webapps/myapp/

ADD myapp/* /data/tomcat/webapps/myapp/

ADD server.xml  /apps/tomcat/conf
	#增加权限
RUN chown -R tomcat.tomcat /apps/tomcat/ /apps/apache-tomcat-8.5.42/  /data/tomcat/

CMD ["/apps/tomcat/bin/run_tomcat.sh"]

EXPOSE 8080 8009

需要修改server.xml文件

也就是修改<Host目录
	# 前提是自己配置好s
ADD server.xml /apps/tomcat/conf

在这里插入图片描述

准备自定义 myapp 页面

mkdir myapp
echo "Tomcat Web Page1" > myapp/index.html

cat myapp/index.html 
Tomcat Web Page1

准备容器启动执行脚本

[root@docker-server1 tomcat-app1]# cat run_tomcat.sh 
#!/bin/bash
echo "1.1.1.1 abc.test.com" >> /etc/hosts
echo "nameserver 223.5.5.5" > /etc/resolv.conf
/apps/tomcat/bin/catalina.sh start
su - tomcat -c "tail -f /etc/hosts"

chmod +x run_tomcat.sh

准备构建脚本:

[root@docker-server1 tomcat-app1]# cat build-command.sh 
#!/bin/bash
docker build -t tomcat-web:app1 .

执行构建
在这里插入图片描述
从镜像启动容器测试: 不需要加bash

[root@docker-server1 tomcat-app1]# docker run -it -d -p 8888:8080 tomcat-web:app1

访问测试
在这里插入图片描述

tomcat 构建业务镜像 2

准备 Dockerfile

[root@docker-server1 tomcat-app2]# pwd
/opt/dockerfile/system/centos/tomcat-app2
[root@docker-server1 tomcat-app2]# cat Dockerfile 
#Tomcat Web2 Image
FROM tomcat-base:v1
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD myapp/* /apps/tomcat/webapps/myapp/
RUN chown www.www /apps/ -R
CMD ["/apps/tomcat/bin/run_tomcat.sh"]
EXPOSE 8080 8009

准备自定义页面

[root@docker-server1 tomcat-app2]# mkdir myapp
[root@docker-server1 tomcat-app2]# echo "Tomcat Web Page2" > myapp/index.html
[root@docker-server1 tomcat-app2]# cat myapp/index.html 
Tomcat Web Page2

准备容器启动脚本

[root@docker-server1 tomcat-app2]# cat run_tomcat.sh 
#!/bin/bash
echo "1.1.1.1 abc.test.com" >> /etc/hosts
echo "nameserver 223.5.5.5" > /etc/resolv.conf
su - www -c "/apps/tomcat/bin/catalina.sh start"
su - www -c "tail -f /etc/hosts"

准备构建脚本

[root@docker-server1 tomcat-app2]# cat build-command.sh 
#!/bin/bash
docker build -t tomcat-web:app2 .

执行构建:

在这里插入图片描述
从镜像启动容器

[root@docker-server1 tomcat-app2]# docker run -it -d -p 8889:8080 tomcat-web:app2 

访问测试

简单方法直接复制

cd /opt/dockerfile/web/tomcat/
mkdir tomcat-app2/
cp tomcat-app1/* tomcat-app2/ -pv

cd tomcat-app2/
vim myapp/index.html 
Tomcat Web Page2
cat tomcat-app2/build-command.sh
#!/bin/bash
docker build -t tomcat-app2-base:v1 .
docker run -it -d -p 8889:8080 tomcat-app2-base:v1
如果失败 给后面加一个 bash

三. haproxy 镜像

前提准备两个页面
在这里插入图片描述

准备 Dockerfile

[root@docker-server1 haproxy]# pwd
/opt/dockerfile/system/centos/haproxy
[root@docker-server1 haproxy]# cat Dockerfile 
FROM centos-base:v1                                                                                                                            

RUN yum install make -y

ADD haproxy-1.8.17.tar.gz /usr/local/src

RUN cd /usr/local/src/haproxy-1.8.17 && make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy && cp haproxy /usr/sbin/ && mkdir /usr/local/haproxy/run 

ADD haproxy.cfg /etc/haproxy/

ADD run_haproxy.sh /usr/bin

EXPOSE 80 9999

CMD ["/usr/bin/run_haproxy.sh"]

准备 haproxy 源码文件:

准备 haproxy 配置文件

[root@docker-server1 haproxy]# cat haproxy.cfg 
global
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
#打开这项功能
stats uri /haproxy-status
stats auth haadmin:123456

listen web_port
bind 0.0.0.0:80
mode http
log global
balance roundrobin
server web1 192.168.100.101:8888 check inter 3000 fall 2 rise 5
server web2 192.168.100.101:8889 check inter 3000 fall 2 rise 5

运行脚本

cat run_haproxy.sh 
#!/bin/bash
haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts

chmod +x run_haproxy.sh

准备构建脚本

[root@docker-server1 haproxy]# cat build-command.sh 
#!/bin/bash
docker build -t centos-haproxy-base:7.5-1.8.12 .

执行构建 haproxy 镜像
从镜像启动容器:

[root@docker-server1 haproxy]# docker run -it -d -p80:80 -p9999:9999 centos-haproxy-base:7.5-1.8.12

脚本如果不成功: 启动
haproxy  -f /etc/haproxy/haproxy.cfg 

web 访问验证
在这里插入图片描述

基于官方apline基础镜像制作

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

基于官方Ubuntu基础镜像制作

在这里插入图片描述

四. 实现动静分离

在这里插入图片描述

首先在本机实现tomcat镜像
并且在web界面访问成功
然后通过镜像打包

docker save tomcat-app1:v1 > /opt/tomcat-app1.tar.gz
docker save tomcat-app2:v1 > /opt/tomcat-app2.tar.gz

将镜像分别拷贝到101和102

scp 

然后在主机101和102
分别导入镜像

101
docker load -i /opt/tomcat-app1.tar.gz

	在102
docker load -i /opt/tomcat-app2.tar.gz

在100的haproxy配置后端两个tomcat的地址

最后测试

切记里面的iptables规则

一般需要备份
iptables-restore < iptables-rule.txt

五. 本地镜像上传至官方 docker 仓库

1. 阿里云

http://cr.console.aliyun.com

  1. 准备账户
    登录到 docker hub 创建官网创建账户,登录后点击 settings 完善账户信息

在这里插入图片描述
在这里插入图片描述
然后在管理中看具体操作
在这里插入图片描述

登陆
在这里插入图片描述
打标签
在这里插入图片描述
上传
在这里插入图片描述
在这里插入图片描述

下载
在这里插入图片描述

2.docker hub

https://hub.docker.com/

在虚拟机使用自己的账号登录
docker login https://hub.docker.com/
在这里插入图片描述
在这里插入图片描述

查看认证信息

登录成功之后会在当前目录生成一个隐藏文件用于保存登录认证信息

给镜像做 tag 并开始上传

docker images #查看镜像 ID
#为镜像做标记

docker tag 678e2f074b0d docker.io/zhangshijie/centos-nginx

上传至仓库

docker login #默认即登录到 docker 官方网站

docker push docker.io/zhangshijie/centos-nginx

在这里插入图片描述

下载
在这里插入图片描述

本地hub仓库(建议)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值