文章目录
- 一. Docker 镜像与制作
- 手动制作nginx 镜像(不建议)
- DockerFile 制作nginx 镜像(建议)
- 手动制作编译版本 nginx 镜像(不建议)
- 提交为镜像:
- 装数据库
- 二. 构建基础镜像:基础的命令等
- 1. 基础镜像
- 2. 构建jdk镜像
- 3. 构建 tomcat Base 镜像
- tomcat构建业务镜像 1
- tomcat 构建业务镜像 2
- 简单方法直接复制
- 三. haproxy 镜像
- 基于官方apline基础镜像制作
- 基于官方Ubuntu基础镜像制作
- 四. 实现动静分离
- 切记里面的iptables规则
- 五. 本地镜像上传至官方 docker 仓库
- 1. 阿里云
- 2.docker hub
一. 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 /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 /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
编写 Dockerfilevim ./Dockerfile
#生成的镜像的时候会在执行命
令的当前目录查找 Dockerfile 文件,所以名称不可写错,而且 D 必须大写
vim Dockerfile
#My Dockerfile
"#"为注释
#第一行先定义基础镜像,后面的本地有效的镜像名,
如果本地没有会从远程仓库下载,第一行很重要
#FROM 是父镜像
FROM centos
#镜像维护者的信息
MAINTAINER qcq
#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 /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
最后测试:主要是命令—时区
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
#!/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
#!/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 " >> /etc/hosts
echo "nameserver 223.5.5.5" > /etc/resolv.conf
/apps/tomcat/bin/ start
su - tomcat -c "tail -f /etc/hosts"
chmod +x run_tomcat.sh
准备构建脚本:
[root@docker-server1 tomcat-app1]# cat
#!/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 " >> /etc/hosts
echo "nameserver 223.5.5.5" > /etc/resolv.conf
su - www -c "/apps/tomcat/bin/ start"
su - www -c "tail -f /etc/hosts"
准备构建脚本:
[root@docker-server1 tomcat-app2]# cat
#!/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/
#!/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
#!/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. 阿里云
- 准备账户:
登录到 docker hub 创建官网创建账户,登录后点击 settings 完善账户信息
然后在管理中看具体操作
登陆
打标签
上传
下载
2.docker hub
在虚拟机使用自己的账号登录:
docker login https:///
查看认证信息:
登录成功之后会在当前目录生成一个隐藏文件用于保存登录认证信息
给镜像做 tag 并开始上传:
docker images
#查看镜像 ID
#为镜像做标记
docker tag 678e2f074b0d /zhangshijie/centos-nginx
上传至仓库
docker login #默认即登录到 docker 官方网站
docker push /zhangshijie/centos-nginx
下载
本地hub仓库(建议)