前言:
- 为什么要使用Docker?发布一个新项目,以前是Jar包、环境(JDK、Redis、MySQL...)分离部署,常常导致在程序员电脑上的Jar包能运行,去到服务器就不能运行了。现在用了Docker,将Jar包+环境打包在一块形成一个更大的包,直接放到服务器上运行
- ------------------常见疑问解答-------------
- MySQL、Redis也能打包进去?是的,数据库也能含在Docker包内
- 如果服务器上有两个数据库MySQL,如果还是用3306端口,岂不是会端口冲突?不会,Docker包与包之间会形成隔离。Docker包部署在现实服务器9001端口,而在9001端口(公网)里面是删减版centos,会有‘删减版os的3306端口’
- 若每一个Docker包都装一个MySQL,是不是很浪费空间?不是的,Docker里面有一个联合文件系统,所有镜像都是分层的。通俗说,底层mysql镜像对于不同容器是共用的,数据库的内容加在底层之上,就像地铁出口的商场,商场AB共用一个地铁底层,只需要保持商场的差异化即可(数据库的差异)。而且Docker包里mysql是经过删减的,但这个小mysql保留了使用功能,只是删去了不必要的文件,所以空间占用小。
目录:
- 了解Docker常用命令
- 有了镜像(删减版),要把镜像装进容器(包)
- 上述的镜像都是下载的,那么我们开始设计自己的镜像
- 上传自己的镜像至DockerHub:Dockerfile(更新中...)
一、了解Docker常用命令
- 首先需要掌握Linux基本命令(本号其它文章)。建议实操熟悉命令,与常用的小技巧:(1)Tab自动补全名字;(2)ctrl+c退出;(3)用命令和--help获取提示帮助;(4)镜像id与容器id是不一样的
- ------------------基础命令--------------
- docker version;版本信息
- docker info;查看当前镜像信息、Docker容器数量
- docker --help;显示帮助命令
- ------------------镜像命令--------------MySQL镜像=删减版mysql
- docker images;查看本地(云服务器)的镜像
- docker search mysql;查看Docker官网给出已经删减的MySQL镜像(删减版mysql)
- docker pull mysql;下载MySQL镜像(删减版mysql)到本地(云服务器)
- docker rmi -f 镜像mysqlid;删除mysql镜像(删减版mysql)
- docker rm -f $(docker ps -aq); 删除所有镜像(语句作参数的方式)
--------------------------------有了镜像(删减版),要把镜像装进容器(包)----------------------------------
- ------------------容器命令--------------Docker包=Docker容器
- 首先理解一个服务的启动流程:(1)下载redis-service服务(2)用config配置文件启动service服务(不同的配置文件能启动不同端口类型的服务)(3)启动服务redis-cli
- 概念:这些镜像就像是service服务,但(删减版mysql)怎么运行呢?用run命令,将镜像(删减版mysql)变成可以独自运行的环境(config配置文件都不需要了,但是每次启动都是新的服务--->容器数据卷别的文章讲)。以下以centos为例。
- 首先将Centos镜像(删减版)下载下来:docker search centos--->docker pull centos
- 启动容器(包):docker run (可选参数)容器的镜像名 /bin/bash;以bash命令启动容器(可选参数:-d 后台方式运行(若没有应用,则会没停止)、-it 交互方式运行即进入容器/包/centos删减版内、-p 容器运行端口(可以做现实端口与容器端口映射如9001:3306,访问了现实的9001,相当于访问了3306))
- exit;(在容器内)停止容器并退出容器。注意:退出容器内所有数据都没了,再次启动容器只会启动一个新的容器。但如果做了容器数据卷同步,同步在服务器的文件/文件夹不会消失。
- Ctrl+p+q:(在容器内)容器不停止,退出
- docker start 容器id;(在容器外)开启运行容器
- docker restart 容器id;(在容器外)重启运行容器
- docker stop 容器id;(在容器外)停止运行容器
- docker kill 容器id;(在容器外)强制停止运行容器(并不是删除)
- docker ps (可选参数);(在容器外)查看正在运行的容器(可选参数:-a 曾经全部运行过的容器、-n=1最近使用过的容器)
- docker logs -f -t --tail 5 容器id;(在容器外)查看容器最近5条日志
- docker top 容器id;(在容器外)查看该容器内的进程
- docker inspect 容器id;(在容器外)查看该容器的具体信息,主要看Mounts的数据挂载
- docker rm 容器id;(在容器外)删除容器(删减版os),运行时不能删除,除非用 -f 强制删除
- docker exec -it 容器id /bin/bash;(在容器外)以后台交互方式进入容器,会显示文件目录,可以在里面设计文件/文件夹
- docker attach 容器id;(在容器外)直接进入容器,不会显示文件目录
- docker cp 容器id:容器内全路径 本机全路径;(在容器外)拷贝容器内文件到容器外主机(云服务器)
- -----------------------测试容器-------------------
- 安全组开启3344和宝塔开启防火墙3344(注意:只能开启3000-3500防火墙,若设置范围外会报错):
- 启动nginx容器,将外网端口3344与容器端口80进行映射:docker run -d -p 3344:80 nginx
- 外网访问成功:
--------------------------上述的镜像都是下载的,那么我们开始设计自己的镜像------------------------------
- docker commit -m "提交的信息" -a 作者 容器id 目标镜像名;提交自己的镜像在本地
- ---------以Tomcat为例----------
- 安全组开启3345和宝塔开启防火墙3345(注意:只能开启3000-3500防火墙,若设置范围外会报错);
- 启动tomcat:docker run -d -p 3345:8080 tomcat
- 以交互模式进入容器:docker exec -it e9c1ea9f21e3 /bin/bash
- 注意,原应在webapps的所有文件现在都在webapps.dist下,需要拷贝过去:
- 现在这个容器已经被修改了,即与原下载下来的tomcat镜像(删减版)有了区别,现在就可以提交自己“设计过”的镜像了。
- 提交后,发现我们设计过的镜像,已经保存在了本地:
- 以后上传文件到litaotomcat容器内的webapps文件夹下就可以部署网站了!
- 到最后,再解释上述的原理就清楚多了:Docker里面有一个联合文件系统,所有镜像都是分层的。通俗说,底层Tomcat镜像对于不同容器是共用的,Tomcat的差异化内容加在底层之上加的,就像地铁出口的商场,商场AB共用一个地铁底层,只需要保持商场的差异化即可(Tomcat的差异),以后添加商场C,用的还是那个地铁底层,差异化的内容可以自己定制。
----------------------------------上传自己的镜像至DockerHub:Dockerfile----------------------------------
- 首先注册DockerHub:Docker Hub
- 在服务器登录远程DockerHub:
- 编写Dockerfile文件:
更新中...