Docker(二)
创始人
2024-05-30 05:02:50
0

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

构建并查看镜像

[root@iZ8vbgi1zpv4do6camhur3Z docker-test-colume]# cat dockerfile1         #查看文件
FROM centosVOLUME ["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 $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD 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  mtu 1500inet 172.18.0.3  netmask 255.255.0.0  broadcast 172.18.255.255ether 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 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX 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.txtADD jdk-8u361-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.69.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/local
WORKDIR $MYPATHENV 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/binEXPOSE 8080CMD /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 


[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"%>




hello. xiaofan


Hello World!
<% System.out.println("-----my test web logs------"); %>

发现:项目部署成功, 可以直接访问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 --helpUsage:  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-storeLogin 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-storeLogin Succeeded
  • 7.推送
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker tag 78d382d52e5a shuangma/diytomcat:1.0
[root@iZ8vbgi1zpv4do6camhur3Z tomcat]# docker push shuangma/diytomcat:1.0

7.总结

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...