Docker学习

Docker学习

提示:学习本章内容会用到VMware Workstation Pro和FinalShell软件 。

软件下载链接:https://pan.baidu.com/s/1ojCC_E6CMgFcloDc8dOD0A
提取码:1468

课程文档下载链接:链接:https://pan.baidu.com/s/1R4qGGqUMC8ra5Tz9rIXa4w
提取码:1468

Docker学习_第1张图片

初识docker

Docker学习_第2张图片

项目部署存在的问题

Docker学习_第3张图片

Docker如何解决依赖的兼容问题

Docker学习_第4张图片

Docker如何解决不同系统环境的问题

Docker学习_第5张图片

小结

Docker是一个快速交付应用、运行应用的技术:

Docker学习_第6张图片

Docker学习_第7张图片

Docker与虚拟机

Docker学习_第8张图片

Docker学习_第9张图片

Docker架构

镜像和容器:基于镜像去创建容器,容器可从镜像中读数据

镜像就是硬盘中的文件镜像只能读容器在运行过程中不能往镜像写东西,而是将镜像中存放数据的文件复制一份到容器,再将内容写到容器中文件里面)

进程就是容器(如将mysql跑起来的这个进程就是容器),只不过Docker会给容器做隔离,对外不可见

Docker学习_第10张图片

如何将镜像分享出去呢?

答:使用DockerHub镜像托管服务,所有这类的服务统称为DockerRegistry

DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。

Docker学习_第11张图片

问题:怎么用docker完成镜像构建、远程拉去镜像、如何运行容器呢?

Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器,完成镜像、容器的各自操作等

  • 客户端(client):通过命令(本地)或RestAPI(远程)向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

一个镜像可以运行多个容器,形成集群

Docker学习_第12张图片

小结

Docker学习_第13张图片

Docker基本操作

Docker学习_第14张图片

镜像操作

镜像相关命令

Docker学习_第15张图片

镜像操作命令

CRUD

Docker学习_第16张图片

命令记不住怎么办?

在终端输入docker --help即可查看到所有docker命令以及对应解释

Docker学习_第17张图片

还可以进一步查看 images命令

Docker学习_第18张图片

案例一

Docker学习_第19张图片

Docker学习_第20张图片

拉取nginx镜像:docker pull nginx

Docker学习_第21张图片

案例二

Docker学习_第22张图片

先将本地镜像保存到压缩文件tar: docker save -o nginx.tar nginx:latest

Docker学习_第23张图片

再删除本地镜像: docker rmi nginx:latest

Docker学习_第24张图片

再将tar加载成镜像: docker load -i nginx.tar

Docker学习_第25张图片

记不住命令,就查看帮助文档:docker 命令 --help 比如 docker push --help

小结

Docker学习_第26张图片

练习一

Docker学习_第27张图片

[root@localhost ~]# ll
总用量 142488
-rw-r--r--. 1 root root         0 130 17:05 {
-rw-r--r--. 1 root root         0 130 17:05 }
-rw-------. 1 root root      1440 126 21:38 anaconda-ks.cfg
-rw-r--r--. 1 root root         0 130 17:05 EOF
-rw-------. 1 root root 145902080 131 08:56 nginx.tar
-rw-r--r--. 1 root root         0 130 17:05 registry-mirrors:
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
redis        latest    7614ae9453d1   2 years ago   113MB
[root@localhost ~]# docker save --help

Usage:  docker save [OPTIONS] IMAGE [IMAGE...]

Save one or more images to a tar archive (streamed to STDOUT by default)

Aliases:
  docker image save, docker save

Options:
  -o, --output string   Write to a file, instead of STDOUT
[root@localhost ~]# docker save -o redis.tar redis:latest
[root@localhost ~]# ll
总用量 256064
-rw-r--r--. 1 root root         0 130 17:05 {
-rw-r--r--. 1 root root         0 130 17:05 }
-rw-------. 1 root root      1440 126 21:38 anaconda-ks.cfg
-rw-r--r--. 1 root root         0 130 17:05 EOF
-rw-------. 1 root root 145902080 131 08:56 nginx.tar
-rw-------. 1 root root 116301312 131 09:34 redis.tar
-rw-r--r--. 1 root root         0 130 17:05 registry-mirrors:
[root@localhost ~]# docker rmi redis:latest
Untagged: redis:latest
Untagged: redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Deleted: sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
Deleted: sha256:49c70179bc923a7d48583d58e2b6c21bde1787edf42ed1f8de9e9b96e2e88e65
Deleted: sha256:396e06df5d1120368a7a8a4fd1e5467cdc2dd4083660890df078c654596ddc1c
Deleted: sha256:434d118df2e9edb51238f6ba46e9efdfa21be68e88f54787531aa39a720a0740
Deleted: sha256:2047f09c412ff06f4e2ee8a25d105055e714d99000711e27a55072e640796294
Deleted: sha256:13d71c9ccb39b206211dd1900d06aa1984b0f5ab8abaa628c70b3eb733303a65
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
[root@localhost ~]# docker load --help

Usage:  docker load [OPTIONS]

Load an image from a tar archive or STDIN

Aliases:
  docker image load, docker load

Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output
[root@localhost ~]# docker load -i redis.tar
9b24afeb7c2f: Loading layer [==================================================>]  338.4kB/338.4kB
4b8e2801e0f9: Loading layer [==================================================>]  4.274MB/4.274MB
529cdb636f61: Loading layer [==================================================>]   27.8MB/27.8MB
9975392591f2: Loading layer [==================================================>]  2.048kB/2.048kB
8e5669d83291: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: redis:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
redis        latest    7614ae9453d1   2 years ago   113MB
[root@localhost ~]# 

容器操作

docker run:创建一个容器,并让容器处于运行状态

Docker学习_第28张图片

使用docker exec -it xxx xxx命令进入容器,在容器内修改文件是不推荐的。后面会学数据卷,用来解决这个问题

案例一:创建运行一个Nginx容器

docker run --name mn -p 80:80 -d nginx:latest

Docker学习_第29张图片

Docker学习_第30张图片

访问宿主机(我用的是虚拟机)ip,得到以下结果

Docker学习_第31张图片

查看该容器日志:

docker logs mn

Docker学习_第32张图片

但是这个并不会持续输出日志

docker logs --help 查看帮助文档,发现-f 可以实现持续日志输出

ctrl+c 停止日志跟踪

Docker学习_第33张图片

小结

Docker学习_第34张图片

案例二

docker exec -it mn bash

exit 退出容器

nginx的HTML所在目录是由dockerhub官方规定的,在官网文档中能查看到所在目录地址

因为docker容器中没有vi vim命令,因此用sed替换命令来实现需求

Docker学习_第35张图片

停止mn容器 docker stop mn 展示所有容器 docker ps -a

Docker学习_第36张图片

重启mn容器 docker start mn

Docker学习_第37张图片

删除mn容器 docker rm -f mn

Docker学习_第38张图片

小结

Docker学习_第39张图片

容器练习

docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes #官网告诉我们的命令

Docker学习_第40张图片

Docker学习_第41张图片

Docker学习_第42张图片

[root@localhost ~]# docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
06343c521ba4b54bb16b881355f60f3b70ecbb93f45c59a26fddc231fafb8836

[root@localhost ~]# docker exec -it mr bash
root@06343c521ba4:/data# redis-cli //进入redis-cli客户端
127.0.0.1:6379> set num 666
OK
127.0.0.1:6379> get num
"666"
127.0.0.1:6379> 

在redis客户端可以看到缓存的num=666

Docker学习_第43张图片

也可以直接执行

[root@localhost ~]# docker exec -it mr redis-cli  //直接进入redis-cli
127.0.0.1:6379> set num 666

image-20240131142854662

数据卷(容器数据管理)

Docker学习_第44张图片

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录

删除容器,不会删除数据卷

Docker学习_第45张图片

操作数据卷

语法:docker volume 命令

docker volume inspect 数据卷名 可以查到该数据卷对应在宿主机中的文件路径

Docker学习_第46张图片

案例一

Docker学习_第47张图片

删除数据卷

[root@localhost ~]# docker volume prune   //删除所有未使用的数据卷
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

[root@localhost ~]# docker volume rm html  //删除指定数据卷
html

挂在数据卷—将数据卷挂载到容器中(建立容器与宿主机联系)

docker run --name 容器名 -p 宿主机端口:容器端口 -v 数据卷名:容器目录 -d nginx/redis/mysql等

Docker学习_第48张图片

案例一

docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx //-d表示后台运行

大多数时我们不必自己创建数据卷因为该命令会自动创建html数据卷(当没有html数据卷时),但是nginx镜像一定要存在(nginx这样写默认就是用latest版本也可这样写 nginx:版本号)

Docker学习_第49张图片

案例二

Docker学习_第50张图片

命令

###官方给的命名缺少端口,和数据卷挂载,-p -v自己写 -v:后的去hubdocker官网查找
docker run \ --name mmysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ -v /tmp/mysql/data:/var/lib/mysql \ -d \ mysql:5.7.25

操作命令

[root@localhost _data]# cd /tmp

[root@localhost tmp]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
redis        latest    7614ae9453d1   2 years ago   113MB

[root@localhost tmp]# docker load -i mysql.tar
5dacd731af1b: Loading layer [==================================================>]  58.45MB/58.45MB
f411d8bde01c: Loading layer [==================================================>]  338.4kB/338.4kB
0aa7d65147ef: Loading layer [==================================================>]  10.44MB/10.44MB
3437f67a712b: Loading layer [==================================================>]  4.472MB/4.472MB
ec41e34b35a0: Loading layer [==================================================>]  1.536kB/1.536kB
458d25c646d8: Loading layer [==================================================>]  46.15MB/46.15MB
97874ea0e7f9: Loading layer [==================================================>]  31.74kB/31.74kB
5075b9328698: Loading layer [==================================================>]  3.584kB/3.584kB
364557e875f1: Loading layer [==================================================>]  257.3MB/257.3MB
9209148debed: Loading layer [==================================================>]  9.728kB/9.728kB
82582edf9553: Loading layer [==================================================>]  1.536kB/1.536kB
Loaded image: mysql:5.7.25

[root@localhost tmp]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
redis        latest    7614ae9453d1   2 years ago   113MB
mysql        5.7.25    98455b9624a9   4 years ago   372MB

[root@localhost tmp]# mkdir -p mysql/data
[root@localhost tmp]# mkdir -p mysql/conf
[root@localhost tmp]# docker run \
>   --name mmysql \
>   -e MYSQL_ROOT_PASSWORD=123456 \
>   -p 3306:3306 \
>   -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
>   -v /tmp/mysql/data:/var/lib/mysql \
>   -d \
>   mysql:5.7.25 
dbc5c2d36ceb24b1fbe6e23ea23ab49875e52448b8d411dfc2ee69f824e342f6
[root@localhost tmp]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
dbc5c2d36ceb   mysql:5.7.25   "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mmysql
5b469339c8bb   nginx          "/docker-entrypoint.…"   18 hours ago    Up 18 hours    0.0.0.0:80->80/tcp, :::80->80/tcp                      mn
06343c521ba4   redis          "docker-entrypoint.s…"   19 hours ago    Up 19 hours    0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              mr



数据卷挂载与目录挂载对比

数据卷挂载:隐藏细节(创建数据卷,并不能指定数据卷所对应宿主机的位置),不方便管理

目录挂载:自己创建宿主机目录,方便管理

Docker学习_第51张图片

小结

Docker学习_第52张图片

Dockerfile 自定义镜像

Docker学习_第53张图片

镜像结构

镜像是由应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

Docker学习_第54张图片

Docker学习_第55张图片

自定义镜像及docker部署

什么是 Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令 (Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目

创建镜像:docker build -t javaweb:1.0

Docker学习_第56张图片

Docker学习_第57张图片

命令如下

[root@localhost /]# cd /tmp
[root@localhost tmp]# mkdir docker-demo

[root@localhost tmp]# cd docker-demo
[root@localhost docker-demo]# ll
总用量 0

将文件拖拽进入虚拟机文件夹
[root@localhost docker-demo]# ll
总用量 206192
-rw-r--r--. 1 root root  25620395 21 10:38 docker-demo.jar
-rw-r--r--. 1 root root       494 21 10:38 Dockerfile
-rw-r--r--. 1 root root 185515842 21 10:39 jdk8.tar.gz


[root@localhost docker-demo]# docker build -t javaweb:1.0 .  //生成javaweb:1.0镜像  .代表Dockfile文件路径在本地
[+] Building 62.8s (9/9) FINISHED                                                                                                                                                                                                   docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                          0.4s
 => => transferring dockerfile: 591B                                                                                                                                                                                                          0.2s
 => [internal] load metadata for docker.io/library/ubuntu:16.04                                                                                                                                                                              16.6s
 => [internal] load .dockerignore                                                                                                                                                                                                             0.0s
 => => transferring context: 2B                                                                                                                                                                                                               0.0s
 => [1/4] FROM docker.io/library/ubuntu:16.04@sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c                                                                                                                        25.8s
 => => resolve docker.io/library/ubuntu:16.04@sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c                                                                                                                         0.4s
 => => sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c 1.42kB / 1.42kB                                                                                                                                                0.0s
 => => sha256:a3785f78ab8547ae2710c89e627783cfa7ee7824d3468cae6835c9f4eae23ff7 1.15kB / 1.15kB                                                                                                                                                0.0s
 => => sha256:b6f50765242581c887ff1acc2511fa2d885c52d8fb3ac8c4bba131fd86567f2e 3.36kB / 3.36kB                                                                                                                                                0.0s
 => => sha256:58690f9b18fca6469a14da4e212c96849469f9b1be6661d2342a4bf01774aa50 46.50MB / 46.50MB                                                                                                                                             10.1s
 => => sha256:b51569e7c50720acf6860327847fe342a1afbe148d24c529fb81df105e3eed01 857B / 857B                                                                                                                                                    0.9s
 => => sha256:da8ef40b9ecabc2679fe2419957220c0272a965c5cf7e0269fa1aeeb8c56f2e1 528B / 528B                                                                                                                                                    1.0s
 => => sha256:fb15d46c38dcd1ea0b1990006c3366ecd10c79d374f341687eb2cb23a2c8672e 170B / 170B                                                                                                                                                    1.4s
 => => extracting sha256:58690f9b18fca6469a14da4e212c96849469f9b1be6661d2342a4bf01774aa50                                                                                                                                                    14.4s
 => => extracting sha256:b51569e7c50720acf6860327847fe342a1afbe148d24c529fb81df105e3eed01                                                                                                                                                     0.0s
 => => extracting sha256:da8ef40b9ecabc2679fe2419957220c0272a965c5cf7e0269fa1aeeb8c56f2e1                                                                                                                                                     0.0s
 => => extracting sha256:fb15d46c38dcd1ea0b1990006c3366ecd10c79d374f341687eb2cb23a2c8672e                                                                                                                                                     0.0s
 => [internal] load build context                                                                                                                                                                                                            21.0s
 => => transferring context: 211.19MB                                                                                                                                                                                                        21.0s
 => [2/4] COPY ./jdk8.tar.gz /usr/local/                                                                                                                                                                                                      2.5s
 => [3/4] COPY ./docker-demo.jar /tmp/app.jar                                                                                                                                                                                                 0.4s
 => [4/4] RUN cd /usr/local  && tar -xf ./jdk8.tar.gz  && mv ./jdk1.8.0_144 ./java8                                                                                                                                                          13.2s
 => exporting to image                                                                                                                                                                                                                        3.3s
 => => exporting layers                                                                                                                                                                                                                       3.3s
 => => writing image sha256:4031bf03fcfb669dfe100efac05f86f407d6a4d27e2445d0538203e83dde5e4a                                                                                                                                                  0.0s
 => => naming to docker.io/library/javaweb:1.0                                                                                                                                                                                                0.0s
[root@localhost docker-demo]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
javaweb      1.0       4031bf03fcfb   14 seconds ago   722MB
nginx        latest    605c77e624dd   2 years ago      141MB
redis        latest    7614ae9453d1   2 years ago      113MB
mysql        5.7.25    98455b9624a9   4 years ago      372MB
[root@localhost docker-demo]# docker run --name web -p 8090:8090 -d javaweb:1.0  //将javaweb:1.0镜像运行成一个容器
9d93fa8812dedc6e2f9fe526744b17db628c79f097262b8a56bbb28c0929458c
[root@localhost docker-demo]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS             PORTS                                                  NAMES
9d93fa8812de   javaweb:1.0    "/bin/sh -c 'java -j…"   11 seconds ago      Up 7 seconds       0.0.0.0:8090->8090/tcp, :::8090->8090/tcp              web
dbc5c2d36ceb   mysql:5.7.25   "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mmysql
5b469339c8bb   nginx          "/docker-entrypoint.…"   19 hours ago        Up 19 hours        0.0.0.0:80->80/tcp, :::80->80/tcp                      mn
06343c521ba4   redis          "docker-entrypoint.s…"   20 hours ago        Up 20 hours        0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              mr

[root@localhost docker-demo]# 

最后访问 http://192.168.83.130:8090/hello/count ,其中的ip为你的虚拟机ip

Docker学习_第58张图片

上述案例存在一些问题

在dockerfile中存在大量的数据可复用,若我要执行多个java微服务 按这样岂不是每个微服务都要配置环境变量,很麻烦,能不能把配置环境变量,Jdk安装等可复用的步骤形成一个新的镜像。以后部署微服务只要在这个镜像上接着执行就好了

Docker学习_第59张图片

答:能 基于java:8-alpine镜像(别人已经给我们做好了)

Docker学习_第60张图片

先更新Dockerfile

Docker学习_第61张图片

将这三个资料传入虚拟机一个文件夹中(我用的是 /tmp/docker-demo1)

Docker学习_第62张图片

然后在虚拟机中执行以下命令,跟上述类似

[root@localhost /]# cd /tmp/docker-demo1
[root@localhost docker-demo1]# docker build -t javaweb:2.0 . //创建javaweb:2.0 镜像
[+] Building 32.9s (7/7) FINISHED                                                                                                                                                                                                   docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                          0.1s
 => => transferring dockerfile: 278B                                                                                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/java:8-alpine                                                                                                                                                                             16.1s
 => [internal] load .dockerignore                                                                                                                                                                                                             0.0s
 => => transferring context: 2B                                                                                                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                                                                             1.4s
 => => transferring context: 25.63MB                                                                                                                                                                                                          1.4s
 => [1/2] FROM docker.io/library/java:8-alpine@sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f                                                                                                                       14.5s
 => => resolve docker.io/library/java:8-alpine@sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f                                                                                                                        0.0s
 => => sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f 947B / 947B                                                                                                                                                    0.0s
 => => sha256:3fd9dd82815ca4510a34bafef556815c440bcff37827d8495639137aeb145a36 3.29kB / 3.29kB                                                                                                                                                0.0s
 => => sha256:7095154754192bfc2306f3b2b841ef82771b7ad39526537234adb1e74ae81a93 2.31MB / 2.31MB                                                                                                                                                0.7s
 => => sha256:38a1c0aaa6fda9a4f5f940c5c7a0622430f1faac9de367016cd5a0aed8ef4478 228B / 228B                                                                                                                                                    0.9s
 => => sha256:5b58c996e33ea9b6701cb8935434be70cb9e5908d81a81f360b47e6f9394a1d7 49.36MB / 49.36MB                                                                                                                                              8.7s
 => => extracting sha256:7095154754192bfc2306f3b2b841ef82771b7ad39526537234adb1e74ae81a93                                                                                                                                                     0.7s
 => => extracting sha256:38a1c0aaa6fda9a4f5f940c5c7a0622430f1faac9de367016cd5a0aed8ef4478                                                                                                                                                     0.1s
 => => extracting sha256:5b58c996e33ea9b6701cb8935434be70cb9e5908d81a81f360b47e6f9394a1d7                                                                                                                                                     5.7s
 => [2/2] COPY ./docker-demo.jar /tmp/app.jar                                                                                                                                                                                                 1.5s
 => exporting to image                                                                                                                                                                                                                        0.2s
 => => exporting layers                                                                                                                                                                                                                       0.2s
 => => writing image sha256:e93f16c6deeff9b2b657be33baa902f8c7dfda98e5217d10798aa6d858e2f776                                                                                                                                                  0.0s
 => => naming to docker.io/library/javaweb:2.0                                                                                                                                                                                                0.0s
[root@localhost docker-demo1]# docker run --name web2 -p 8091:8090 -d javaweb:2.0 //将javaweb:2.0镜像运行成容器web2
8effb72404119f6b8dceb553adf24874db972df17ee050471ea4033fe082a934
[root@localhost docker-demo1]# docker ps -a //查看存在
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
8effb7240411   javaweb:2.0    "/bin/sh -c 'java -j…"   7 seconds ago    Up 5 seconds    0.0.0.0:8091->8090/tcp, :::8091->8090/tcp              web2
9d93fa8812de   javaweb:1.0    "/bin/sh -c 'java -j…"   24 minutes ago   Up 24 minutes   0.0.0.0:8090->8090/tcp, :::8090->8090/tcp              web
dbc5c2d36ceb   mysql:5.7.25   "docker-entrypoint.s…"   2 hours ago      Up 2 hours      0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mmysql
5b469339c8bb   nginx          "/docker-entrypoint.…"   20 hours ago     Up 20 hours     0.0.0.0:80->80/tcp, :::80->80/tcp                      mn
06343c521ba4   redis          "docker-entrypoint.s…"   21 hours ago     Up 21 hours     0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              mr
[root@localhost docker-demo1]# 

然后访问http://192.168.83.130:8091/hello/count

Docker学习_第63张图片

小结

Docker学习_第64张图片

DockerCompose

初始DockerCompose

•Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

•Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行

•DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

Docker学习_第65张图片

安装DockerCompse 参考Docker安装笔记

DockerCompose 有什么作用?答:集群的快速构建和部署

部署微服务集群

案例:将cloud-demo微服务集群利用DockerCompose部署

微服务地址不向外暴露,只向外暴露网关(网关是微服务的入口)

Docker学习_第66张图片

例如

image-20240201155516490

Docker学习_第67张图片

进入虚拟机的cloud-demo文件夹中

一键部署 docker-compose up -d

查看全部日志 docker-compose logs 查看某个服务日志docker-compose logs -f userservice

重启微服务 docker-compose restart gateway userservice orderservice

注意:先部署nacos再部署其他微服务,因为其他微服务要在nacos中注册

镜像仓库(Docker Registry)

有公共和私有两种形式,dockerhub就是一个公共的镜像仓库。但企业需要私有镜像仓库

搭建私有镜像仓库(并把仓库地址配置到docker服务的daemon.json文件中,被docker信任)

Docker学习_第68张图片

搭建好了以后,在浏览器输入http://192.168.83.130:8080/

Docker学习_第69张图片

向私有镜像仓库推送镜像,从私有镜像仓库拉取镜像

Docker学习_第70张图片

#重新tag本地镜像 名称前缀为私有仓库地址
[root@localhost registry-ui]# docker tag redis:latest 192.168.83.130:8080/redis:1.0 

#推送镜像
[root@localhost registry-ui]# docker push 192.168.83.130:8080/redis:1.0

#拉取镜像
[root@localhost registry-ui]# docker pull 192.168.83.130:8080/redis:1.0

点击下方按钮会自动帮你复制拉取命令 docker pull 192.168.83.130:8080/redis:1.0 拉取到docker

使用docker images 能查看拉取到的镜像

Docker学习_第71张图片

Docker学习_第72张图片

小结

Docker学习_第73张图片

你可能感兴趣的:(docker,容器,centos,微服务,分布式,java,后端)