環境
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 7 67fa590cfc1c 4 days ago 202MB [root@node105 src]# cd /usr/local/src && ll total 186528 -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:7 #作者信息 MAINTAINER cac2020 "cac2020@163.com" #使用ADD指令會直接對tar.gz進行解壓縮,不用再單獨的tar解壓jdk了 ADD jdk-8u65-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.45.tar.gz /usr/local #添加環境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_65 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.45 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin #暴露8080端口 EXPOSE 8080 #啟動時運行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.1 . -f centos-jdk-tomcat-Dockerfile Sending build context to Docker daemon 191MB Step 1/10 : FROM centos:7 ---> 67fa590cfc1c Step 2/10 : MAINTAINER cac2020 "cac2020@163.com" ---> Running in b48a9a1c9456 Removing intermediate container b48a9a1c9456 ---> cf88aebfb290 Step 3/10 : ADD jdk-8u65-linux-x64.tar.gz /usr/local ---> a80fd8584d3e Step 4/10 : ADD apache-tomcat-8.5.45.tar.gz /usr/local ---> 3951fd837bd5 Step 5/10 : ENV JAVA_HOME /usr/local/jdk1.8.0_65 ---> Running in 8ea280c20bbe Removing intermediate container 8ea280c20bbe ---> 5e2c39e6b557 Step 6/10 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ---> Running in 7dfbb7d72fd6 Removing intermediate container 7dfbb7d72fd6 ---> 2651de66a845 Step 7/10 : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.45 ---> Running in 490f9dd59d99 Removing intermediate container 490f9dd59d99 ---> 70ff0149c070 Step 8/10 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin ---> Running in 867f19619c72 Removing intermediate container 867f19619c72 ---> 8a1b71576d7b Step 9/10 : EXPOSE 8080 ---> Running in 13d2b33647d2 Removing intermediate container 13d2b33647d2 ---> 341bc406be44 Step 10/10 : 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.1 [root@node105 src]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos-jdk-tomcat 0.0.1 e77fdb372830 51 seconds ago 581MB centos 7 67fa590cfc1c 4 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.1 "/bin/bash" 6 seconds ago Up 4 seconds 8080/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.1 "/usr/local/apache-t…" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp test-tomcat a74ccebbe32e centos-jdk-tomcat:0.0.1 "/bin/bash" 9 minutes ago Up 9 minutes 8080/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) 64-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 2019-08-25 16:48:26 CST; 41s ago Process: 19056 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS) Main PID: 19057 (supervisord) Tasks: 1 Memory: 10.9M CGroup: /system.slice/supervisord.service └─19057 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf Aug 25 16:48:26 node105 systemd[1]: Starting Process Monitoring and Control Daemon... Aug 25 16:48:26 node105 systemd[1]: Started Process Monitoring and Control Daemon. # 查看是否存在supervisord進程 [root@node105 local]# ps -ef|grep supervisord root 19057 1 0 16:48 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 19061 9949 0 16:50 pts/0 00:00:00 grep --color=auto supervisord [root@node105 local]#
2、容器中如何同時使用ssh和tomcat 服務
(1)創建Dockerfile文件
[root@node105 docker]# vi Dockerfile FROM centos:7 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.45.tar.gz /usr/local #添加環境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_65 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.45 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 22 8080 #運行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=10 ; (num of main logfile rotation backups;default 10) 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=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) [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.45/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 186520 -rw-r--r--. 1 root root 9722154 Aug 25 17:09 apache-tomcat-8.5.45.tar.gz -rw-r--r--. 1 root root 1269 Aug 25 17:02 Dockerfile -rw-r--r--. 1 root root 181260798 Aug 25 17:09 jdk-8u65-linux-x64.tar.gz -rw-r--r--. 1 root root 1106 Aug 25 17:08 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 21 seconds ago 852MB centos 7 67fa590cfc1c 4 days ago 202MB
(4)運行容器
[root@node105 docker]# docker run -d --name ssh-tomcat --restart=always -p 4426:22 -p 82:8080 centos-ssh-tomcat:v1 29e39686f8787e993f2f327983f26c3fefa1bacc1eeb0f261badb15f718a8dd7
(5)驗證
#ssh
#ssh [root@node105 docker]# ssh localhost -p 4426 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:08:5a:f3:76:27:1c:b4:f5:c5:3d:b7:42:84:39:16. 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 1 0 0 09:23 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf root 8 1 0 09:23 ? 00:00:00 /usr/sbin/sshd -D root 9 8 0 09:24 ? 00:00:00 sshd: root@pts/0 root 11 9 0 09:24 pts/0 00:00:00 -bash root 28 11 0 09:25 pts/0 00:00:00 ps -ef [root@c1fce40e19f9 etc]# supervisorctl status sshd RUNNING pid 8, uptime 0:02:03 tomcat RUNNING pid 8, uptime 0:02:58 [root@c1fce40e19f9 etc]# exit logout Connection to localhost closed. [root@node105 docker]#
#tomcat
參考: