赞
踩
Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。本案例将介绍如何创建 Docker 镜像。
镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各层内容及大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在Ivar/lib/docker/<storage-driver>目录中。容器其实是在镜像的最上面加了一层读写层, 在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。Docker 镜像是分层的,下面这些知识点非常重要。
(1)Dockerfile 中的每个指令都会创建一个新的镜像层;
(2)镜像层将被缓存和复用;
(3)当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。
Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由多条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译成真正的Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了Dockerfile,当有定制额外的需求时,只需在 Dockerfile 上添加或者修改指令, 重新生成镜像。
[root@localhost ~]# docker pull centos:7
- [root@localhost ~]# mkdir /opt/nginx
- [root@localhost ~]# cd /opt/nginx
- [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"]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- [root@localhost nginx]# vim run.sh
- #!/bin/bash
- /usr/local/nginx/sbin/nginx
[root@localhost nginx]# docker build -t mynginx .
- [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
http://192.168.10.101:8083
- [root@localhost ~]# mkdir /opt/tomcat/
- [root@localhost ~]# cd /opt/tomcat/
- [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"]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- [root@localhost tomcat]# vim run.sh
- #!/bin/bash
- /usr/local/tomcat/bin/startup.sh
- tailf /run
-
- 备注:
- tailf /run //让启动脚本始终运行
[root@localhost tomcat]# docker build -t mytomcat .
[root@localhost tomcat]# docker run -d -i -p 8080:8080 --name tomcat01 mytomcat
http://192.168.10.101:8080
[root@localhost ~]# mkdir /opt/mysql
- [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"]
- [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;"
[root@localhost mysql]# docker build -t mysql .
- [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
[root@localhost ~]# mkdir php
- 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"]
[root@localhost php]# docker build -t myphp .
[root@localhost php]# docker run -d -i -p 9000:9000 myphp /bin/bash
- [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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。