docker常用的命令,很详细

一、从hello-world开始

1、下面运行名为helloworld的镜像,先把hello-world镜像拉取到本地,命令如下:

docker pull hello-world

这个拉取的命令,后面再详细说明。

接下来运行hello-world镜像,命令如下:

docker run hello-world

出现如下界面说明运行成功了
运行成功

二、接下来是查看本地有哪些镜像的的命令

1、先简单使用一下

docker images

运行结果如下:
在这里插入图片描述
现在就当只有hello-world镜像其他先不用管。

参数解释

REPOSITORY:表示镜像仓库源,可以作为运行镜像的参数,比如像上面提到的docker run hello-world。

TAG:镜像的标签,这是用于查看镜像的版本。

IMAGE ID:镜像的id,可以作为运行镜像的参数,像运行hello-world镜像的docker run hello-world也可使用docker run bf756fb1ae65替换,效果一样。

CREATED:镜像的创建时间,看看就行。

SIZE:镜像的大小,看看就行。

2、这个命令还没完,后面还可以加参数-a,-a表示所有

docker images -a

这个命令表示列出本地所有的镜像,运行效果如下:
在这里插入图片描述
3、docker images加-q参数,表示只列出本地镜像的IMAGE ID

docker images -q

运行结果如下:
在这里插入图片描述
4、其中-a和-q参数可以一起使用,表示列出本地所有镜像的所有IMAGE ID,运行、删除镜像会用到IMAGE ID,以后要运行镜像时,这个命令会很好用。

docker images -aq

运行结果如下:
在这里插入图片描述
5、加上–digests,显示镜像的摘要信息

docker images --digests

运行结果如下:
在这里插入图片描述
6、加–digests --no-trunc,显示完整的镜像信息,就是多了描述和完整的IMAGE ID

docker images --digests --no-trunc

运行结果如下:
在这里插入图片描述
7、加上镜像名可以查看指定的镜像,比如我要查看centos的镜像,命令如下:

docker images centos

运行结果如下:
在这里插入图片描述

三、然后是帮助命令,这个命令很重要,是用于查看docker常用命令的命令

docker --help

运行结果如下:
在这里插入图片描述

英语功底好的小伙伴可以试着自己看,英语不好的也可以借助翻译软件哈!

四、Linux有查找文件的命令,docker同样有查找镜像的命令

1、先简单使用一下,比如查找tomcat镜像的命令,docker查找tomcat镜像的命令如下:

docker search tomcat

运行结果如下:
在这里插入图片描述
2、加上-f=stars=30查找stars大于三十,就是点赞数大于三十的tomcat镜像,命令如下:

docker search -f=stars=30 tomcat

运行结果如下:
在这里插入图片描述

五、前面已经提到了拉取镜像的命令,现在来详细说明一下

1、先简单使用一下,比如说我们要拉取Redis镜像,命令如下:

docker pull redis

运行结果如下:
在这里插入图片描述
等待拉取完成即可,再用docker images命令看看镜像有没有拉取成功

运行结果如下:
在这里插入图片描述

docker pull redis相当于docker pull redis:latest,冒号后面的是版本号,就是默认拉取该镜像的最新版本,要拉取指定的版本可以在冒号后面带上相应的版本号即可。

六、拉完镜像了,有些镜像不需要时,我们可以考虑怎么删除。

1、先简单使用一下删除镜像的命令,比如说要删除hello-world镜像,命令如下:

docker rmi hello-world

运行结果如下:
在这里插入图片描述
报错是因为之前运行过hello-world镜像,而镜像里面是一层一层的,删除一个镜像相当于删除一组文件,当然会报错,参考Linux删除一组文件的情况,下面才是docker删除hello-world的正确姿势,即相当于删除多个镜像

docker rmi -f hello-world

运行结果如下:
在这里插入图片描述
ok,删除成功了!

2、接下来是删除本地全部镜像,命令如下:

docker rmi -f $(docker images -qa)

这个慎用哈,咱就不试了。

七、上面已经明白了如何拉取、移除以及查看容器的基本信息,接下来咱们来看看如何运行容器。

1、在运行容器前先用docker images命令查看容器的基本信息,
在这里插入图片描述
接着运行容器,可以使用容器的REPOSITORY或者IMAGE ID运行容器,比如说我要运行centos的镜像,命令如下:

docker run -it 300e315adb2f

其中参数-i表示以交互模式运行容器,-t表示为容器重新分配一个伪输入终端。-i与-t通常同时使用。

运行结果如下:
在这里插入图片描述

就是以IMAGE ID为300e315adb2f的centos镜像生成了e4fb459c2ec5容器。centos镜像就像java中的类,e4fb459c2ec5容器就像以这个类生成的对象。上面图就是生成容器并且进入了容器。

ctrl+P+Q回到宿主机中使用docker ps查看运行结果。
在这里插入图片描述
可以看到容器已经成功运行了。

docker ps是查看所有正在运行的容器的命令,在下面会详细说明。而names是默认随机分配的名字。

2、当然也可以用镜像名来运行一个镜像,比如要运行centos镜像,和使用IMAGE ID运行容器的效果一样。

docker run -it centos

3、我们也可以在容器运行时为容器取一个名字。比如我们在运行centos容器时为容器取名myCentos,命令如下:

docker run -it --name myCentos 300e315adb2f

运行结果如下:
在这里插入图片描述
ctrl+P+Q回到宿主机中查看。
在这里插入图片描述
取名成功!

4、也可以使用start + CONTAINER ID启动之前运行过,但已经停止的容器,比如我们要启动CONTAINER ID为6294de45d6b9容器,命令如下:

docker start 6294de45d6b9

运行结果如下:
在这里插入图片描述

docker ps -n 5命令表示查看最近运行过的5个容器,后面会详细说明。

5、我们也可以使用指定的端口运行容器,这里以tomcat为例,比如我要使用8888端口运行tomcat镜像,命令如下:

docker run -it -p 8888:8080 tomcat

出现如下界面表示运行成功啦!
在这里插入图片描述

其中-p后指定端口号为8888,8080是运行tomcat容器的端口,可以在宿主机使用 localhost:8888
访问到tomcat界面,现在使用最新版的tomcat镜像用 localhost:8888 是看不了tomcat的界面。

使用8.5.32版本的tomcat则可以访问到tomcat主界面。

在这里插入图片描述
在这里插入图片描述
也可以在本机使用宿主机的ip地址+端口号进行访问,记得在访问前关闭防火墙。
在这里插入图片描述
6、也可以加-P随机分配端口号,命令如下:

docker run -it -P tomcat

运行结果如下:
在这里插入图片描述
查看一下端口号。
在这里插入图片描述
49154就是随机分配的端口,到宿主机访问一下!
在这里插入图片描述

八、在宿主机查看正在运行的容器

1、我们都知道Linux查看当前所有进程的命令是ps -ef 而宿主机中查看当前所有正在运行容器的命令也类似,如下:

docker ps

运行结果如下:
在这里插入图片描述
这是上面刚刚运行的容器。

2、加上-l表示查看上一次运行的容器。这个一般在退出容器后查看刚刚退出了什么容器。命令如下:

docker ps -l

完整的操作流程如下:
在这里插入图片描述

exit是退出容器的命令,后面再说。

3、加上-a表示查看所有运行过的容器,命令如下:

docker ps -a

运行结果如下:
在这里插入图片描述
4、有时候我们并不需要查看全部运行过的容器,只查看最近几次运行过的容器就够了,比如我们要查看最近三次运行过的容器,命令如下:

docker ps -n 3

运行结果如下:
在这里插入图片描述
5、加上-q表示只显示当前正在运行的容器的编号,为了演示重新运行了centos容器。

docker ps -q

运行效果如下:
在这里插入图片描述

若是使用这个命令没有出现容器id时表示宿主机没有容器在运行。

6、加上-lq表示显示上一次运行的容器编号,命令如下:

docker ps -lq

运行结果如下:
在这里插入图片描述

九、有运行就有退出。

1、若当中在容器中,需要退出容器回到本机,docker退出容器的命令如下:

exit

运行结果如下:
在这里插入图片描述
使用docker ps命令在主机查看一下还有没有运行的容器。
在这里插入图片描述
成功退出!

2、有时候我们需要回到宿主机,但不退出当前容器,按快捷键ctrl+P+Q,操作结果如下:
在这里插入图片描述
使用docker ps命令看看容器还在不在。
在这里插入图片描述
操作成功!

3、也可以通过stop + CONTAINER ID退出容器,命令如下:

docker stop 6294de45d6b9

运行结果如下:
在这里插入图片描述
4、还可以使用kill + CONTAINER ID强制退出容器,命令如下:

docker kill 6294de45d6b9

运行结果如下:
在这里插入图片描述

十、有些容器不需要了怎么处理,当然是删除了,这个删除和前面提到的删除镜像不一样,前面删除的相当于类,现在删除的相当于对象。

1、我们先删一下没有运行的容器,通过容器的CONTAINER ID进行删除,命令如下:

docker rm fd17620ec6a8

运行结果如下:
在这里插入图片描述

上图中STATUS下有 Exited表示该容器已经停止运行了。

2、加上-f时正在运行的容器也能删除,比如我要通过CONTAINER ID删除NAMES为myCentos容器,命令如下:

docker rm -f 9bc545f3c140

运行结果如下:
在这里插入图片描述
3、也可以一次性删除多个容器,命令如下:

docker rm -f $(docker ps -q)

也可以用如下命令:

docker ps -a -q | xargs docker rm

xargs表示可变参数,通过指定容器id删除容器

十一、前面已经提到了使用docker run -it 容器名或容器id运行并进入容器,有时我们只想要运行容器而不进入容器时该怎么办呢?咱们来看看让容器运行在后台的命令。

1、让容器在后台运行只需要将-it改为-d就行了,比如我们要通过IMAGE ID在后台运行centos容器,命令如下:

docker run -d 300e315adb2f

在这里插入图片描述

可以看到通过docker ps命令查看正在运行的容器时看不到任何内容,但我的容器确实启动了,这是怎么回事?这是因为在centos以后台进程模式运行,导致docker前台没有运行的应用,docker觉得没有事情可做,就立马停止了容器。那要怎么做才能让运行在后台的容器不立马停止呢?

2、先看看下面这条命令:

docker run -d 300e315adb2f /bin/sh -c "while true;do echo hello ll;sleep 2;done"

表示运行IMAGEID为300e315adb2f的centos镜像,以sh脚本运行""内的代码,代码的意思是每两秒打印一次hello ll

运行结果如下:
在这里插入图片描述
这样就实现了让容器在后台运行。使用docker ps命令也可以看到当前正在运行的容器了。

我们通过打印日志的命令,看看容器在后台打印的内容,命令如下:

docker logs bc0ee4d57a9a

运行结果如下:
在这里插入图片描述
加上-t表示显示时间,命令如下:

docker logs -t  bc0ee4d57a9a

运行结果如下:
在这里插入图片描述

在上面的命令上加上-f表示追加,命令如下:

docker logs -t -f bc0ee4d57a9a

运行结果如下:
在这里插入图片描述

效果截图上看不出来,会在后面不停地追加hello ll及其打印时间。

这样看也太长了可以加上–tail 数字打印最后的几行,数字是几就表示打印最后几行的日志,比如我只要查看最后的5行,命令如下:

docker logs -t -f --tail 5 bc0ee4d57a9a

运行结果如下:
在这里插入图片描述

结果不止5行?因为-f没有去掉,而它会不停地追加。

十二、我们有时也想要查看容器内运行的进程以及细节。

1、咱以上面的十一为例,查看该容器内部的进程,命令如下:

docker top bc0ee4d57a9a

运行结果如下:
在这里插入图片描述
2、再看看容器内部的细节,命令如下:

docker inspect bc0ee4d57a9a

运行结果如下:
在这里插入图片描述
因为内容太多就只截了一部分。

十三、前面已经提到了如何运行一个容器以及如何退出到宿主机,让容器运行在后台,那怎么再次进入到容器的交互界面呢?

1、先把前面的容器干掉并重新运行centos容器,操作如下:
在这里插入图片描述
重新进入容器,命令如下:

docker attach 6294de45d6b9

运行结果如下:
在这里插入图片描述
2、也可以在宿主机上操作容器,而无需进入容器中操作,比如我们要查看容器中/tmp目录下的内容,命令如下:

docker exec -t 6294de45d6b9 ls -l /tmp

运行结果如下:
在这里插入图片描述
我们会发现这根进入容器中查看的效果是一样的。

3、我们也可以通过exec的其他命令进入容器,命令如下:

docker exec -t 6294de45d6b9 /bin/bash

运行结果如下:
在这里插入图片描述

十四、如果我们在退出容器时想要保存容器的文件到宿主机怎么做?继续往下看哈!

1、比如我们要拷贝log.txt文件到宿主机的root目录,先到宿主机的root目录下查看所有文件。可以看到我们的root目录是没有log.txt文件的
在这里插入图片描述
进入某个容器,具体操作如下:
在这里插入图片描述
接着我们将容器中的log.txt文件拷贝的宿主机的root目录中,命令如下:

docker cp 6294de45d6b9:/tmp/log.txt /root

运行结果如下:
在这里插入图片描述

注意容器id后面跟了个冒号,再接文件路径。

十五、使用docker命令会出现错误,确定命令没错还是这样,可以尝试使用重启docker解决。 重启docker的命令如下:

systemctl restart docker

运行结果如下:
在这里插入图片描述

不报错代表重启成功。

到这里docker的常用命令已经讲完了,接下来的是对docker的深入学习。

十六、前面运行的都是从其他网站拉取过来的镜像,我们也可以自己造一个镜像。

1、我们就造一个tomcat镜像,以正在运行的8.5.32版本的容器为基,造一个REPOSITORY 为test/centos的镜像,命令如下:

docker commit -a="gan" -m="my tomcat" 5f22bc02de8d test/centos:1.1

完整的操作流程如下:
在这里插入图片描述
参数解释

-a是指明作者。
-m是添加对新建镜像的描述。

注意造镜像使用的是容器id(CONTAINER ID)而不是镜像id(IMAGE ID)

2、接下来我们看看能不能运行自己造的tomcat,运行的命令如下:

docker run -it test/centos:1.1

因为镜像名后面默认带的是:latest,而我们造镜像时指明了版本号,所以启动镜像时要带上版本号。

完整的操作流程如下:
在这里插入图片描述

再打开其他的窗口看一下。
在这里插入图片描述
ok,运行成功!再到宿主机看看能不能看到tomcat的主页面。
在这里插入图片描述
成功访问!

3、我们也可以让自定义的容器在后台运行,指定访问端口为6666,其实就是没有打印日志的效果,命令如下:

docker run -d -p 7778:8080 test/centos:1.1

运行结果如下:
在这里插入图片描述
到宿主机看看能不能访问。
在这里插入图片描述
ok,成功访问!

十七、docker容器总要关闭的时候,但我们关闭时想要把里面的数据持久化到宿主机怎么办?继续往下看吧!

1、我们要在宿主机的根目录目录创建一个myDataVolume,在容器里的根目录创建一个dataVolumeContainer的文件。可以在下图看到一开始是没有这两个文件的。
在这里插入图片描述
关闭centos容器,接下来在宿主机中使用命令创建创建这两个文件,命令如下:

docker run -it -v /myDataVolume:/dataVolumeContainer centos

运行结果如下:
在这里插入图片描述
成功把这两个文件创建出来了。

参数解释

-v表示新建文件的意思。冒号前面的是宿主机的文件新建目录,后面的是容器中的文件的新建目录,注意是完整目录。

2、’接下来使用命令查看一下文件有没有绑定成功,命令如下:

docker inspect e3c64912030a

后面的是刚刚运行的容器id号,运行结果如下:
在这里插入图片描述

宿主机centos7在Mounts下。

3、接着在宿主机的myDataVolume新建一个host.txt文件,操作如下:
在这里插入图片描述
再去容器中看看有没有对应的文件,操作如下:
在这里插入图片描述
到容器里的host.txt文件中添加一个一些内容看看能不能同步到宿主机,操作如下:

在这里插入图片描述
在这里插入图片描述
保存并关闭,再去宿主机中的对应文件看看有没有更新内容。
在这里插入图片描述
同步成功!

4、接着在容器中创建一个container.txt的文件,看看能不能同步到宿主机。操作如下:
在这里插入图片描述
回到宿主机看看。
在这里插入图片描述
同步成功!

5、接着我们把容器关了。
在这里插入图片描述

注意别用docker rm -f $(docker ps -q),用了后就不能使用 docker ps -l 在最近运行的容器中看到退出的容器。

再创建一个host02.txt文件,然后在container.txt文件中更新一些文件的内容。操作如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
启动centos容器,查看一下有没有同步更新文件。
在这里插入图片描述
同步成功!

7、我们也可以在使用命令创建文件的同时加上权限,使得在容器中创建的文件只读不可写,为了项目演示明显先将之前在宿主机创建的myDataVolume文件夹删除,容器中的dataVolumeContainer文件夹就不用删了,使用命令后会覆盖。操作如下:
在这里插入图片描述
8、在之前的使用的绑定命令的基础下加上:ro,表示容器绑定的文件夹下的文件是只读的,命令如下:

docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos

运行结果如下:
在这里插入图片描述
在宿主机创建host.txt文件并添加内容。
在这里插入图片描述
再回到容器中看看,可以看到内容是成功同步过来的,但创建文件则不允许,因为前面只是给了只读的权限。
在这里插入图片描述
使用命令查看一下具体的内容,命令如下:

docker inspect 4009239e6bd1

运行结果如下:
在这里插入图片描述
可以看到是成功绑定了没错,但没有读写的权限。

十八、使用dockerFile添加容器加载卷,就像上面使用命令绑定文件夹一样,这样的绑定方式可以绑定多个容器下的文件夹,而上面哪个方式不行,建议看这一块对比着上面那一块看。

1、先去根目录下的mydocker文件下编辑Dockerfile文件,编辑的内容如下:

FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------------success1"
CMD /bin/bash

接着使用命令构建镜像,命令如下:

docker build -f /mydocker/Dockerfile -t my/centos .

运行结果如下:
在这里插入图片描述
参数解释

-f后面接的是Dockerfile文件的目录。
-t后面接的是构建镜像的镜像名。
注意命令的最后面还有一个点。

接着运行一下这个自己造的镜像,命令如下:

docker run -it my/centos

运行结果如下:
在这里插入图片描述
可以看到开始就给我们建好了两个文件。

2、我们在dataVolumeContainer1文件下新建个container.txt文件,操作如下:
在这里插入图片描述
可是我们没有指定宿主机的目录,我们可以使用命令查看镜像的细节,命令如下:

docker inspect 1420090eb29a

完整的操作如下:
在这里插入图片描述
宿主机centos7对应的目录在Mounts下的Source,具体如下:
在这里插入图片描述
复制这一目录,到宿主机查看该目录下的内容,具体操作如下:
在这里插入图片描述
可以看到前面创建的文件已经在这了。

二十、现在我们知道了宿主机的文件可以与容器共享,那如何做到宿主机中的文件夹与容器共享,该容器下的文件夹再与其他容器共享。

1、还是使用自己造my/centos镜像创建容器,给这个容器取名dc01,作为父容器,命令如下:

docker run -it --name dc01 my/centos

在dataVolumeContainer2目录下创建dc01_add.txt,完整操作如下:
在这里插入图片描述
2、再使用my/centos镜像造两个容器dc02、dc03,他们的父容器都是dc01。先造dc02的子容器,命令如下:

docker run -it --name dc02 --volumes-from dc01 my/centos

再到dataVolumeContainer2目录下看看有没有dc01中创建的dc01_add.txt文件,完整的操作如下:
在这里插入图片描述
可以看到dc01_add.txt文件已经存在了。我们在dc02下也创建一个文件dc02_add.txt,操作如下:
在这里插入图片描述
然后创建一个dc03的容器,命令如下:

docker run -it --name dc03 --volumes-from dc01 my/centos

看看dataVolumeContainer2目录下有没有dc01和dc02添加的文件,完整的操作如下:
在这里插入图片描述
在dc03也创建一个dc03.txt文件,完整的操作如下:
在这里插入图片描述

二十一、接下来我们在Dockerfile2中自定义一个镜像。

1、首先编辑Dockerfile2文件,加入如下配置:

FROM centos
MAINTAINER gan<gan167@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success---------------------ok"
CMD /bin/bash

运行结果如下:
在这里插入图片描述
接着使用命令构建一下镜像,镜像名为mycentos,命令如下:

docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

运行结果如下:
在这里插入图片描述
中间看到爆红不是错,最后看到Successfully 什么的表示构建成功。
在这里插入图片描述
如果使用构建命令后出现如下的错:
在这里插入图片描述
解决办法是在mydocker目录下新建一个 .dockerignore ,编辑内容为 * ,保存退出即可,如下所示:
在这里插入图片描述

如果使用构建命令后出现如下的错:
在这里插入图片描述
解决办法是编辑sysctl.conf配置文件,重启network和docker服务,命令如下:

vi /etc/sysctl.conf

在配置文件内容的最后面加入如下配置,配置内容如下:

net.ipv4.ip_forward=1

重启network和docker服务,命令如下:

systemctl restart network && systemctl restart docker

查看是否配置成功,命令如下:

sysctl net.ipv4.ip_forward

完整的操作过程如下:
在这里插入图片描述
虽然解决了问题,但由于本人初学docker,没搞懂为什么要这么做。

二十二、接着我们创建一个可以查询ip地址的centos镜像。

1、先到mydocker目录下新建一个Dockerfile3文件,并编辑以下内容:

FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "https://ip.cn" ]

完整的操作过程如下:
在这里插入图片描述

2、然后使用命令构建一个名为myip的镜像,命令如下:

docker build -f /mydocker/Dockerfile3 -t myip .

运行结果如下:
在这里插入图片描述
注意要在最后面看到Successfully什么的才算构建成功。
在这里插入图片描述
3、镜像已经构建好了,接下来我们运行一下看看有什么效果吧,运行命令如下:

docker run -it myip

运行结果如下:
在这里插入图片描述
这是https://ip.cn域名下的html页面,在浏览器看是这样的:
在这里插入图片描述
4、我们在运行myip的镜像时后面加上-i看看会有上面结果,参数-i有显示域名html文件的作用。操作如下:
在这里插入图片描述

可以看到已经报错了,后面加-i相当于在Dockerfile4文件中的最后面加上CMD
["-i"],这样会会覆盖前面的CMD语句,而纯粹的-i不是docker的命令,直接使用-i是不被允许的。

二十三、但CMD只执行最后一个CMD语句,前面的CMD会被覆盖掉,试试将CMD改为ENTRYPOINT会有什么结果。

1、拷贝一份Dockerfile3为Dockerfile4,具体内容如下:

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "https://ip.cn" ]

完整的操作如下:
在这里插入图片描述
2、基于Dockerfile4文件构建一个名为myip2的镜像,命令如下:

docker build -f /mydocker/Dockerfile4 -t myip2 .

运行结果如下:
在这里插入图片描述
3、接下来加上-i参数看看有什么结果。运行结果如下:
在这里插入图片描述
可以看到显示出了域名的html内容。RNTRYPOINT相当于在后面追加-i参数。

二十四、接着我们看看ONBUILD关键字的效果。

1、先拷贝一份Dockerfile4为Dockerfile5,Dockerfile5具体内容如下:

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "https://ip.cn" ]
ONBUILD RUN echo "father images onBuild----------886"

完整的操作如下:
在这里插入图片描述
2、基于Dockerfile5文件构建myip_father镜像,命令如下:

docker build -f /mydocker/Dockerfile5 -t myip_father .

运行结果如下:
在这里插入图片描述
3、接着拷贝Dockerfile3为Dockerfile6,作为myip_father子类,具体的内容如下:

FROM myip_father
RUN yum install -y curl
CMD [ "curl", "-s", "https://ip.cn" ]

完整的操作过程如下:
在这里插入图片描述
4、基于Dockerfile6文件构建一个myip_son镜像,命令如下:

docker build -f /mydocker/Dockerfile6 -t myip_son .

运行过程如下:
在这里插入图片描述
可以看到出现了父镜像中的内容。

二十五、接着我们自定义一个tomcat9。

1、先建好文件目录,拷贝tomcat和jdk压缩包到该目录,过程如下:
在这里插入图片描述
2、编辑Dockerfile文件,文件内容如下:

FROM centos
MAINTAINER   ll<ll@qq.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u241-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.44.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.44
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE  8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.44/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.44/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out

3、然后我们基于Dockerfile构建名为lltomcat9的自定义tomcat镜像,命令如下:

docker build -t lltomcat9 .

这里省略了 -f 具体路径 因为docker默认读取当前目录的Dockerfile文件进行构建镜像。

运行结果如下:
在这里插入图片描述
中途出现红色只是警告,不是报错,如下:
在这里插入图片描述
记得要看到Successfully才算构建成功哦。
在这里插入图片描述
4、然后运行一下lltomcat9这个镜像,取名myt9,命令如下:

docker run -d -p 9080:8080 --name myt9 -v /gan/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.44/webapps/test -v /gan/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.44/logs --privileged=true lltomcat9

别看-v后面那么长,只是容器卷而已,就是宿主机的目录对应容器的目录,:前面的宿主机的目录,后面的容器里的目录。这里建了两个容器卷。–privileged=true解决写权限不够的问题。

运行结果如下:
在这里插入图片描述
运行成功!我们到宿主机看看能不能访问成功。
在这里插入图片描述
ok!

5、看看拷贝过来的txt文件在不在,过程如下:
在这里插入图片描述
6、看看myt9容器的jdk环境版本。操作过程如下:
在这里插入图片描述

二十六、接下来在myt9容器中创建一个a.jsp文件并在浏览器访问。

1、进入之前与容器挂载的test目录,新建一个WEB-INF文件夹,在WEB-INF文件夹下新建一个web.xml。web.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">
  <display-name>test</display-name>
</web-app>

完整的操作过程如下:
在这里插入图片描述
2、接着回到test目录,新建a.jsp文件,文件内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Insert title here</title>

  </head>

  <body>

    -----------welcome------------

    <%="i am in docker tomcat self "%>

    <br>

    <br>

    <% System.out.println("=============docker tomcat self");%>

  </body>

完整的操作过程如下:
在这里插入图片描述
3、接着重启容器,完整的操作过程如下:
在这里插入图片描述
4、最后我们打开宿主机的浏览器,输入正确的路径访问a.jsp文件。
在这里插入图片描述
操作成功!

二十七、接着我们安装一个mysql玩玩。

1、先从阿里云上拉取一个5.7版本的mysql镜像到本地,拉取命令如下:

docker pull mysql:5.7

运行结果如下:
在这里插入图片描述
2、停止正在运行的容器,操作如下:
在这里插入图片描述
3、接着使用命令运行容器,命令如下:

docker run -p 8888:3306 --name mysql -v /gan/mysql/conf:/etc/mysql/conf.d -v /gan/mysql/logs:/logs -v /gan/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

参数说明:

-p 8888:3306:将宿主机的8888端口映射到docker容器的3306端口。
–name mysql:运行服务名字
-v /gan/mysql/conf:/etc/mysql/conf.d :将宿主机/gan/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d
-v /gan/mysql/logs:/logs:将宿主机/gan/mysql目录下的 logs 目录挂载到容器的 /logs。
-v /gan/mysql/data:/var/lib/mysql :将宿主机/gan/mysql目录下的data目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.7 : 后台程序运行mysql5.7

运行结果如下:
在这里插入图片描述
4、进入容器的mysql数据库,完整的操作如下:
在这里插入图片描述
5、简单地操作一下数据库,过程如下:
在这里插入图片描述

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值