Docker (四)【容器数据卷】

本文详细介绍了Docker容器数据卷的使用,包括直接挂载、数据卷容器和具名挂载,强调了数据卷在容器数据持久化和共享中的作用。此外,还讲解了Dockerfile的基础知识,包括构建自定义镜像、CMD和ENTRYPOINT的区别,并展示了如何构建一个包含Tomcat的应用镜像。最后,提到了如何将镜像推送到Docker Hub进行分享。
摘要由CSDN通过智能技术生成

四、容器数据卷


什么是容器数据卷

如果数据都放在容器中,那么容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删除了,删库跑路!需求:MySQL 数据可以存储在本地

容器之间可以有一个数据共享技术,Docker 容器中产生的数据,同步到本地

目录挂载:将容器内的目录,挂在到 Linux 上面

在这里插入图片描述

总结:容器的持久化和同步操作!容器也是可以数据共享的

4.1 使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v [主机目录]:[容器内目录] -p

# 测试
[root@vinjcent home]# docker run -it -v /home/test:/home centos /bin/bash

# 启动起来时可以通过 docker inspect

[root@vinjcent /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED  
4282d4a6ae1d   centos    "/bin/bash"   2 minutes
[root@vinjcent /]# docker inspect 4282d4a6ae1d

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

特点:在本地修改能够同步到容器内,无论容器是否在运行都能自动同步

4.2 安装MySQL

# 获取 mysql 镜像
[root@vinjcent ~]# dokcer pull mysql:5.7

# 运行容器,需要做数据挂载   安装 mysql,需要配置密码的
# 官方命令
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动 mysql 容器
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

[root@vinjcent ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 启动成功后,在本地使用SQLyog测试连接

在这里插入图片描述

在这里插入图片描述

在本地可视化数据库,创建一个表,同时也能将创建的数据同步到容器中

在这里插入图片描述

在这里插入图片描述

4.3 数据卷容器

两个 mysql 数据同步

在这里插入图片描述

# 启动3个容器,通过自定义的镜像启动
# 列出所有镜像
[root@vinjcent /]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
vinjcent/centos       latest    34f69aa4a6c2   51 minutes ago   231MB
tomcat1.0             1.0       42230d410916   20 hours ago     685MB
redis                 latest    604d80444252   3 days ago       117MB
tomcat                9.0       ae6026892279   7 days ago       680MB
nginx                 latest    0e901e68141f   2 weeks ago      142MB
mysql                 5.7       2a0961b7de03   2 weeks ago      462MB
elasticsearch         7.17.4    d64cccab426e   4 weeks ago      630MB
portainer/portainer   latest    12b0b8dced14   5 weeks ago      75.4MB
centos                latest    5d0da3dc9764   9 months ago     231MB

# 启动自定义的 centos 容器,命名为docker01
[root@vinjcent /]# docker run -it --name docker01 vinjcent/centos

# 启动自定义的 centos 容器,命名为docker02
[root@vinjcent /]# docker run -it --name docker02 --volumes-from docker01 vinjcent/centos

# =====================================docker01===============================================
[root@vinjcent /]# docker run -it --name docker01 vinjcent/centos
[root@d225885c80e5 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jun 17 08:24 dev
drwxr-xr-x.   1 root root  66 Jun 17 08:24 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 257 root root   0 Jun 17 08:24 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jun 17 02:03 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var
drwxr-xr-x.   2 root root   6 Jun 17 08:24 volume01
drwxr-xr-x.   2 root root   6 Jun 17 08:24 volume02
[root@d225885c80e5 /]# cd volume01
[root@d225885c80e5 volume01]# ls
[root@d225885c80e5 volume01]# touch docker01

# =====================================docker02===============================================
[root@vinjcent /]# docker run -it --name docker02 --volumes-from docker01 vinjcent/centos
[root@25d35c3faa4a /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jun 17 08:27 dev
drwxr-xr-x.   1 root root  66 Jun 17 08:27 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 260 root root   0 Jun 17 08:27 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jun 17 02:03 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var
drwxr-xr-x.   2 root root   6 Jun 17 08:24 volume01
drwxr-xr-x.   2 root root   6 Jun 17 08:24 volume02
[root@25d35c3faa4a /]# cd volume01
[root@25d35c3faa4a volume01]# ls
docker01

### --volumes-from   ===>   同样的也实现了容器的数据的共享,每个容器都是隔离的,不管是在哪一方都能够看见数据操作后的结果



# 将其中一个容器删除之后,数据不会导致另外一个共享数据容器的数据也随之消失,实现了备份的效果
[root@vinjcent docker-test-volume]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                     NAMES
25d35c3faa4a   vinjcent/centos   "/bin/sh -c /bin/bash"   52 minutes ago   Up 52 minutes                                             docker02
d225885c80e5   vinjcent/centos   "/bin/sh -c /bin/bash"   55 minutes ago   Up 55 minutes                                             docker01
7a614b0e53a1   nginx             "/docker-entrypoint.…"   6 hours ago      Up 6 hours      0.0.0.0:49154->80/tcp, :::49154->80/tcp   nginx02
942c1ebebb2d   nginx             "/docker-entrypoint.…"   6 hours ago      Up 6 hours      0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx01
[root@vinjcent docker-test-volume]# docker rm -f d225885c80e5
d225885c80e5

多个 mysql 实现数据共享

### mysql01
[root@vinjcent ~]# docker run -d -p 3310:3306 -v /etc/mysql/conf -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

### mysql02
[root@vinjcent ~]# docker run -d -p 3320:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volume-from mysql01 mysql:5.7

# 这个时候可以实现两个容器数据同步

结论

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止

但是一旦持久化到本地,本地的数据是不会删除的

4.4 具名挂载和匿名挂载

# 匿名挂载
-v 容器内路径
[root@vinjcent data]# docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有卷的情况
[root@vinjcent data]# docker volume ls
DRIVER    VOLUME NAME
local     12c904b5a8bfd00f2720f25fe7d2eaf4f070036b6cda36075b58402c467a8a15
local     edc30e3065505aa2f0539bfd0b1a142358f2fb73016d418fc2cbccbc42fae8d6

# 具名挂载
[root@vinjcent data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
7a614b0e53a1e8a79f89c4372142d979e5747cb94f4e6319242477dee70d2db2
[root@vinjcent data]# docker volume ls
DRIVER    VOLUME NAME
local     12c904b5a8bfd00f2720f25fe7d2eaf4f070036b6cda36075b58402c467a8a15
local     edc30e3065505aa2f0539bfd0b1a142358f2fb73016d418fc2cbccbc42fae8d6
local     juming-nginx

# 通过 -v 卷名:容器内路径
[root@vinjcent data]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-06-17T11:09:55+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

所有的 docker 容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx目录下

[root@vinjcent /]# cd /var/lib/docker/
[root@vinjcent docker]# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes

[root@vinjcent docker]# cd volumes/
[root@vinjcent volumes]# ls
12c904b5a8bfd00f2720f25fe7d2eaf4f070036b6cda36075b58402c467a8a15  juming-nginx
backingFsBlockDev                                                 metadata.db
edc30e3065505aa2f0539bfd0b1a142358f2fb73016d418fc2cbccbc42fae8d6

[root@vinjcent volumes]# cd juming-nginx/
[root@vinjcent juming-nginx]# ls
_data

[root@vinjcent juming-nginx]# cd _data/
[root@vinjcent _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

在这里插入图片描述

我们通过具名挂载可以方便的找到一个卷,大多数情况下在使用具名挂载

# 如何确定是具名挂载还是匿名挂载,区别在于有没有指定路径挂载
-v 容器内路径		# 匿名挂载
-v /宿主机路径:容器内路径		# 指定路径挂载

扩展

# 通过 -v 容器内路径:ro / rw 改变读写权限
# ro	readonly
# rw 	readwrite

# 一旦设置了容器权限,容器对我们挂载出来的内容就有限制了
[root@vinjcent /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
[root@vinjcent /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器其内部是无法操作的

4.4 初识 Docker File

Dockerfile 就是用来构建 docker 镜像的构建文件,通过命令脚本可以生成镜像

镜像是一层一层的,脚本一个个的命令

测试

# 创建一个dockerfile文件,名字可以自定义,建议Dockerfile
# 文件中的内容(指令)是大写  参数

[root@vinjcent docker-test-volume]# vim dockerfile1

# dockerfile1文件内容
From centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

# 这里的每一个命令,就是镜像的一层

在这里插入图片描述

# 生成自定义挂载卷镜像
[root@vinjcent docker-test-volume]# docker build -f dockerfile1 -t vinjcent/centos .

在这里插入图片描述

# 查看自定义数据卷的目录

在这里插入图片描述

这个卷和外部一定有一个同步的目录,就如上面所提到的dockert挂载路径
在这里插入图片描述

查看卷挂载的路径

[root@vinjcent /]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
2ef0408cb446   34f69aa4a6c2   "/bin/bash"              59 seconds ago   Up 58 seconds                                             dreamy_aryabhata
7a614b0e53a1   nginx          "/docker-entrypoint.…"   5 hours ago      Up 5 hours      0.0.0.0:49154->80/tcp, :::49154->80/tcp   nginx02
942c1ebebb2d   nginx          "/docker-entrypoint.…"   5 hours ago      Up 5 hours      0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx01
# 通过查看容器内部详细信息,可以看到容器外的挂载路径
[root@vinjcent /]# docker inspect 2ef0408cb446

在这里插入图片描述

测试文件是否同步

在这里插入图片描述

在这里插入图片描述

这张方式在未来使用十分多,通常会构建自己的镜像

假设构建镜像时候没有挂载卷,需要手动镜像挂载 -v

4.4.1 Dockerfile 介绍

dockerfile 是用来构建docker镜像的文件,命令参数脚本

构建步骤:

  1. 编写一个 dockerfile 文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub 、阿里云镜像仓库)

在这里插入图片描述

在这里插入图片描述

很多官方镜像都是基础包,很多功能都不具有,需要我们手动去搭建

4.4.2 Dockerfile构建过程

基础知识

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. “#” 表示注释
  4. 每个指令都会创建提交一个新的镜像层

在这里插入图片描述

dockerfile 是面向开发的,以后要发布项目,做镜像,就需要编写 dockerfile 文件,这个文件十分简单

Docker 镜像逐渐成为企业交付的标准

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务器

4.5 DockerFile 的指令

FROM		# 基础镜像,一切从这里开始构建
MAINTAINER	# 镜像是谁写的  姓名 + 邮箱
RUN			# 镜像构建的时候需要运行的命令
ADD			# 添加内容,比如tomcat压缩包
WORKDIR		# 镜像的工作目录
VOLUME		# 挂载的目录
EXPOSE		# 暴露端口
CMD			# 指定这个容器启动的时候,要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT	# 指定这个容器启动的时候,要运行的命令,可以追加命令
ONBUILD		# 当构建一个被继承 DockerFile 这个时候就会被运行 ONBUILD 的指令,是一种触发指令
COPY		# 类似 ADD 命令,将文件拷贝到镜像中
ENV			# 构建的时候设置环境变量

在这里插入图片描述

4.6 实战测试

Docker Hub 中99%镜像都是从这个基础镜像过来的 FROM sratch,然后配置需要的软件和配置来进行构建

在这里插入图片描述

创建一个自己的centos

# 先运行一个centos容器
[root@vinjcent /]# docker run -it centos
# 命令 pwd 是有的
[root@102a65dc08c0 /]# pwd
/
# 而 vim、ifconfig是没有的
[root@102a65dc08c0 /]# vim
bash: vim: command not found
[root@102a65dc08c0 /]# ifconfig
bash: ifconfig: command not found
# 在本地 /home 目录下创建一个dockerfile文件夹
[root@vinjcent home]# mkdir dockerfile
[root@vinjcent home]# ls
dockerfile
[root@vinjcent home]# cd dockerfile/

### 创建一个自定义的centos镜像

# 1.编写DockerFile文件
[root@vinjcent dockerfile]# vim div_centos_dockerfile

# 2022年需要加FROM centos加上版本号7,如下所示
[root@vinjcent dockerfile]# cat div_centos_dockerfile

# ======================文件内容======================
FROM centos:7
MAINTAINER vinjcent<2573552788@qq.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 "----end----"
CMD /bin/bash
# ======================文件内容======================

# 2.通过这个文件构建镜像
[root@vinjcent dockerfile]# docker build -f div_centos_dockerfile -t div_centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 5d0da3dc9764
Step 2/10 : MAINTAINER vinjcent<2573552788@qq.com>
 ---> Using cache
 ---> 7908e070649b
Step 3/10 : ENV MYPATH /usr/local
 ---> Using cache
 ---> 73302161ae59
Step 4/10 : WORKDIR $MYPATH
 ---> Using cache
 ---> a75c5e6071c6
Step 5/10 : RUN yum -y install vim
 ---> Running in baf1e6dabd56
......
Successfully built fa38876b0d2b
Successfully tagged div_centos:1.0

对比原生 centos 镜像

在这里插入图片描述

在这里插入图片描述

拿到一个镜像可以查看历史的变更

[root@vinjcent dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
div_centos   1.0       fa38876b0d2b   8 minutes ago   601MB
centos       7         eeb6ee3f44bd   9 months ago    204MB
# 查看
[root@vinjcent dockerfile]# docker history fa38876b0d2b
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
fa38876b0d2b   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
e8732db7e605   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
7be27facac36   8 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
dd7e5e952625   8 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
c68d4a79a2b9   8 minutes ago   /bin/sh -c yum -y install net-tools             171MB     
9a761143d117   8 minutes ago   /bin/sh -c yum -y install vim                   226MB     
ea3c72ece7d5   9 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
4cdb2e908e4f   9 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
094dcbda61e8   9 minutes ago   /bin/sh -c #(nop)  MAINTAINER vinjcent<25735…   0B        
eeb6ee3f44bd   9 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      9 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      9 months ago    /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB   

CMD 和 ENTRYPOINT 区别

CMD			# 指定这个容器启动的时候,要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT	# 指定这个容器启动的时候,要运行的命令,可以追加命令

测试 cmd 命令

[root@vinjcent dockerfile]# ls
div_centos_dockerfile
### 编写dockerfile文件
[root@vinjcent dockerfile]# vim div_cmd_dockerfile
# =======================文件内容=================================
FROM centos:7

CMD ["ls","-a"]
# =======================文件内容=================================

[root@vinjcent dockerfile]# docker build -f div_cmd_dockerfile -t div_cmd .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 92c338039804
Removing intermediate container 92c338039804
 ---> 4f9866b5d755
Successfully built 4f9866b5d755
Successfully tagged div_cmd:latest

# 执行了 "ls -a" 命令
[root@vinjcent dockerfile]# docker run 4f9866b5d755
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想要追加一个 -l 命令
[root@vinjcent dockerfile]# docker run 4f9866b5d755 -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled 

# cmd 的情况下,-l 替换了 CMD ["ls","-a"] 命令,-l 不是命令所以报错
docker run 4f9866b5d755 ls -al 		# 才是完整的命令

测试 entrypoint 命令

### 编写dockerfile文件
[root@vinjcent dockerfile]# vim div_entrypoint_dockerfile
[root@vinjcent dockerfile]# cat div_entrypoint_dockerfile 
# =======================文件内容=================================
FROM centos:7

ENTRYPOINT ["ls","-a"]
# =======================文件内容=================================
[root@vinjcent dockerfile]# docker build -f div_entrypoint_dockerfile -t div_entrypoint .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 8e5db219aa97
Removing intermediate container 8e5db219aa97
 ---> dd11944ea9b8
Successfully built dd11944ea9b8
Successfully tagged div_entrypoint:latest
[root@vinjcent dockerfile]# docker run dd11944ea9b8
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

在这里插入图片描述

DockerFile 中很多命令都十分相似,我们需要了解它们的区别,需要通过测试区分它们

4.7 自定义 Tomcat 镜像

  1. 准备进行文件 tomcat 压缩包,jdk 压缩包

JDK压缩包下载:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

在这里插入图片描述

Tomcat压缩包下载:https://tomcat.apache.org/download-90.cgi

在这里插入图片描述

使用 ftp 上传

在这里插入图片描述

  1. 编写 dockerfile 文件,官方命名 Dockerfile,build 会自动寻找这个文件,就不需要 -f 指定了
# 在本地的 /home/vinjcent 目录下
[root@vinjcent vinjcent]# pwd
/home/vinjcent

# 创建一个 readme.txt 文件
[root@vinjcent vinjcent]# touch readme.txt
# 创建并编辑文件div_tomcat_dockerfile
[root@vinjcent vinjcent]# vim div_tomcat_dockerfile

# =======================文件内容=================================

FROM centos:7
MAINTAINER vinjcent<2573552788@qq.com>

COPY readme.txt /url/local/readme.txt

ADD jdk-8u202-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/l
ogs/catalina.out
# =======================文件内容=================================

  1. 构建镜像
# 构建镜像
[root@vinjcent vinjcent]# docker build -f div_tomcat_dockerfile -t div_tomcat .

# 查看下载的镜像
[root@vinjcent vinjcent]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
div_tomcat       latest    c0e79ed03e6e   20 seconds ago   849MB
div_entrypoint   latest    dd11944ea9b8   14 hours ago     204MB
div_cmd          latest    4f9866b5d755   14 hours ago     204MB
div_centos       1.0       fa38876b0d2b   14 hours ago     601MB
centos           7         eeb6ee3f44bd   9 months ago     204MB

# 运行自定义 tomcat 容器
[root@vinjcent vinjcent]# docker run -d -p 9090:8080 --name div_tomcat01 -v /home/vinjcent/build/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/vinjcent/build/tomcat/tomcat_logs/:/usr/local/apache-tomcat-9.0.62/logs div_tomcat

# 查看正在运行的容器
[root@vinjcent tomcat]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS                                       NAMES
f6d25b283ea1   div_tomcat   "/bin/sh -c '/usr/lo…"   About a minute ago   Up About a minute   0.0.0.0:9090->8080/tcp, :::9090->8080/tcp   div_tomcat01
[root@vinjcent tomcat]# docker exec -it f6d25b283ea1

# 进入我们自定义的容器
[root@vinjcent tomcat]# docker exec -it f6d25b283ea1 /bin/bash
[root@f6d25b283ea1 local]# pwd
/usr/local
# 查看目录
[root@f6d25b283ea1 local]# ls -l
total 0
drwxr-xr-x. 1 root root  45 Jun 18 04:11 apache-tomcat-9.0.62
drwxr-xr-x. 2 root root   6 Apr 11  2018 bin
drwxr-xr-x. 2 root root   6 Apr 11  2018 etc
drwxr-xr-x. 2 root root   6 Apr 11  2018 games
drwxr-xr-x. 2 root root   6 Apr 11  2018 include
drwxr-xr-x. 7   10  143 245 Dec 15  2018 jdk1.8.0_202
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib
drwxr-xr-x. 2 root root   6 Apr 11  2018 lib64
drwxr-xr-x. 2 root root   6 Apr 11  2018 libexec
drwxr-xr-x. 2 root root   6 Apr 11  2018 sbin
drwxr-xr-x. 5 root root  49 Nov 13  2020 share
drwxr-xr-x. 2 root root   6 Apr 11  2018 src

# 开启另外一个窗口访问 
[root@vinjcent vinjcent]# curl localhost:9090

外网(自己电脑)访问

在这里插入图片描述

  1. 在 Linux 本地/home/vinjcent/build/tomcat/test/WEB-INF目录下创建 web.xml文件和/home/vinjcent/build/tomcat/test目录下创建 index.jsp文件
<?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_3_0.xsd"
        version="3.0">
    
</web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
    <body>
        <h1>scope1.jsp页面</h1>
        Hello World!<br />
    </body>
</html>

在本地(自己电脑)访问http://192.168.159.100:9090/test/

在这里插入图片描述

日志查看

在本地/home/vinjcent/build/tomcat/tomcat_logs目录下

# 查看输出日志
[root@vinjcent tomcat_logs]# cat catalina.out 

小结:需要掌握 dockerfile 的编写,之后的一切都是用 docker 镜像来发布运行

4.8 发布自己的镜像

DockerHub

地址:https://hub.docker.com/

在我们的服务器上提交自己的镜像

[root@vinjcent /]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

登陆完毕之后就可以提交镜像了,就是 docker push

# 登录dockerhub
[root@vinjcent /]# docker login -u vinjcent
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

### push 命令
# 查看镜像
[root@vinjcent /]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
div_tomcat       latest    bedc043e9029   12 hours ago   849MB
div_entrypoint   latest    dd11944ea9b8   26 hours ago   204MB
div_cmd          latest    4f9866b5d755   26 hours ago   204MB
div_centos       1.0       fa38876b0d2b   27 hours ago   601MB
centos           7         eeb6ee3f44bd   9 months ago   204MB

# push 到我们个人的dockerhub
[root@vinjcent /]# docker push div_tomcat
Using default tag: latest
The push refers to repository [docker.io/library/div_tomcat]
fd68039a504a: Preparing 
604318eb9f98: Preparing 
55aedaec4348: Preparing 
d16fd3a2c693: Preparing 
174f56854903: Preparing 
denied: requested access to the resource is denied	# 问题: 拒绝上传


# 不存在镜像
[root@vinjcent /]# docker push vinjcent/div_tomcat:1.0
The push refers to repository [docker.io/vinjcent/div_tomcat]
An image does not exist locally with the tag: vinjcent/div_tomcat

# 解决: 增加一个 tag
[root@vinjcent /]# docker tag bedc043e9029 vinjcent/tomcat:1.0

# docker push 上去即可,发布的镜像尽量带上版本号
[root@vinjcent /]# docker push vinjcent/tomcat:1.0
The push refers to repository [docker.io/vinjcent/tomcat]
fd68039a504a: Pushed 
604318eb9f98: Pushed 
55aedaec4348: Pushed 
d16fd3a2c693: Pushed 
174f56854903: Pushed 
1.0: digest: sha256:8ced27625d576b5d70fda53c424e073dc2170744923116ee4e1e385b49e45c59 size: 1373

提交的时候也是按照镜像的层级来提交的

在这里插入图片描述

阿里云镜像服务上

  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间
  4. 创建容器镜像
  5. 浏览阿里云

在这里插入图片描述

小结

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值