【Docker学习之五】Docker自定义镜像示例
环境
docker-ce-19.03.1-3.el7.x86_64
centos 7
一、创建centos+jdk+tomcat镜像
对于公用的容器比如,tomcat、nginx、mysql等应用组件可以直接使用官方的容器,不必自己创建;如果需要创建自定义容器,需要下载对应软件官网tar包进行挂载。
1、准备基础镜像和tar包
使用centos7作为基础镜像
[root@node105 ~]# docker pull centos:7
[root@node105 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 67fa590cfc1c days ago 202MB [root@node105 src]# cd /usr/local/src && ll
total
-rw-r--r--. 1 root root 9722154 Aug 25 15:47 apache-tomcat-8.5.45.tar.gz
-rw-r--r--. 1 root root 181260798 Aug 25 15:45 jdk-8u65-linux-x64.tar.gz
2、创建Dockerfile
[root@node105 src]# vi centos-jdk-tomcat-Dockerfile
#使用的基础镜像
FROM centos:
#作者信息
MAINTAINER cac2020 "cac2020@163.com" #使用ADD指令会直接对tar.gz进行解压缩,不用再单独的tar解压jdk了
ADD jdk-8u65-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5..tar.gz /usr/local #添加环境变量
ENV JAVA_HOME /usr/local/jdk1..0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin #暴露8080端口
EXPOSE #启动时运行tomcat
CMD ["/usr/local/apache-tomcat-8.5.45/bin/catalina.sh","run"]
3、使用Dockerfile创建镜像
[root@node105 src]# docker build -t centos-jdk-tomcat:0.0. . -f centos-jdk-tomcat-Dockerfile
Sending build context to Docker daemon 191MB
Step / : FROM centos:
---> 67fa590cfc1c
Step / : MAINTAINER cac2020 "cac2020@163.com"
---> Running in b48a9a1c9456
Removing intermediate container b48a9a1c9456
---> cf88aebfb290
Step / : ADD jdk-8u65-linux-x64.tar.gz /usr/local
---> a80fd8584d3e
Step / : ADD apache-tomcat-8.5..tar.gz /usr/local
---> 3951fd837bd5
Step / : ENV JAVA_HOME /usr/local/jdk1..0_65
---> Running in 8ea280c20bbe
Removing intermediate container 8ea280c20bbe
---> 5e2c39e6b557
Step / : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in 7dfbb7d72fd6
Removing intermediate container 7dfbb7d72fd6
---> 2651de66a845
Step / : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.
---> Running in 490f9dd59d99
Removing intermediate container 490f9dd59d99
---> 70ff0149c070
Step / : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
---> Running in 867f19619c72
Removing intermediate container 867f19619c72
---> 8a1b71576d7b
Step / : EXPOSE
---> Running in 13d2b33647d2
Removing intermediate container 13d2b33647d2
---> 341bc406be44
Step / : CMD ["/usr/local/apache-tomcat-8.5.45/bin/catalina.sh","run"]
---> Running in 88f261af47f4
Removing intermediate container 88f261af47f4
---> e77fdb372830
Successfully built e77fdb372830
Successfully tagged centos-jdk-tomcat:0.0.
[root@node105 src]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-jdk-tomcat 0.0.1 e77fdb372830 seconds ago 581MB
centos 67fa590cfc1c days ago 202MB
备注:
(1)-t 指定镜像的名称和tag;
(2)使用-f 指定要使用的dockerfile,如果不指定会寻找当前目录名为Dockerfile的文件
(3)上面有个 . ,这个表示当前目录,必不可少的
4、运行创建的镜像
交互方式:
#jdk
[root@node105 src]# docker run -d -it centos-jdk-tomcat:0.0.1 /bin/bash
[root@node105 src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ded73f70822e centos-jdk-tomcat:0.0. "/bin/bash" seconds ago Up seconds /tcp happy_lumiere
注意:创建容器的时候一定要使用 -it /bin/bash这种方式,要不然jdk的容器起不来。
#tomcat
[root@node105 src]# docker run -d -p 8080:8080 --name test-tomcat centos-jdk-tomcat:0.0.1
b40394ee475007969c8654e5b297f49a370d313655a8785ad3cda6a4dab81948
[root@node105 src]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b40394ee4750 centos-jdk-tomcat:0.0. "/usr/local/apache-t…" seconds ago Up seconds 0.0.0.0:->/tcp test-tomcat
a74ccebbe32e centos-jdk-tomcat:0.0. "/bin/bash" minutes ago Up minutes /tcp centos-jdk-tomcat
[root@node105 src]#
5、验证
#jdk
[root@node105 src]# docker exec -it a7 /bin/bash
[root@a74ccebbe32e /]# java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) -Bit Server VM (build 25.65-b01, mixed mode)
[root@a74ccebbe32e /]# exit
exit
#tomcat
参考:
使用Dockerfile方式创建镜像:
docker创建jdk镜像
从零开始构建一个centos+jdk7+tomcat7的镜像文件
使用-it交互方式一步一步设置最后commit创建镜像:
docker环境搭建centos+jdk+tomcat_CENTOS篇
二、supervisor
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具,比如supervisor。使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望运行的进程。
1、准备工作
(1)概念理解:
supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program。
(2)软件安装:linux本地机器需要安装supervisor,源码安装或者yum安装或者python pip安装,这里使用yum安装
#centos7下yum安装supervisor
[root@node105 local]# yum install epel-release
[root@node105 local]# yum install -y supervisor # 开机自启动
[root@node105 local]# systemctl enable supervisord
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service. # 启动supervisord服务
[root@node105 local]# systemctl start supervisord # 查看supervisord服务状态
[root@node105 local]# systemctl status supervisord
● supervisord.service - Process Monitoring and Control Daemon
Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
Active: active (running) since Sun -- :: CST; 41s ago
Process: ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=/SUCCESS)
Main PID: (supervisord)
Tasks:
Memory: 10.9M
CGroup: /system.slice/supervisord.service
└─ /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf Aug :: node105 systemd[]: Starting Process Monitoring and Control Daemon...
Aug :: node105 systemd[]: Started Process Monitoring and Control Daemon. # 查看是否存在supervisord进程
[root@node105 local]# ps -ef|grep supervisord
root : ? :: /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root : pts/ :: grep --color=auto supervisord
[root@node105 local]#
2、容器中如何同时使用ssh和tomcat 服务
(1)创建Dockerfile文件
[root@node105 docker]# vi Dockerfile
FROM centos:
MAINTAINER cac2020 "cac2020@163.com" #ssh
RUN yum install -y openssh openssh-server openssh-clients
RUN mkdir /var/run/sshd
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config
RUN sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
RUN /bin/echo 'root:123456' |chpasswd
RUN /bin/sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local #tomcat
#使用ADD指令会直接对tar.gz进行解压缩,不用再单独的tar解压jdk了
ADD jdk-8u65-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5..tar.gz /usr/local #添加环境变量
ENV JAVA_HOME /usr/local/jdk1..0_65
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
RUN java -version #安装supervisor
RUN yum install -y epel-release;yum -y install supervisor
RUN mkdir -p /etc/supervisor/
COPY supervisord.conf /etc/supervisor/ #暴露 22和8080端口
EXPOSE #运行supervisord
CMD supervisord -c /etc/supervisor/supervisord.conf
(2)配置supervisord.conf
[root@node105 docker]# vi supervisord.conf [unix_http_server]
file=/var/run/supervisor/supervisor.sock ; (the path to the socket file) [supervisord]
logfile=/var/run/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups= ; (num of main logfile rotation backups;default )
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisor/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
minfds= ; (min. avail startup file descriptors;default )
minprocs= ; (min. avail process descriptors;default ) [rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL for a unix socket [program:sshd]
command=/usr/sbin/sshd -D [program:tomcat]
command=/usr/local/apache-tomcat-8.5./bin/catalina.sh run
注意:
在这里分号;是注释符号
serverurl=unix:///var/run/supervisor/supervisor.sock : 这个建议不要修改
nodaemon=true : 设置为true
command=/usr/local/apache-tomcat-8.5.45/bin/catalina.sh run :这个必须这样写(supervisor管理tomcat必须这样启动,其他方式好像都有问题)
[root@node105 docker]# pwd
/usr/local/docker
[root@node105 docker]# ll
total
-rw-r--r--. root root Aug : apache-tomcat-8.5..tar.gz
-rw-r--r--. root root Aug : Dockerfile
-rw-r--r--. root root Aug : jdk-8u65-linux-x64.tar.gz
-rw-r--r--. root root Aug : supervisord.conf
[root@node105 docker]#
(3)创建镜像
[root@node105 docker]# docker build -t centos-ssh-tomcat:v1 .
[root@node105 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-ssh-tomcat v1 410de61dd6e6 seconds ago 852MB
centos 67fa590cfc1c days ago 202MB
(4)运行容器
[root@node105 docker]# docker run -d --name ssh-tomcat --restart=always -p : -p : centos-ssh-tomcat:v1
29e39686f8787e993f2f327983f26c3fefa1bacc1eeb0f261badb15f718a8dd7
(5)验证
#ssh
#ssh
[root@node105 docker]# ssh localhost -p
The authenticity of host '[localhost]:4426 ([::1]:4426)' can't be established.
RSA key fingerprint is SHA256:cvH5wwrGfYnd/vbchFrrxycoZ7IkftRjJZSNsxzxIzc.
RSA key fingerprint is MD5:be::5a:f3:::1c:b4:f5:c5:3d:b7::::.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:4426' (RSA) to the list of known hosts.
root@localhost's password:
[root@c1fce40e19f9 etc]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root : ? :: /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
root : ? :: /usr/sbin/sshd -D
root : ? :: sshd: root@pts/
root : pts/ :: -bash
root : pts/ :: ps -ef
[root@c1fce40e19f9 etc]# supervisorctl status
sshd RUNNING pid , uptime ::
tomcat RUNNING pid , uptime ::
[root@c1fce40e19f9 etc]# exit
logout
Connection to localhost closed.
[root@node105 docker]#
#tomcat
参考:
【Docker学习之五】Docker自定义镜像示例的更多相关文章
- Docker学习(二): 镜像的使用与构建
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Docker学习之Docker镜像基本使用
Docker学习之Docker镜像基本使用 获取镜像 命令格式:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 例如: docker pull ...
- Docker学习笔记 — Docker私有仓库搭建
Docker学习笔记 — Docker私有仓库搭建 目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2 和Mavan的管理一样,Dockers ...
- Docker学习之Docker容器基本使用
Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...
- docker学习笔记3:镜像操作(查找和下载)
一.查看本地镜像 只有下载后,镜像才会保存在本地(docker环境所在的主机),通过如下命令可以查看本地已经存在的镜像. 命令:dokcer images 上面命令列出本地所有已经存在的镜像,显示的信 ...
- Docker学习笔记 - Docker的镜像
一个容器实际上是运行在宿主机上的一个进程. 只不过在启动这个进程之前进行了一些特殊处理,让这个容器进入了一个全新的虚拟环境,与宿主机的环境分开, 所以这个进程及其子进程认为自己运行在一个独立的世界里面 ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
- Docker学习笔记之从镜像仓库获得镜像
0x00 概述 之前我们说到了,Docker 与其他虚拟化软件的一处不同就是将镜像管理纳入到了功能之中.实现虚拟化只是程序能够无缝移植的一部分,而有了镜像管理,就真正取代了我们在移植过程中的繁琐操作. ...
- docker 学习(十一) 镜像常用命令
1 创建账户,创建仓库 首先在dockerhub上有自己的账户,然后创建一个repository(如上图), 然后创建一个名字为robinfei/consumer的仓库. 2 本地镜像打标签(比 ...
随机推荐
- springBoot 日志中关于profiles设置的源码解读
在启动SpringBoot应用是看到到如下日志,于是出于好奇查看了下源代码: 首先,StartpInfoLogger类,采用jcl-over-slf4j[即Apache Common Log]中的Lo ...
- 基于 Keil MDK 移植 RT-Thread Nano
后文rtt代表RT-Thread 在官网公众号中,看到rtt发布了rtt nano,这个就很轻量级的rtos内核,把多余的驱动都裁剪了,因此移植工作量小,可以哪来学习一番,体验rtt之美 rtt现在也 ...
- RabbitMQ六种队列模式-发布订阅模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅 [本文]RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- 【C/C++】变量
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表. 变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要 ...
- Dockerfile介绍、Docker制作jdk镜像
Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用 ...
- 再谈System.BadImageFormatException
今天,当我们继续学习.NET异常处理系列时,我们将查看System.BadImageFormatException.System.BadImageFormatException与GIF或JPG无关,而 ...
- MySQL中SUM和COUNT的区别
COUNT:是对记录进行汇总,即计数 SUM:是对符合条件的数值列字段进行求和 原表数据如下: 1,当在where子句中使用Price>25时, COUNT函数返回的是符合条件的记录,SUM函数 ...
- 15-网页,网站,微信公众号基础入门(网页版MQTT,做自己的MQTT调试助手)
https://www.cnblogs.com/yangfengwu/p/11198572.html 说一下哈,,如果教程哪里看不明白...就去自己百度补充哪一部分,,学习不是死记硬背,需要会学习,永 ...
- [PHP] Laravel 5.5 使用备注
laravel-5_5文档地址:https://laravelacademy.org/category/laravel-5_5 模板变量文档: https://laravelacademy.org/p ...
- [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示
React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...