学习使用 Docker 的记录文

学习使用 Docker 的记录文

概述

最近两天肝了一部关于docker的课程,记录一下所学.
【狂神说Java】Docker最新超详细版教程通俗易懂 这个教程真的很棒~推荐学习.

介绍

首先,docker是一个虚拟化技术,它可以帮助开发人员将自己的整个项目(包括环境)打包成为一个镜像,做到开箱即用的功能~

而这个镜像,会在我们docker创建的容器中运行. 容器是什么呢? 容器可以简单理解为我们虚拟机中的系统.每个容器之间是互相隔离的,每个容器都基于自己的系统,互不影响,并且性能消耗极低.

我们传统的虚拟机是虚拟出一些硬件,然后在硬件的基础上运行一个完整的操作系统. 而docker的容器则是直接运行在宿主机上.因此docker的容器很是轻便. 这里就带出了它与虚拟机的差别,我们启动一个虚拟机是分钟级别的,而容器则是秒级的.

开始

安装docker的过程便不再撰述,值得注意的是,我们使用docker一般会从网络进行下载别人提供的基础镜像,例如CtenOS/Mysql/Redis等等基础服务. docker默认会从Docker HUb 中下载,它类似于GitHub,由于是国外的缘故,我们必须配置阿里云(网易/七牛云)的镜像,从而加快速度!

详细见于: https://www.runoob.com/docker/docker-mirror-acceleration.html

Docker的一些常用命令

基础命令

从仓库中下载一个镜像

docker pull hello-world

查看所有镜像

docker images

运行镜像

docker run hello-world

正在运行的容器, -a 为显示全部, -q 为只显示ID

 docker ps -aq

删除容器

docker rm [容器ID]

删除所有容器,使用$()可以实现很多骚操作.. 不要局限在这一条~

docker rm $(docker ps -aq)

删除镜像,当前镜像没有被容器使用,才可以删除.

docker rmi [镜像名称/镜像ID]

强制删除镜像

docker image rm [镜像名称/镜像ID]

进入对应容器

docker exec -it [镜像名称/镜像ID] /bin/bash

进入对应容器(同上),不建议使用这种.

docker attach [镜像名称/镜像ID]

容器命令

运行并进入一个容器, -it为交互模式,使用/bin/bash解析稍后的指令.接下来便进入容器之中. -d --name 为容器进行命名.

docker run -it -d --name [自己起的名字] [容器名/容器ID] /bin/bash

退出容器

exit

退出容器但不停止容器

Ctrl + p + q

停止容器

docker stop [容器名/容器ID]

启动容器

docker start [容器名/容器ID]

重启容器

docker restart [容器名/容器ID]

将当前容器提交为新的镜像

docker commit -m=[信息] -a=[作者] [容器ID] [镜像名]:[版本号]

容器数据卷

简单的说,当我们创建了一个MySQL的容器之后,我们存储的数据自然也就在这个容器之中. 如果我们将这个容器进行删除,那么我们的数据就不复存在! 所以我们如果有这种类似的需求,则将数据存放在我们的服务器本地之中!

 docker run -d -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7

以上便是运行MySQL镜像,并且把mysql下的文件与外部路径双向绑定.

指令依次为: -d(后台运行) / -p 指定运行在那个端口,冒号前是本机的端口,其后是在容器系统中的端口. / -v 将两个目录进行绑定 / -e 设置MySQL的密码 .

主要的代码便是: -v /home/mysql/data:/var/lib/mysql ,前者为存放在服务器的路径,后者为容器内路径.

如果我们不去填写存在服务器中的路径,docker会自动生成一个匿名数据卷, 它以随机码为名称,存储在 /var/lib/docker/volumes/* 文件夹之中.

如果我们以如下方式去设置的话,则由随机码更改为 "jvming",这样的形式.我们称之为具名数据卷.

-v jvming:/var/lib/mysql

查看所有卷

docker volume ls

查看指定卷信息

docker volume inspect [卷名称]

Dockerfile

前面我们一直在讲如何去使用镜像/如何去使用容器,接下来我们将使用Dockerfile来进行构建一个镜像.
Snipaste_2020-05-18_21-48-40.png
而Dockerfile实际上是一个文件,我们通过自己去添加指令构建我们的镜像,指令见上图.

基本

首先,我们需要使用vim创建一个 "Deckerfile" 文件.

这里,我们进行DIY一个 "属于自己的centos".

FROM centos   #首先,声明这个镜像是基于centos的.

MAINTAINER kum<k@ku-m.cn>  #声明作者信息

ENV MYPATH /usr/local   #创建一个变量,方便我们后面使用这个地址.
WORKDIR $MYPATH     #设置工作目录,即我们进入容器后会出现在哪个路径.

RUN yum -y install vim   #使用RUN在构建镜像的时候去执行这个命令,来安装vim
RUN yum -y install net-tools #同上

EXPOSE 80    #设置默认运行端口
CMD echo "end"    #在启动这个容器的时候,执行输出 "end"

CMD /bin/bash #含义同在 run的时候加上 /bin/bash ,其实就是省去了自己编写的时间.

自此我们diy的centos镜像的构建文件便编写完毕. 我们使用buil指令进行构建.

docker build -t [容器名称] .

注意,如果你创建的构造文件的名称不是 "Dockerfile",需要加上 -f [文件名] 进行指定. 之后不要忘记后面有一个 "." , 点的意思是,使用当前上下文的构造文件.

这样我们构造的centos便完成.

制作一个Tomcat镜像

前面只是简单的演示如何构建一个镜像,接下来我们创建一个Tomcat的镜像. 首先,我们可以思考一下.

它肯定是基于一个系统,故,我们要编写

FROM centos

其次,它需要安装Tomcat和JDK,这里我们便使用到了ADD指令

首先我们需要把以上二者的安装包(一定要是tar.gz格式),

apache-tomcat-9.0.35.tar.gz   jdk-14.0.1_linux-x64_bin.tar.gz

下载到服务器中,然后建立Deckerfile文件,安装包和构造文件要在同一目录.

FROM centos
MAINTAINER kum<k@ku-m.cn>

ENV MYPATH /usr/local

ADD jdk-14.0.1_linux-x64_bin.tar.gz /usr/local/
ADD apache-tomcat-9.0.35.tar.gz /usr/local/

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk-14.0.1   #环境变量
ENV PATH $JAVA_HOME/bin:$PATH   #环境变量

EXPOSE 8080

CMD ["/usr/local/apache-tomcat-9.0.35/bin/catalina.sh","run"] #启动Tomcat

实际上与前面的例子并不大,ADD的含义是: 将一个压缩包,添加到容器的/usr/local/ 目录,docker构建的时候会自动解析我们的安装包.

接下来便是设置一些环境变量. 然后使用Tomcat的启动文件catalina.sh,这里并不是使用startup.sh.

构建完毕之后,直接启动即可.

 docker run -d -p 8080:8080 mytomcat

打包springboot项目为镜像

只要把Dockerfile和jar包放在一个目录,直接构建就好啦~

FROM java:8 #基于Java8

COPY *.jar /app.jar #将目录下的jar包拷贝到容器的当前目录下,并命名为app.jar.

EXPOSE 8080

CMD ["-- server.port=8080"] #设置项目的启动端口.

ENTRYPOINT ["java","-jar","app.jar"] #启动项目
# Docker