Docker 搭建中小企业开发、测试生产环境--my vision
目录
一、使用 Docker 搭建 Tomcat 运行环境
1.Docker与虚拟机
2.搭建过程
2.1 准备宿主系统
准备一个 CentOS 7操作系统,具体要求如下:
- 必须是 64 位操作系统
- 建议内核在 3.8 以上
通过以下命令查看您的 CentOS 内核:
# uname -r
[root@daring ~]# uname -r
3.10.0-327.el7.x86_64
2.2 安装Docker
#yum install docker
可使用以下命令,查看 Docker 是否安装成功:
#docker version
[root@daring ~]# docker version
Client:
Version: 1.10.3
API version: 1.22
Package version: docker-common-1.10.3-44.el7.centos.x86_64
Go version: go1.4.2
Git commit: 9419b24-unsupported
Built: Fri Jun 24 12:09:49 2016
OS/Arch: linux/amd64
Server:
Version: 1.10.3
API version: 1.22
Package version: docker-common-1.10.3-44.el7.centos.x86_64
Go version: go1.4.2
Git commit: 9419b24-unsupported
Built: Fri Jun 24 12:09:49 2016
OS/Arch: linux/amd64
若输出了 Docker 的版本号,则说明安装成功了,可通过以下命令启动 Docker 服务:
#systemctl start docker.service
一旦 Docker 服务启动完毕,就可以开始使用 Docker 了。
2.3 下载镜像
以 CentOS 为例,下载一个 CentOS 的镜像:
#docker pull centos:7.2.1511
下载完成后,使用命令查看本地镜像列表:
#docker images
#docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos 7.2.1511 83ee614b834e 9 weeks ago 194.6 MB
[root@daring ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/jasonperma/centos6_http_ssh latest 2460b63219d7 7 days ago 291.9 MB
centos http b097bfe56b56 12 days ago 291.7 MB
centos7 latest 50dae1ee8677 2 weeks ago 196.7 MB
docker.io/centos latest 50dae1ee8677 2 weeks ago 196.7 MB
docker.io/centos centos6 cf2c3ece5e41 5 weeks ago 194.6 MB
2.4 启动容器
容器是在镜像的基础上来运行的,一旦容器启动了,我们就可以登录到容器中,安装自己所需的软件或应用程序。
本例中,所有安装程序都放在了宿主机的/root/software/
目录下,现在需要将其挂载到容器的/mnt/software/
目录下。
#pwd
/root/software
#ls
apache-tomcat-7.0.54.tar.gz jdk-7u65-linux-x64.gz
[root@daring software]# pwd
/root/software
[root@daring software]# ls
apache-tomcat-7.0.54.tar.gz jdk-7u65-linux-x64.gz
[root@daring software]#
使用以下命令即可启动容器:
#docker run -it -v /root/software/:/mnt/software/ 镜像 /bin/bash
[root@daring ~]# docker run -it -v /root/software/:/mnt/software/ centos7:latest /bin/bash
[root@72cd0690ff5f /]#
命令包含以下三个部分:
docker run <相关参数> <镜像ID> <初始命令>
其中,相关参数包括:
-i
:表示以“交互模式”运行容器-t
:表示容器启动后会进入其命令行-v
:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
初始命令表示一旦容器启动,需要运行的命令,此时使用/bin/bash
,表示启动后直接进入bash shell。
2.5 安装软件
为了搭建 Java Web 运行环境,需要安装 JDK 与 Tomcat,下面的过程均在容器内部进行。本例中,选择/opt/
目录作为安装目录,首先需要通过cd /opt/
命令进入该目录。
2.5.1 安装JDK
首先,解压 JDK 程序包:
# tar -zxf /mnt/software/jdk-7u65-linux-x64.gz
[root@72cd0690ff5f /]# tar -zxf /mnt/software/jdk-7u65-linux-x64.gz
[root@72cd0690ff5f /]# ls
anaconda-post.log dev home lib lost+found mnt proc run srv tmp var
bin etc jdk1.7.0_65 lib64 media opt root sbin sys usr
[root@72cd0690ff5f /]#
然后,移动 JDK 目录:
# mv jdk1.7.0_65/ /opt/jdk/
[root@72cd0690ff5f /]# mv jdk1.7.0_65/ /opt/jdk/
[root@72cd0690ff5f /]# ls /opt/jdk/
COPYRIGHT README.html THIRDPARTYLICENSEREADME.txt db jre man src.zip
LICENSE THIRDPARTYLICENSEREADME-JAVAFX.txt bin include lib release
2.5.2 安装Tomcat
首先,解压Tomcat程序包:
# tar -zxf /mnt/software/apache-tomcat-7.0.54.tar.gz
[root@72cd0690ff5f /]# tar -zxf /mnt/software/apache-tomcat-7.0.54.tar.gz
[root@72cd0690ff5f /]# ls
anaconda-post.log bin etc lib lost+found mnt proc run srv tmp var
apache-tomcat-7.0.54 dev home lib64 media opt root sbin sys usr
[root@72cd0690ff5f /]#
然后,移动Tomcat目录:
# mv apache-tomcat-7.0.54/ /opt/tomcat/
[root@72cd0690ff5f /]# mv apache-tomcat-7.0.54/ /opt/tomcat/
[root@72cd0690ff5f /]# ls /opt/tomcat/
LICENSE NOTICE RELEASE-NOTES RUNNING.txt bin conf lib logs temp webapps work
2.5.3 编写运行脚本
编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat。
首先,创建运行脚本:
# touch /root/run.sh
# vi /root/run.sh
[root@72cd0690ff5f /]# touch /root/run.sh
[root@72cd0690ff5f /]# vi /root/run.sh
然后,编辑脚本内容如下:
#!/bin/bash
export JAVA_HOME=/opt/jdk/
export PATH=$JAVA_HOME/bin:$PATH
sh /opt/tomcat/bin/catalina.sh run
[root@72cd0690ff5f /]# cat /root/run.sh
#!/bin/bash
export JAVA_HOME=/opt/jdk/
export PATH=$JAVA_HOME/bin:$PATH
sh /opt/tomcat/bin/catalina.sh run
最后,为运行脚本添加执行权限:
# chmod u+x /root/run.sh
[root@72cd0690ff5f /]# chmod u+x /root/run.sh
[root@72cd0690ff5f /]# ls -l /root/run.sh
-rwxr--r-- 1 root root 107 Aug 7 07:40 /root/run.sh
2.6 退出容器
当以上步骤全部完成后,可使用exit命令,退出容器。
[root@72cd0690ff5f /]# exit
exit
[root@daring ~]#
随后,可使用如下命令查看正在运行的容器:
#docker ps
[root@daring ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
此时,应该看不到任何正在运行的程序,因为刚才已经使用exit命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:
# docker ps -a
[root@daring ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72cd0690ff5f centos7:latest "/bin/bash" 8 minutes ago Exited (0) 43 seconds ago insane_noyce
记住以上CONTAINER ID
(容器 ID),随后将通过该容器,创建一个可运行 Tomcat 镜像。
2.7 创建Tomcat镜像
使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:
[root@daring ~]# docker commit 72cd0690ff5f centos7:tomcat7
sha256:876079dd78c99cbcb858d61eb5add5c16763337499565b226f0158057471dc60
[root@daring ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 tomcat7 876079dd78c9 6 seconds ago 502.7 MB
docker.io/jasonperma/centos6_http_ssh latest 2460b63219d7 7 days ago 291.9 MB
centos http b097bfe56b56 12 days ago 291.7 MB
centos7 latest 50dae1ee8677 2 weeks ago 196.7 MB
docker.io/centos latest 50dae1ee8677 2 weeks ago 196.7 MB
docker.io/centos centos6 cf2c3ece5e41 5 weeks ago 194.6 MB
该容器的ID是876079dd78c9
,所创建的镜像名是centos7:tomcat7
,随后可使用镜像来启动Tomcat容器。
2.8 启动Tomcat容器
首先,新建
/root/webapps/ROOT
目录,并在该目录下创建一个index.html
文件,文件内容如下:
[root@daring ~]# mkdir -p /root/webapps/ROOT
[root@daring ~]# cd /root/webapps/ROOT/
[root@daring ROOT]# cat index.html
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
正如上面所描述的那样,可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:
#docker run -d -p 8080:8080 -v /root/webapps/:/opt/tomcat/webapps/ --name tomcat7 centos7:tomcat7 /root/run.sh
[root@daring ~]# docker run -d -p 8080:8080 -v /root/webapps/:/opt/tomcat/webapps --name tomcat7 centos7:tomcat7 /root/run.sh
0bb6c740fddcf91e8c46e3a79358374349a4219dfb1bb64bde69a8dc5e06bd2c
[root@daring ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bb6c740fddc centos7:tomcat7 "/root/run.sh" 8 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp tomcat7
其中,相关参数包括:
-d
:表示以“守护模式”执行/root/run.sh
脚本,此时 Tomcat 控制台不会出现在输出终端上。-p
:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 8080 端口,这样就向外界暴露了 8080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。-v
:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
--name
:表示容器名称,用一个有意义的名称命名即可。 在浏览器中,输入宿主IP和端口号,即可访问 Tomcat:
注:192.168.142.3是宿主机的ip地址
2.9 最终示意图:
至此搭建容器的tomcat环境成功
2.10 停止Tomcat容器
[root@daring ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bb6c740fddc centos7:tomcat7 "/root/run.sh" 5 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp tomcat7
[root@daring ~]# docker stop tomcat7
tomcat7
2.11 移除容器
[root@daring ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bb6c740fddc centos7:tomcat7 "/root/run.sh" 6 minutes ago Exited (137) 47 seconds ago tomcat7
72cd0690ff5f centos7:latest "/bin/bash" 24 minutes ago Exited (0) 16 minutes ago insane_noyce
[root@daring ~]# docker rm tomcat7
tomcat7
[root@daring ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72cd0690ff5f centos7:latest "/bin/bash" 24 minutes ago Exited (0) 16 minutes ago insane_noyce
二、docker应用案例
对于中小企业来说,搭建paas
没有那个精力,也没那个必要,中小企业可以用docker来标准化开发、测试、生产环境。
画了简单的图:
docker占用资源小,在一台E5 128G内存的服务器服务器上部署100个容器都绰绰有余,可以单独抽一个容器或则直接在宿主物理主机上部署samba,利用samba的home分享方案将每个用户的home目录映射到开发中心和测试部门的windows机器上。可以针对项目组,由架构师搭建好一个标准的容器环境供项目组和测试部门使用,每个开发工程师可以拥有自己单独的容器,通过docker run -v
将用户的home目录映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然后分配一个容器使用-v 加载测试部门的home目录启动即可。这样,在公司内部的开发、测试基本就统一了,不会出现开发提交的代码,测试部门部署不了的问题。
测试发布测试通过的报告后,架构师再一次检测容器环境,就可以直接交由部署工程师将代码和容器分别部署到生产环境中了。
- 1.构建一个标准的tomcat容器环境,例如上面知点中用
docker commit
生成的centos7:tomcat7
容器镜像 - 2.在宿主机上搭建samba环境
安装samba(centos 7/redhat 7提供的samba版本是samba 4)
[root@daring ~]# yum -y install samba samba-client samba-common
开机启动, 启动服务
[root@daring ~]# systemctl enable smb nmb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.
[root@daring ~]# systemctl start smb nmb
查看监听端口(使用
netstat
或ss
命令查看连接状态)
[root@daring ~]# netstat -anpt | grep -E "smb|nmb"
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 56885/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 56885/smbd
tcp6 0 0 :::139 :::* LISTEN 56885/smbd
tcp6 0 0 :::445 :::* LISTEN 56885/smbd
[root@daring ~]# netstat -anpu | grep -E "smb|nmb"
udp 0 0 172.17.255.255:137 0.0.0.0:* 56884/nmbd
udp 0 0 172.17.0.1:137 0.0.0.0:* 56884/nmbd
udp 0 0 192.168.142.255:137 0.0.0.0:* 56884/nmbd
udp 0 0 192.168.142.3:137 0.0.0.0:* 56884/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 56884/nmbd
udp 0 0 172.17.255.255:138 0.0.0.0:* 56884/nmbd
udp 0 0 172.17.0.1:138 0.0.0.0:* 56884/nmbd
udp 0 0 192.168.142.255:138 0.0.0.0:* 56884/nmbd
udp 0 0 192.168.142.3:138 0.0.0.0:* 56884/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 56884/nmbd
防火墙放行
[root@daring ~]# firewall-cmd --permanent --add-service=samba
success
[root@daring ~]# firewall-cmd --reload
success
[root@daring ~]# firewall-cmd --list-all
public (default, active)
interfaces: eno16777728
sources:
services: dhcpv6-client samba ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
给开发工程师、测试工程师、部署工程师创建samba账号
[root@daring ~]# useradd ceshi
[root@daring ~]# useradd kaifa
[root@daring ~]# useradd bushu
[root@daring ~]# smbpasswd -a ceshi
New SMB password:
Retype new SMB password:
Added user ceshi.
[root@daring ~]# smbpasswd -a kaifa
New SMB password:
Retype new SMB password:
Added user kaifa.
[root@daring ~]# smbpasswd -a bushu
New SMB password:
Retype new SMB password:
Added user bushu.
Samba默认是共享samba用户的宿主目录的
#============================ Share Definitions ==============================
[homes]
comment = Home Directories
browseable = no
writable = yes
; valid users = %S
; valid users = MYDOMAIN\%S
在所建用户的宿主目录下创建ROOT目录,该目录下用于存放开发部门的jsp代码。
将开发工程师用户的home目录映射到开发工程师的windows主机上
创建开发工程师所需要的容器,将
/home/kaifa
目录挂载到容器的/opt/tomcat/webapps/
目录
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title> jsp java </title>
</head>
<body>
<% out.println("welcom to jsp page");%>
</body>
</html>
[root@daring ~]# docker run -d -p 58080:8080 -v /home/kaifa/:/opt/tomcat/webapps/ --name kaifa centos7:tomcat7 /root/run.sh
3f22921cf1d09d3bbb040b29cd4b9e58e26cd94ccd6bdc5755d772b1ae86594a
[root@daring ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f22921cf1d0 centos7:tomcat7 "/root/run.sh" 12 seconds ago Up 10 seconds 0.0.0.0:58080->8080/tcp kaifa
test.jsp
内容如下:
这是第二次试验的截图,第一次没有成功。