最近一直在学docker,学习到了很多,期间也遇到了很多坑,在这里我总结一下这方面知识,希望对大家学习docker有帮助

Docker的概念

Docker是以容器技术为核心的一套应用的构建,分发,执行的体系和生态。
学习docker最重要的是知道镜像,容器,仓库的概念,以及他们之间的关系

镜像(Image):一个特殊的文件系统
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container):镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
仓库(Repository):集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

docker的安装

docker的安装可以看官网资料,根据自己的操作系统安装docker

官网地址:https://docs.docker.com/engine/install/

docker容器化与自动化 docker容器化部署_tomcat

docker的常用命令

  1. docker images 查看所有已下载镜像,等价于:docker image ls 命令
  2. docker pull 镜像 拉取镜像
  3. docker rmi 镜像ID 删除镜像
  4. docker ps -a 查看所有容器
  5. docker ps 查看正在运行的容器
  6. docker start 容器ID 启动容器
  7. docker stop 容器ID 停止容器
  8. docker rm 容器ID 删除镜像 在删除容器之前需要停止容器
  9. docker attach 进入容器
  10. ctrl+p+q 退出容器

通过Dockerfile构建镜像并发布web项目

1.准备好需要的jdk 和 tomcat
这里我将jdk和tomcat的tar.gz 包都通过 tar -zxvf解压了 并通过mv 修改了文件夹名字为jdk和tomcat
安装介质JDK链接:https://pan.baidu.com/s/1nXiJ18HUBbnPC3IdMNi46g 密码:2phd
安装介质Tomcat链接:https://pan.baidu.com/s/1GVJria7QjzvwSCZHBFdloQ 密码:q3c0

tar -zxvf jdk-8u191-linux-x64.tar.gz -C /data/
tar -zxvf apache-tomcat-9.0.13.tar.gz -C /data/
mv jdk1.8.0_191 jdk
mv apache-tomcat-9.0.13 tomcat

2.编写Dockerfile(示例如下)

FROM ubuntu:16.04
 MAINTAINER changw.xiao@qq.com
  COPY ./jdk /usr/local/jdk
  COPY ./tomcat /tomcat
  COPY ./maven /usr/local/maven
  ENV M2_HOME=/usr/local/maven
 ENV JAVA_HOME /usr/local/jdk
 ENV JRE_HOME $JAVA_HOME/jre  
 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib  
 ENV PATH $PATH:$JAVA_HOME/bin
 ENV PATH $PATH:$M2_HOME/bin
 ENV CATALINA_OPTS -Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=512M
 RUN cd /tomcat/logs && echo "1" >>count.txt
 ENTRYPOINT /tomcat/bin/startup.sh && tail -F /tomcat/logs/catalina.out

根据显示的行号来解释
  1.我们制作镜像的基础,在ubuntu16.04的系统上构建后续操作
   2.维护者信息
  3~5.复制当前目录下的jdk目录 到容器内部的/usr/local/jdk目录下
    解释下:
    Dockerfile提供了COPY 和 ADD 两种方式
    COPY : COPY ./jdk /usr/local/jdk            #直接原样拷贝过去
    ADD : ADD ./jdk-8u121-linux-x64.tar.gz /usr/local/java #拷贝过去,如果是压缩包还会自动帮着解压,本来是好事,但是解压后文件夹名字一长串,不便于记忆,就直接先解压好重命名好了再COPY过去
7~13.一看就知道了 通过 ENV 来设置各种环境变量
14.为了示例RUN的使用, 通过RUN命令,后面就可以执行各种linux命令
15.表示启动容器后执行的操作
将上述文件保存为Dockerfile 注意大小写,没有后缀,然后进入到该目录,执行命令构建镜像

sudo docker build -t xiaochangwei/tomcat:v1 --rm=true .
#如果改变了Dockerfile名字,则需要指定  -f  文件名称
xiaochangwei/tomcat:v1 镜像的名字及tag,  最后的点代表当前目录

检查镜像是否安装成功

xiaochangwei@ubuntu:~/test$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
xiaochangwei/tomcat   v1                  62cedd29ce8f        48 seconds ago      505MB
xiaochangwei/nginx    v1.0                9f2c1a649a75        About an hour ago   108MB
nginx                 latest              3f8a4339aadd        9 days ago          108MB
ubuntu                16.04               00fd29ccc6f1        3 weeks ago         111MB

有xiaochangwei/tomcat镜像说明,我们需要的tomcat镜像就已经制作完成了
启动试试看

sudo docker run -p 8899:8080 --name tomcat_xiao xiaochangwei/tomcat:v1

注意docker启动端口,以及镜像名字根据实际情况改变
然后问题又来了,容器倒是启动起来了,但是怎么把我们自己的war包丢里面运行起来呢?

sudo docker cp demo.war tomcat_xiao:tomcat/webapps

demo.war 不解释
  tomcat_xiao:tomcat/webapps 冒号前面为容器名称或者id, 冒号后面为tomcat的webapps全路径
  丢进去就好了,会自动发布的,不需要我们再自己去启动tomcat了,因为容器启动后tomcat就默认启动了 Dockerfile最后一行就是启动tomcat
  丢进去后,控制台就会检测到,并自动部署

最后附上我参考资料,里面的东西更全更详细:

https://www.kancloud.cn/guanfuchang/docker/844093