前言(废话):花了3天时间, 才认识了docker这个神器, 并且成功地将项目部署到容器里面, 但不知道为什么docker.hub不能注册, 所以无法上传镜像, 所以现在先记录docker从安装到部署项目的过程;
0#:开始前附上参考文档
docker入门文档
docker命令大全
安装docker参考博客
1 :什么是docker
首先要清楚什么是docker?
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
说人话!他就是一个容器!!!
是一个怎样的容器呢?首先介绍两个概念,容器(container)和镜像(image),他们两者是密不可分的,我们启动docker的时候,是直接跑一个镜像,随之会启动一个容器,把这个镜像装起来;
总的来说,
- 镜像 = 项目+服务器+数据库+…等等乱七八糟的东西;
- 容器 = 镜像的载体;
(但镜像从容器中生成)
既然镜像中已经有了我们的项目和所需要的环境,那么只要我们拿到这个镜像,就算是一台全新的电脑,我们都可以用一条命令把项目跑起来!(当然,需要安装docker)
2:安装docker
宿主系统:CentOS 7;
安装docker的方式有多种,可以再yum上直接拉取安装,也可以自己下载好再安装;(本人懒得上网下载,这里采用拉取yum的方式安装,详情可见上面的参考博客):
直接敲linux命令
1)安装依赖包:yum install -y yum-utils device-mapper-persistent-data lvm2
2)安装稳定的仓库:
- yum-config-manager \
- –add-repo \
- https://download.docker.com/linux/centos/docker-ce.repo
3)安装Docker(社区版):yum install docker (默认安装最新版本)
4)启动Docker:systemctl start docker
5)测试:docker run hello-world
第一次运行hello-world时,你的docker是没有这个镜像的,不过会自动从仓库拉取,稍等片刻,
当出现以上的 Hello from Docker! 时,我们就可以一起愉快地玩docker了!
3:创建容器,并把所需要的环境压缩包拉到容器中
- 1)首先要拉取容器的系统(这里使用ubuntu):
docker run –name myproject ubuntu (实际上是运行一个ubuntu的镜像,若本地还没有,则会自动拉取)
出现以下信息即下载完成;
两个常用命令:
1.查看本地镜像:docker images
2.查看所有容器:docker ps -a (docker ps 是查看正在运行的容器)
2)把所需要的环境(如jdk,tomcat等)拉取到docker容器中
在容器中安装环境,可以在线下载安装,也可以从宿主机中拉取,这里介绍从父容器拉取环境的两个方法:- 方法一:启动一个容器,同时指定将宿主机中的某个文件夹挂载到docker容器中;
执行run命令启动容器:
docker run -i -t -v /myjava/:/mnt/software/ ubuntu /bin/bash
(会将宿主机的myjava目录下的文件都挂载到docker容器的/mnt/software/目录下,所以要事先在myjava目录下把所需要的文件准备好。)
命令解释:
参数:
-i: 以交互模式运行容器,通常与 -t 同时使用; -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用(容器启动后会进入其命令行); -v: 指定宿主机的哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
启动成功后会进入容器内部:
进入刚才指定的文件挂载的目录,发现已经把jdk等东西拉过来了
方法二:使用docker cp 命令拷贝文件
若已经在容器里面,则先退出容器,
下面先介绍几个命令:退出容器: 1.退出并停止容器:Ctrl+D;(而后执行docker ps不能看到该容器) 2.退出但不停止容器:Ctrl+P+Q;(而后执行docker ps能看到该容器) 进入容器: docker attach <容器名称或ID>; (只能进入已经启动了的容器,若容器已经停止,则先执行docker start <容器名称或ID> 来启动容器)
退出容器后执行命令:
docker cp myjava/ 190d:mnt/software/
(docker cp <宿主机目录或文件> <容器名称或id>:<容器目录>)
- 方法一:启动一个容器,同时指定将宿主机中的某个文件夹挂载到docker容器中;
3:在容器中安装环境
这里安装jdk和tomcat,所以我这个容器还是得依赖外部的数据库,如果你想要一个完全独立的容器(数据也与外界隔绝)的话,还需要安装数据库;
(1)安装 jdk
1)解压缩
tar zxvf jdk-8u161-linux-x64.tar.gz -C /usr/myjava
2)配置环境变量
vi /etc/profile
(i 进入编辑)
在文末添加以下配置:
export JAVA_HOME=/usr/myjava/jdk1.8.0_161
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
(Esc 输入:wq回车退出)
3)验证jdk
java -version
出现安装好的jdk信息即成功:
(2)安装Tomcat
1)解压缩
tar zxvf -C /usr/myjava
2)配置环境
进入tomcat解压的目录的bin目录下下执行:
vi setclasspath.sh
(./startup.sh最终还是调用setclasspath.sh的配置,所以直接在这里配)
在文末添加以下配置:
export JAVA_HOME=/usr/myjava/jdk1.8.0_161
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre
3)验证 tomcat
在tomcat的bin目录下执行
./startup.sh 启动tomcat
出现以下信息则安装成功
(3)把项目拉到 tomcat/webapps中
(4)配置容器的环境变量
1)编辑.bashrc文件
vi ~/.bashrc
文末添加以下配置
export JAVA_HOME=/usr/myjava/jdk1.8.0_161/bin
export JRE_HOME=/usr/myjava/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
2)使配置生效
source ~/.bashrc
(5)编写运行脚本
1)编写运行脚本run.sh
vi /root/run.sh
写入以下配置(按自己项目需求添加执行的程序和服务)
#!/bin/bash
source ~/.bashrc
sh /usr/myjava/apache-tomcat-8.5.24/bin/catalina.sh run
注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本启动 Tomcat 服务。
2)添加执行权限
chmod u+x /root/run.sh
4:运行脚本把项目跑起来
执行以下命令运行脚本
/root/run.sh
若项目可以成功跑起来则进行下一步(5:创建项目镜像)
(我这里执行就报了错,因为缺少memcached,所以先安装memcached服务)
执行以下命令下载memcached:
安装memcached:
apt-get install -y memcached
启动memcached服务:
/usr/bin/memcached -d -m 2048 -p 11211 -u root
(-d 后台运行, -m 分配空间 -p 端口号, -u root 不加报错)
之后再启动 /root/run.sh
项目终于跑起来了撒花~~
所以再次编辑run.sh,添加memcached的运行脚本:
5:创建项目镜像
1)先退出容器:Ctrl + D
2)执行 docker ps -a 查看容器,记住容器id(前4位即可)
3)执行docker commit 命令提交镜像
docker commit 2736 myproject:1.0.0
(docker commit <容器名称或id> <自定镜像名称>:<自定版本号TAG> )
4)查看镜像 docker images
(删除所有镜像:docker rm $(docker ps -aq))
6:启动镜像访问项目(即启动容器)
执行以下命令:
docker run -d -p 9090:8080 --name testproject myproject:1.0.0 /root/run.sh
参数解释:
-d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。
此时需要查看日志使用命令:docker logs <容器名称或ID>
-p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 9090 端口,这样就向外界暴露了 9090 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
--name:表示容器名称,用一个有意义的名称命名即可。
启动成功后,在浏览器输入地址访问即可:
最后:到此为止已经创建了一个完整的项目镜像,如果要上传镜像,供其他机器下载,还需要在docker hub申请一个账号来上传。
不知道为什么官网申请不了账号,就不能演示上传镜像了。。。
–问题记录–
问题 1:如果使用docker命令报以下错误时,说明docker服务没有启动
解决方法:执行命令启动docker服务:
service start docker
问题 2:我在最后启动项目镜像的时候报错:
(直接执行/root/run.sh报错)
(先执行/bin/bash,再执行/root/run.sh成功启动)
但是我先进入容器,再执行run.sh是成功的…奇了怪了
暂时不知道原因….如果有知道的朋友请麻烦告诉我一下~~感谢!