Docker镜像制作

一、Docker 镜像管理

Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。本案例将介绍如何创建 Docker 镜像。

1.1Docker镜像结构

镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各层内容及大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在Ivar/lib/docker/<storage-driver>目录中。容器其实是在镜像的最上面加了一层读写层, 在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。Docker 镜像是分层的,下面这些知识点非常重要。

(1)Dockerfile 中的每个指令都会创建一个新的镜像层;

(2)镜像层将被缓存和复用;

(3)当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;

(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

1.2Dockerfile介绍

Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由多条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译成真正的Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了Dockerfile,当有定制额外的需求时,只需在 Dockerfile 上添加或者修改指令, 重新生成镜像。

二、构建各类 Docker 镜像服务

2.1案例环境

2.2案列实施

1.构建nginx容器

(1)拉取centos镜像
复制代码
[root@localhost ~]# docker pull centos:7
(2)创建dockerfile工作目录
复制代码
[root@localhost ~]# mkdir /opt/nginx
[root@localhost ~]# cd /opt/nginx
(3)创建dockerfile
复制代码
[root@localhost nginx]# vim dockerfile 
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

RUN yum clean all
RUN yum -y install pcre-devel zlib-devel zlib gcc* make openssl-devel
ADD nginx-1.19.5.tar.gz /opt
WORKDIR /opt/nginx-1.19.5
RUN ./configure --prefix=/usr/local/nginx && make && make install
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
EXPOSE 80
EXPOSE 443
#RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
(4)编写nginx启动脚本
复制代码
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
(5)用dockerfile创建镜像
复制代码
[root@localhost nginx]# docker build -t mynginx .
(6)启动容器
复制代码
[root@localhost nginx]# docker run -d -i --name nginx01 -p 8080:80 mynginx
注意:此处不带-t选项,容器中有一个run.sh的脚本,带上-t选项,这个脚本就不执行了
或者
[root@localhost nginx]# docker run -d -it -p 8081:80 --name nginx02 -v /www/html:/web mynginx /bin/bash -c /run.sh
此处使用bash执行run.sh的脚本

或者

[root@localhost nginx]# docker run -dit -p 8082:80 --name nginx03 -v /www/html:/web mynginx
此处为容器创建了一个容器卷,并挂在到docker主机的/www目录下

或者
[root@localhost ~]# mkdir /nginx
[root@localhost ~]# cp /opt/nginx/nginx.conf /nginx
[root@localhost nginx]# docker run -dit \
-p 8083:80 \
-v /www/html:/web \
-v /nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf \
--name nginx04 \
mynginx \
/bin/bash -c /run.sh

[root@localhost nginx]# echo "web test">/www/html/index.html
(7)访问nginx网站

http://192.168.10.101:8083

2.构建Tomcat容器

(1)创建工作目录
复制代码
[root@localhost ~]# mkdir /opt/tomcat/
[root@localhost ~]# cd /opt/tomcat/
(2)创建dockerfile文件
复制代码
[root@localhost tomcat]# vim dockerfile

FROM centos:7
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV JAVA_BIN /usr/local/jdk1.8.0_91
ENV JRE_HOME /usr/local/jdk1.8.0_91
ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin:/usr/local/jdk1.8.0_91/jre/bin
ENV CLASSPATH /usr/local/jdk1.8.0_91/jre/bin:/usr/local/jdk1.8.0_91/lib:/usr/local/jdk1.8.0_91/jre/lib/charsets.jar

ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
(3)创建启动脚本
复制代码
[root@localhost tomcat]# vim run.sh 
#!/bin/bash
/usr/local/tomcat/bin/startup.sh
tailf /run

备注:
tailf /run //让启动脚本始终运行
(4)用dockerfile生成镜像
复制代码
[root@localhost tomcat]# docker build -t mytomcat .
(5)运行容器
复制代码
[root@localhost tomcat]# docker run -d -i -p 8080:8080 --name tomcat01 mytomcat
(6)访问tomcat网站

http://192.168.10.101:8080

3.构建mysql容器

(1)创建工作目录
复制代码
[root@localhost ~]# mkdir /opt/mysql
(2)创建dockerfile文件
复制代码
[root@localhost ~]# cd /opt/mysql/
[root@localhost mysql]# vim dockerfile
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
#ADD CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

RUN yum clean all
RUN yum -y install mariadb mariadb-server
RUN chown -R mysql:mysql /var/lib/mysql
ADD init.sh /init.sh
RUN chmod 775 /init.sh
RUN /init.sh
EXPOSE 3306
CMD ["mysqld_safe"]
(3)编写mysql初始化脚本
复制代码
[root@localhost mysql]# vim init.sh 
#!/bin/bash 
mysql_install_db --user=mysql
sleep 3
mysqld_safe &
sleep 3
mysqladmin -u "root" password "123456"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
mysql -uroot -p123456 -e "flush privileges;"
(4)生成镜像
复制代码
[root@localhost mysql]# docker build -t mysql .
(5)创建容器
复制代码
[root@localhost mysql]# docker run -id -p 3306:3306 mysql

[root@localhost mysql]# yum -y install mysql
[root@localhost mysql]# mysql -uroot -p123456 -h 192.168.10.101 -P 3306

4.构建php

(1)创建工作目录
复制代码
[root@localhost ~]# mkdir php
(2)创建dockerfile(yum安装安装)
复制代码
FROM centos:7
MAINTAINER jacker
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all

RUN yum install epel-release -y && \
    yum install -y php php-fpm php-common php-mysqlnd

EXPOSE 9000
CMD ["php-fpm"]
(3)生成镜像
复制代码
[root@localhost php]# docker build -t myphp .
(4)启动容器
复制代码
[root@localhost php]# docker run -d -i -p 9000:9000 myphp /bin/bash

5.用dockerfile制作SSHD镜像

复制代码
[root@localhost sshd]# vim dockerfile 
FROM centos:7
#RUN 
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
RUN yum -y install passwd openssl openssh-server openssh-clients net-tools
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN echo "aptech" | passwd --stdin root
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]


[root@localhost sshd]# docker build -t sshd .
[root@localhost sshd]# docker run -d -p 11022:22 sshd
相关推荐
Ghost Face...9 分钟前
深入解析U-Boot命令系统
linux·运维·服务器
ajax_beijing13 分钟前
当同一个弹性云服务器所在子网同时设置了snat和弹性公网IP时,会优先使用哪个
linux·运维·服务器
eddy-原13 分钟前
运维自动化与监控体系综合实践作业
运维·自动化·1024程序员节
聆风吟º14 分钟前
Linux远程控制Windows桌面的cpolar实战指南
linux·运维·windows
随风语15 分钟前
云计算与服务器
运维·服务器·云计算
wanhengidc16 分钟前
服务器会遭受到哪些网络攻击
运维·服务器
轮子大叔17 分钟前
如何自建内网穿透(FRP)服务器
运维·服务器
love530love22 分钟前
【笔记】Podman Desktop 部署 开源数字人 HeyGem.ai
人工智能·windows·笔记·python·容器·开源·podman
dessler1 小时前
Elasticsearch(ES)Cerebro部署和使用
linux·运维·elasticsearch