Docker(二)

news2025/7/31 23:33:51

 5.容器数据卷

1.什么是容器数据卷

docker理念回顾

将应用和环境打包成一个镜像!

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

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

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

这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!

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

2.使用数据卷

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

docker run -it -v 主机目录:容器目录
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash

启动之后新开一个窗口,通过 docker inspect 容器id 查看具体挂载的内容

测试文件的同步(在主机上改动,观察容器变化)

再来测试

  • 1.停止容器,然后在主机上修改文件

  • 2.启动并进入容器,查看容器内数据,容器内的数据依旧是同步的!

好处:我们以后修改只需要在本地修改即可,容器内会自动同步! 

1.实战:mysql

思考:MySQL的数据持久化的问题!

# 获取镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker pull mysql:5.7
 
# 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意)
# 官方测试, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
 
# 启动我们的
-d      # 后台运行
-p      # 端口隐射
-v      # 卷挂载
-e      # 环境配置
--name  # 容器的名字
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=000000 --name mysql01 mysql:5.7
4e380de478d6ce69e23c4253e03c2beb9482ac2c300be9a9bc6f499b94882c7e
  • 1.启动成功之后,将阿里云服务器打开安全组3310端口

  • 2.我们在本地使用navicat链接测试一下

  • 3.查看本地目录和myql目录
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf  data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
  • 4.在本地测试创建一个数据库,查看下我们的路径是否ok!

 

2.删除容器

问题:那我们将mysql容器删除,卷还在嘛?

[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps    #查看正在运行的容器
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
4e380de478d6   mysql:5.7   "docker-entrypoint.s…"   40 minutes ago   Up 40 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker stop 4e380de478d6     #停止容器
4e380de478d6
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker rm -f mysql01        #删除容器
mysql01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker ps -a        #查看容器
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                      PORTS     NAMES
e6836cef1437   centos    "/bin/bash"   About an hour ago   Exited (0) 56 minutes ago             friendly_hugle

删除之后,去主机的data目录查看

[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd mysql
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# ls
conf  data
[root@iZ8vbgi1zpv4do6camhur3Z mysql]# cd data
[root@iZ8vbgi1zpv4do6camhur3Z data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  performance_schema  public_key.pem   server-key.pem  test
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  mysql        private_key.pem     server-cert.pem  sys

发现,我们加载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

3.匿名和具名挂载

匿名挂载

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx     # -P 随机指定端口
 
# 查看所有volume(卷)的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
 
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!

具名挂载

[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx
 
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+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/xxxxx/_data

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

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

拓展

默认的权限是rw

# 通过 -v 容器内容路径 ro rw 改变读写权限
ro  readonly    # 只读
rw  readwrite   # 可读可写
 
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
 
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作

3.DockerFile

DockerFile就是用来构建docker镜像的构建文件!命令脚本!

[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir docker-test-colume
[root@iZ8vbgi1zpv4do6camhur3Z home]# ls
ceshi  docker-test-colume  kuangshen  mysql  redis  www
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd docker-test-colume/
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# clear
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# pwd
/home/docker-test-colume

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

# 创建一个dockerfile文件
vim dockerfile1
# 文件的内容 指定(大写) 参数
 
#按i进入编辑模式,输入
FROM centos

VOLUME ["volume01", "volume02"]
 
CMD echo "----end----"
CMD /bin/bash
#按esc,退出编辑模式
:wq
# 这里的每一个命令都是镜像的一层!

构建并查看镜像

[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# cat dockerfile1         #查看文件
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"
CMD /bin/bash
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker build -f dockerfile1 -t shuangma/contos:1.0 .   #构建
[+] Building 0.1s (5/5) FINISHED                                                                                                                 
 => [internal] load build definition from dockerfile1                                                                                       0.0s
 => => transferring dockerfile: 121B                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                           0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                            0.0s
 => [1/1] FROM docker.io/library/centos                                                                                                     0.0s
 => exporting to image                                                                                                                      0.0s
 => => exporting layers                                                                                                                     0.0s
 => => writing image sha256:0282d836c4f5ab8268cf4ebcf33ca7109bd03217f82358c4fa764466139852f2                                                0.0s
 => => naming to docker.io/shuangma/contos:1.0                                                                                              0.0s
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
mysql             5.7       c20987f18b13   14 months ago   448MB
shuangma/contos   1.0       0282d836c4f5   17 months ago   231MB
centos            latest    5d0da3dc9764   17 months ago   231MB

这个卷和外部一定有一个同步的目录!

  • 在volume01里创建一个文件
[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# docker run -it 0282d836c4f5 /bin/bash
[root@d5ffb179942a /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@d5ffb179942a /]# cd volume01
[root@d5ffb179942a volume01]# ls
[root@d5ffb179942a volume01]# touch container.txt
[root@d5ffb179942a volume01]# ls
container.txt
  • 查看容器信息,寻找卷挂载的路径
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
d5ffb179942a   0282d836c4f5   "/bin/bash"   2 minutes ago   Up 2 minutes             infallible_villani
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker inspect d5ffb179942a

 进入到匿名挂载卷里的文件是否同步

[root@iZ8vbgi1zpv4do6camhur3Z ~]# cd /var/lib/docker/volumes/f49d8938103d318672f59bf34cf7c840bb920cb20ceffc0ce263c971d0973e4f/_data
[root@iZ8vbgi1zpv4do6camhur3Z _data]# ls
container.txt

4.数据卷容器

多个mysql同步数据!

启动3个容器,通过我们刚才自己写的镜像启动 

  • 1.启动docker01
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
mysql             5.7       c20987f18b13   14 months ago   448MB
centos            latest    5d0da3dc9764   17 months ago   231MB
shuangma/contos   1.0       0282d836c4f5   17 months ago   231MB
[root@iZ8vbgi1zpv4do6camhur3Z home]# docker run -it --name docker01 0282d836c4f5
[root@2ce5e311bb81 /]# ls -l

  • 2.ctrl+p+q退出并不关闭容器docker01,然后启动docker02(这里继承并挂载docker01)
[root@40980c48f0f4 /]# [root@iZ8vbgi1zpv4do6camhur3Z ~]# clear
[root@iZ8vbgi1zpv4do6camhur3Z ~]# docker run -it --name docker02 --volumes-from docker01 0282d836c4f5

  • 3.新开一个会话进入docker01容器,在volume01里创建一个文件夹,然后查看docker02容器的colume01里有没有,发现有的
[root@iZ8vbgi1zpv4do6camhur3Z /]# docker attach 40980c48f0f4
[root@40980c48f0f4 /]# cd volume01
[root@40980c48f0f4 volume01]# ls 
[root@40980c48f0f4 volume01]# touch docker01
[root@40980c48f0f4 volume01]# ls
docker01

  • 4.再新建一个容器docker03继承挂载docker01容器查看

  • 5.docker03新建一个文件查看docke01和02的内容,发现也是存在的

  • 6.这里想一下,docker02和03都挂载在docker01上,如果把docker01给删掉,那里面的内容还会不会在呢,结果是还是会在的

多个mysql实现数据共享

[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论

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

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

6.DockerFile

1.DockerFile介绍

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

构建步骤:

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

查看一下官方是怎么做的?

很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们一样可以!

2.DockerFile的构建过程

基础知识:

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

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

Docker镜像逐渐成为企业的交互标准,必须要掌握!

步骤:开发,部署, 运维..... 缺一不可!

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

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

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

3.DockerFile指令

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

1.创建一个自己的centos

  • 1.创建一个文件夹,然后编写Dockerfile文件
[root@iZ8vbgi1zpv4do6camhur3Z home]# mkdir dockerfile
[root@iZ8vbgi1zpv4do6camhur3Z home]# cd dockerfile/
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim mydockerfile-centos
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat mydockerfile-centos 
FROM centos:7
MAINTAINER shuangma<21212121212@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. 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .

  • 3.测试运行

查看镜像,使用原生centos的命令,使用自己镜像里下载的命令

[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
mycentos          0.1       7a745cbdcbc3   2 minutes ago   630MB
mysql             5.7       c20987f18b13   14 months ago   448MB
centos            latest    5d0da3dc9764   17 months ago   231MB
shuangma/contos   1.0       0282d836c4f5   17 months ago   231MB
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run -it centos
[root@50ecddf32722 /]# pwd
/
[root@50ecddf32722 /]# vim
bash: vim: command not found
[root@50ecddf32722 /]# exit
exit
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run -it mycentos:0.1
[root@118b7117b6ea local]# pwd
/usr/local
[root@118b7117b6ea local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.3  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:03  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@118b7117b6ea local]# vim test
[root@118b7117b6ea local]# cat test
1
  • 4.查看构建历史
docker history 容器id

2.CMD和ENTRYPOINT区别

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

测试CMD

  • 1.创建一个dockerfile文件,编写然后构建,然后运行

[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim dockerfile-cmd-test
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat dockerfile-cmd-test 
FROM centos:7
CMD ["ls","-a"]
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run d53776618e7ca21294bf0d76a1042fa5976f2b0992727c1122ede2900cd8ba93

  • 2.这里想追加一个命令,但是报错了,cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker run d53776618e7ca21294bf0d76a1042fa5976f2b0992727c1122ede2900cd8ba93 -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.

测试ENTRYPOINT

  • 1.创建一个dockerfile文件,编写然后构建,然后运行
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# vim dockerfile-cmd-entrypoint
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# cat dockerfile-cmd-entrypoint 
FROM centos:7
ENTRYPOINT ["ls","-a"]
[root@iZ8vbgi1zpv4do6camhur3Z dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .

  • 2.这里添加一个l查看与cmd的区别,并不会报错,并且直接追加到句子里面了

4.Dockerfile制作tomcat镜像

  • 1.准备镜像文件 tomcat压缩包,jdk的压缩包!

这里我直接xftp工具了,因为之前在学习linux的时候下载过tomcat和jdk的包,直接复制一份到一个新文件夹中

  • 2.编写Dockerfile文件,官方命名Dockerfile, build会自动寻找这个文件,就不需要-f指定了!
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# touch readme.txt
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# vim Dockerfile
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# cat Dockerfile 
FROM centos:7
MAINTAINER shuangma<4042@qq.com>
 
COPY readme.txt /usr/local/readme.txt
 
ADD jdk-8u361-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.69.tar.gz /usr/local/
 
RUN yum -y install vim
 
ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_361
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.69
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 
EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.69/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.69/bin/logs/catalina.out
  • 3.构建镜像
docker build -t diytomcat .
  • 4.启动镜像
docker run -d -p 3344:8080 --name shuangmatomcat1 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.69/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.69/logs diytomcat
  • 5.去宿主机进行本地访问测试,发现没问题,然后再去使用阿里云服务器开启的3344端口的地址也发现没问题
curl localhost:3344

  • 6.发布项目(由于做了卷挂载, 我们直接在本地编写项目就可以发布了)

[root@iZ8vbgi1zpv4do6camhur3Z test]# mkdir WEB-INF
[root@iZ8vbgi1zpv4do6camhur3Z test]# ls
WEB-INF
[root@iZ8vbgi1zpv4do6camhur3Z test]# cd WEB-INF/
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# vim web.xml
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# cat web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        
</web-app>
[root@iZ8vbgi1zpv4do6camhur3Z WEB-INF]# cd ..
[root@iZ8vbgi1zpv4do6camhur3Z test]# vim index.jsp
[root@iZ8vbgi1zpv4do6camhur3Z test]# cat index.jsp 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>

发现:项目部署成功, 可以直接访问ok!

我们以后开发的步骤:需要掌握Dockerfile的编写! 我们之后的一切都是使用docker进行来发布运行的!

  • 7.查看日志
[root@iZ8vbgi1zpv4do6camhur3Z test]# cd ..
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# ls
apache-tomcat-9.0.69.tar.gz  Dockerfile  jdk-8u361-linux-x64.tar.gz  readme.txt  test  tomcatlogs
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# cd tomcatlogs/
[root@iZ8vbgi1zpv4do6camhur3Z tomcatlogs]# ll
total 24
-rw-r----- 1 root root 6707 Mar  7 19:33 catalina.2023-03-07.log
-rw-r----- 1 root root 6763 Mar  7 19:39 catalina.out
-rw-r----- 1 root root    0 Mar  7 19:18 host-manager.2023-03-07.log
-rw-r----- 1 root root  408 Mar  7 19:18 localhost.2023-03-07.log
-rw-r----- 1 root root 1217 Mar  7 19:39 localhost_access_log.2023-03-07.txt
-rw-r----- 1 root root    0 Mar  7 19:18 manager.2023-03-07.log
[root@iZ8vbgi1zpv4do6camhur3Z tomcatlogs]# cat catalina.out

5.发布到docker hub 

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

  • 1.自行注册一个账号并登陆
  • 2.在阿里云服务器查看登陆相关的命令
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a 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
  • 3.登陆,输入登陆的账号后回车,会出现password: 这里的密码是隐藏的,登陆成功就会出现以下结果
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login -u shuangma
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

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

[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
diytomcat            latest    78d382d52e5a   57 minutes ago   815MB
mycentos             0.1       7a745cbdcbc3   3 hours ago      630MB
mysql                5.7       c20987f18b13   14 months ago    448MB
cmdtest              latest    d53776618e7c   17 months ago    204MB
entrypoint-test      latest    dbcf4f99ed1c   17 months ago    204MB
centos               latest    5d0da3dc9764   17 months ago    231MB
shuangma/contos      1.0       0282d836c4f5   17 months ago    231MB
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker tag 78d382d52e5a shuangma/diytomcat:1.0
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
diytomcat            latest    78d382d52e5a   57 minutes ago   815MB
shuangma/diytomcat   1.0       78d382d52e5a   57 minutes ago   815MB
mycentos             0.1       7a745cbdcbc3   3 hours ago      630MB
mysql                5.7       c20987f18b13   14 months ago    448MB
cmdtest              latest    d53776618e7c   17 months ago    204MB
entrypoint-test      latest    dbcf4f99ed1c   17 months ago    204MB
centos               latest    5d0da3dc9764   17 months ago    231MB
shuangma/contos      1.0       0282d836c4f5   17 months ago    231MB
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker push shuangma/diytomcat:1.0

提交也是按照镜像的层级进行提交的

6.发布到阿里云镜像服务上

  • 1.登录阿里云
  • 2.找到容器镜像服务,设置Registry登录密码
  • 3.创建命名空间

  • 4.创建镜像仓库

  • 5.点击仓库名称,参考官方文档

  • 6.登录阿里云Docker Registry
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker login --username=jsm18678940958 registry.cn-zhangjiakou.aliyuncs.com
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
  • 7.推送
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker tag 78d382d52e5a shuangma/diytomcat:1.0
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker push shuangma/diytomcat:1.0

7.总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

都工作3年了,怎么能不懂双亲委派呢?(带你手把手断点源码)

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

c盘怎么清理到最干净?有什么好的清理方法

c盘怎么清理到最干净?有什么好的清理方法&#xff1f;清理C盘空间是电脑维护的重要步骤之一。C盘是Windows操作系统的核心部分&#xff0c;保存了许多重要的系统文件&#xff0c;因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法 一.清理临时文件 在使用…

【Java学习笔记】10.条件语句 - if...else及switch case 语句

前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下&#xff1a; if(布尔表达式) {//如果布…

实验二:动态规划

1.双11的红包雨 问题描述 双11到了&#xff0c;据说这2天会下红包雨&#xff0c;每个红包有不同的价值&#xff0c;小k好开心&#xff0c;但有个规则&#xff0c;就只能接掉落在他身旁的10米范围内的红包&#xff08;0-10这11个位置&#xff09;。小k想尽可能的多抢红包&…

评价提高分子对接性能的组合策略

评价提高分子对接性能的组合策略 相关背景&#xff1a; 分子对接可能是应用于基于结构的药物设计和虚拟筛选活动中最快速、成本最低的计算技术&#xff0c;它可以从巨大的化合物文库中找到潜在的活性分子&#xff0c;用于先导发现。 在分子对接中&#xff0c;配体(通常是小分…

LIME: Low-light Image Enhancement viaIllumination Map Estimation

Abstract当人们在低光条件下拍摄图像时&#xff0c;图像通常会受到低能见度的影响。除了降低图像的视觉美感外&#xff0c;这种不良的质量还可能显著降低许多主要为高质量输入而设计的计算机视觉和多媒体算法的性能。在本文中&#xff0c;我们提出了一种简单而有效的微光图像增…

2023年最新的站内SEO指南:如何通过关键词优化提高网站排名

SEO或搜索引擎优化是指通过改善网站的内部和外部元素&#xff0c;以获得更好的自然搜索引擎排名和更多的网站流量。 链接建设和外链是SEO的重要组成部分&#xff0c;因为它们可以提高网站的权威性和可信度&#xff0c;从而使其在搜索引擎中排名更高。 在此指南中&#xff0c;…

MySQL三范式

1、查询语句写的烂2、索引失效&#xff08;数据变更&#xff09;3、关联查询太多join&#xff08;设计缺陷或不得已的需求&#xff09;4、服务器调优及各个参数设置&#xff08;缓冲、线程数等&#xff09; 通常SQL调优过程&#xff1a; 观察&#xff0c;至少跑1天&#xff0…

CF756div3 vp

又被薄纱了&#xff0c;rk就不放了&#xff0c;好丢人QwQDashboard - Codeforces Round 756 (Div. 3) - CodeforcesA. Make Even小分类讨论题意&#xff1a;给定一个数&#xff0c;每次操作可以选取其前缀然后翻转其前缀&#xff0c;问你最少操作几次可以把该数变为偶数思路&am…

基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION

关于轴承相关的项目之前做的大都是故障识别诊断类型的&#xff0c;少有涉及回归预测的&#xff0c;周末的时候宅家发现一个轴承寿命加速实验的数据集就想着拿来做一下寿命预测。首先看下数据集如下&#xff1a;直接百度即可搜到&#xff0c;这里就不再赘述了。Learning_set为训…

什么是蜕变测试?

文章目录1.传统测试2.蜕变测试2.1.蜕变测试的理解2.2.蜕变测试的步骤2.2.1.生成蜕变关系2.2.2.生成蜕变用例2.2.3.执行蜕变用例2.2.4.校验蜕变关系参考文献1.传统测试 在没有蜕变测试的时代&#xff0c;传统软件测试的原理是&#xff1a;给定输入&#xff0c;观察被测软件的输…

你把骑行当什么? 它就是你需要的

1.骑行是一种有活力的运动&#xff0c;尝试一下你一定会喜欢上它的&#xff01;2.把骑行当作一种娱乐&#xff0c;让自己快乐地体验自然的美&#xff01;3.骑行可以帮助你改变心态&#xff0c;让你的心情变得更加愉悦&#xff01;4.让骑行成为你每天的计划&#xff0c;看看骑行…

项目实战典型案例27——单表的更新接口有9个之多

单表的更新接口有9个之多一&#xff1a;背景介绍环境准备引入pom依赖配置数据库连接mybatis配置文件Mybatis的配置类编写通用的更新语句可以覆盖的更新接口暂时无法覆盖的接口测试四&#xff1a;总结五&#xff1a;升华一&#xff1a;背景介绍 本篇博客是对项目开发中出现的单…

如何分析sql性能

1、前言 提到sql性能分析&#xff0c;可能都会想到explain&#xff0c;它在mysql里被称为执行计划&#xff0c;也就是说可以通过该命令看出mysql在通过优化器分析之后如何执行sql。mysql的内置优化器十分强大&#xff0c;它能帮我们把sql再次优化&#xff0c;以最低的成本去执…

记录自己开发一款小程序中所遇到的问题(uniapp+uview)(持续更新)

每次开发小程序中&#xff0c;都会遇到各种各样的问题。但是有的问题已经遇到过了&#xff0c;但是遇到的时候还是要各种的问度娘。 特此出这篇文章&#xff0c;方便自己也是方便大家。 仅供参考 1. u-collapse的样式在h5中正常&#xff0c;但是运行到微信小程序中样式就乱了…

滑动窗口求最大和最小

滑动窗口 要区分最小和最大滑窗&#xff0c;内层while循环的条件和更新结果的地方 核心&#xff1a; 关键的区别在于&#xff0c;最大滑窗是在迭代右移右边界的过程中更新结果&#xff0c;而最小滑窗是在迭代右移左边界的过程中更新结果。 最小滑窗 给定数组 nums&#xff0…

成都待慕电商:抖音极速版商品卡免佣扶持政策规则

新规&#xff0c;抖音极速版推出商品卡免佣扶持政策规则&#xff0c;本次抖音规则如何规定&#xff1f;具体往下看&#xff1a;一、政策简介1.1政策介绍为了更好地满足用户消费需求&#xff0c;丰富商家经营模式&#xff0c;降低商家经营成本&#xff0c;现平台针对商品卡场景推…

【数据结构】模拟实现 堆

堆数据结构是一种数组对象&#xff0c;它可以被看作一颗完全二叉树的结构&#xff08;数组是完全二叉树&#xff09;&#xff0c;堆是一种静态结构。堆分为最大堆和最小堆。最大堆&#xff1a;每个父结点都大于孩子结点。最小堆&#xff1a;每个父结点都小于孩子结点。堆的优势…

前端脚手架搭建(part 1)

本篇主要介绍如何搭建前端脚手架&#xff0c;一步一步地实现通过搭建的脚手架下载对应的项目模板。通过脚手架的创建&#xff0c;可以快速搭建项目的基础配置和模板&#xff0c;在部门项目开发的规范中尤其总要。初始化项目&#xff1a;创建一个文件夹&#xff0c;命名随便&…

【LeetCode】螺旋矩阵 [M](数组)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,…