Docker学习笔记

Docker

image-20240719204024347

【学习笔记】学习Docker,看完这篇超详细的教程就足够了_docker学习笔记-CSDN博客

Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层💹可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  • ⭕⭕⭕从地址池配置一个IP地址给容器。
  • ⭕执行用户指定的应用程序。 //💹创建完会执行 上面 echo 'hello world’打印
  • 执行完毕后容器被终止。

快捷键

  • ctrl + alt + v 粘贴

  • 遇到无下限操作,ctrl+c退出,就回到到了[root@localhost chentainxi]# 输入命令模式了

  • clear清洁控制台,

  • 在linux截屏只能用 💹win + shift + S 而且还是在win10模式下

  • Ubuntu的root用户密码为12345678

  • 安装的时候 :安装就按照老师给的lecture1的ppt步骤来做就行了

  • 账号chentianxi, 超级用户:ru - root 密码:123456 💹💹💹 注意:数字输入numlock锁住了

  • 密码123456

  • ctrl shif + 三个键可以把Teminal终端调大

  • ctrl j加上 - 减号缩小

  • 可以看文件夹里的linux命令大全

  • su root 超级用户登录

  • su 也可以

  • rm删除目录/文件夹

    [chentainxi@localhost ~]$# ls
    a.txt    Documents  Music     Public     test1  Videos
    Desktop  Downloads  Pictures  Templates  test2
    [chentainxi@localhost ~]$# rm test1
    #⭕rm: cannot remove ‘test1’: Is a directory
    [chentainxi@localhost ~]$ #💹rm -r test1        💹要加-r才能删除目录,
    [chentainxi@localhost ~]$ ls
    a.txt    Documents  Music     Public     test2
    Desktop  Downloads  Pictures  Templates  Videos
    [chentainxi@localhost ~]$ 
    

命令忘记了 --help

比如:

  • docker run --help
  • docker logs --help

1.docker安装与介绍

Docker其实就是可以打包程序和运行环境,把环境和程序—起发布的容器,“集装箱技术”

image-20240717112345822

张三的程序复制到李四的电脑上,任然可以运行。不需要安装任何依赖环境

Docker其实就是可以打包 程序和运行环境放到一个容器里,把环境和程序一起发布的容器。

image-20240717113208394

为什么要使用Docker

image-20240717113924166

我把JDK和Tomcat一起打包成一个容器,一块发送给阿里云

一次配置,到处运行

image-20240717114028767

对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任a刀。意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军

优势

  • 更快速的交付和部署
  • 更高效的资源利用
  • 更轻松的迁移和扩展
  • 更简单的更新管理⭕ dockerfile

docker与虚拟机的对比

image-20240717114828681

image-20240717115629314

宿主机

image-20240717120123300

共享地基,共享花园,独立卫生间、厨房和宽带

image-20240717120148141

Docker

image-20240717120233356

1.1docker的核心概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)
1.镜像(静态)

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

可以放程序、环境,也可以放操作系统,其实就是一个文件系统

image-20240717124241907

镜像从何而来

  1. ⭕从Docker Hub下载 (maven->中央仓库)
  2. ⭕⭕⭕通过Docker File自己创建出来

docker Hub 相当于maven的中央仓库,需要拉下来本地

2.容器(动态)

动态的

image-20240717125047409

容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,
可以记住这个简单的公式:容器 = 容器镜像 + ⭕可读可写层

  • 多一个可读写层
  • ⭕⭕⭕镜像是一个光盘,光盘是一个操作系统,镜像(OS)运行起来就变成了容器
3.仓库

Docker利用仓库管理镜像的设计理念与⭕Maven非常相似。

image-20240717125623901

Docker总结

  • 「Build, Ship and Run (搭建,发送,运行)」
  • 「Build once,Run anywhere (搭建一次,运行到任何地方)」

1.2 docker安装

image-20240717171701897

image-20240717171709547

2.docker核心命令

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

2.1镜像下载

镜像是Docker运行容器的前提。

docker pul1 镜像名字:[tag]

如果不指定tag,则下载Docker Hub公共注册服务器中仓库的最新版本。

eg:

[root@localhost chentainxi]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777:⭕ Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

docker拉取镜像失败:download failed after attempts=6: dial tcp 104.18.125.25:443: i/o timeout

Docker Hub 国内镜像设置方法,解决Docker镜像拉取失败 - ikuai - 博客园 (cnblogs.com)

2.2**查看镜像 ** docker images

列出本地主机拥有的镜像

[root@localhost chentainxi]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
rabbitmq     3-management   a97320763e5e   20 months ago   263MB
centos       latest         5d0da3dc9764   2 years ago     231MB
  1. 来自于哪个仓库.比如 ubuntu仓库。镜像的标签信息.比如14,04
  2. 镜像的ID号(唯一)。
  3. 创建时间。
  4. 镜像大小。
  5. 镜像的ID信息十分重要,它唯一标识了镜像。

imagID很重要,以后删除这个镜像或者xxx操作都是对id进行操作

2.3**镜像搜索 **

搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。

docker serach [镜像名字]

参数

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

2.4删除镜像

docker rmi 源名字
docker rmi image_id

3.容器核心命令

💹容器依赖镜像,要有镜像才能创建容器

image-20240718001235822

3.1创建容器

Docker的容器十分轻量级,用户可以随时创建或者删除容器。

docker create -it镜像名字

使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

image-20240718001157476

3.2列出容器

docker   ps   -a:显示为启动容器
docker   ps   -q:返回容器id号

docker ps      #查看正在运行的
docker ps -a   #查看所有,包括没有运行的  -a, –all	显示所有容器(默认只显示正在运行的容器)

3.3新建并启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。

image-20240718003313461

Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层💹可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  • 从地址池配置一个IP地址给容器。
  • ⭕执行用户指定的应用程序。 //💹创建完会执行 上面 echo 'hello world’打印
  • 执行完毕后容器被终止。

⭕⭕⭕docker只是管理容器的一个工具,他并不是容器

image-20240718001838264

image-20240718002217890

3.4终止容器

image-20240718002256403

3.5 进入容器

image-20240719214748938

命令

docker  exec  -it  /bin/bash   
  • -it表示交互式进去
  • /bin/bash表示进去执行一些命令
image-20240719215244248

⭕里面的 ls 打印的是容器里面的 文件目录, 他跟linux是隔离开的

4.容器的其他命令

image-20240718004815723

开发遇到问题,需要查看日志

4.2查看容器里面的进程

linux 使用top命令查看进程,如果是docker的的进程是阉割版的,使用docker top

docker  top   43   #就会展示容器id为43下面所有的进程,只要进程属于容器id=43 的都展示出来

⭕⭕⭕我在容器里跑了个服务/进程,这个服务起来没有? 所以需要查看容器里面的进程

image-20240718011721975

4.3从容器拷贝文件到主机上

docker cp  容器id:容器内路径   目录路径
image-20240718011247274

docker cp 43:/opt/b.info /opt

一定是在exit退出容器后在[root**@localhost opt]上使用这个命令,不能在{root@43f675948db3** opt]容器里使用

image-20240718010656538

5.Docker实践

5.1安装JDK

image-20240718154925795 image-20240718154941863
[root@localhost chentainxi]# docker search java
NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
node                                        Node.js is a JavaScript-based platform for s…   13546     [OK]       
tomcat                                      Apache Tomcat is an open source implementati…   3683      [OK]       
java                                        DEPRECATED; use "openjdk" (or other JDK impl…   2006      [OK]       
ghost                                       Ghost is a free and open source blogging pla…   1723      [OK]       
couchdb                                     CouchDB is a database that uses JSON for doc…   565       [OK]       
amazoncorretto                              Corretto is a no-cost, production-ready dist…   412       [OK]       
jetty                                       Jetty provides a Web server and javax.servle…   406       [OK]       
groovy                                      Apache Groovy is a multi-faceted language fo…   152       [OK]       
ibmjava                                     Official IBM® SDK, Java™ Technology Edition …   126       [OK]       
tomee                                       Apache TomEE is an all-Apache Java EE certif…   116       [OK]       
bitnami/java                                Bitnami container image for Java                28                   [OK]
javanile/vtiger                             Vtiger CRM is open source software that help…   15                   [OK]
appdynamics/java-agent                      Java Agent for Kubernetes                       14                   
docker/dev-environments-javascript          Image for dev-environments using Javascript …   13                   
amazon/aws-lambda-java                      AWS Lambda base images for Java                 12                   
javanile/novnc                              Ready to use NoVNC client for SeleniumHQ on …   4                    [OK]
kasmweb/java-dev                            Ubuntu Java development desktop for Kasm Wor…   4                    
docker/dev-environments-java                Image for dev-environments using Java as mai…   3                    
circleci/java                               This image is for internal use                  2                    
amazon/aws-sam-cli-emulation-image-java11                                                   2                    
javanile/adminer                            Build adminer                                   1                    [OK]
javanile/vtiger-dev                         Ready for development vtiger docker image       1                    
airbyte/java-datadog-tracer-base            Docker image that provides the DataDog Java …   0                    
airbyte/airbyte-base-java-image             Base Java image for Airbyte services            0                    
airbyte/airbyte-base-java-python-image                                                      0                    
[root@localhost chentainxi]# docker pull java
Using default tag: latest
Error response from daemon: manifest for java:latest not found: manifest unknown: manifest unknown❌
[root@localhost chentainxi]# docker pull openjdk:8
8: Pulling from library/openjdk
001c52e26ad5: Pull complete 
d9d4b9b6e964: Pull complete 
2068746827ec: Pull complete 
9daef329d350: Pull complete 
d85151f15b66: Pull complete 
52a8c426d30b: Pull complete 
8754a66e0050: Pull complete 
Digest: sha256:86e863cc57215cfb181bd319736d0baf625fe8f150577f9eb58bd937f5452cb8
Status: Downloaded newer image for openjdk:8
[root@localhost chentainxi]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
rabbitmq     3-management   a97320763e5e   20 months ago   263MB
💹openjdk      8              b273004037cc   23 months ago   526MB
centos       latest         5d0da3dc9764   2 years ago     231MB
[root@localhost chentainxi]# docker run -d -t --name java-8 openjdk:8 ⭕一定要这样执行,上面ppt不对
73e857241fe2
[root@localhost chentainxi]# docker ps
CONTAINER ID   IMAGE       COMMAND   CREATED          STATUS         PORTS     NAMES
73e857241fe2   openjdk:8   "bash"    11 seconds ago   Up 9 seconds             java-8

如果我们不使用容器技术,我们只能从官网下载jar包下来解压,然后配置换件变量,所以非常繁杂

操作遇到的问题

此时java就是一个容器,容器里面装着切割板的操作系统,操作系统给我们装个了java的环境

后面发现原来是docker官网弃用了Java镜像,需要用其他的镜像替代,例如:openjdk8。

docker拉取jdk镜像报错:Error response from daemon: manifest for java:8 not found: manifest unknown: manifes

docker  pull  openjdk:8

5.2安装Tomcat

image-20240718162311040

平时要使用 jar包来配置换件变量1

查看tomcat 镜像

docker search tomcat

下载tomcat镜像

docker pull tomcat

启动tomcat容器

[root@docker ~]# docker run -d --name mytomcat -p 9090:8080 tomcat:9.0    
  • ⭕**–name mytomcat 起一个容器名字**
  • ⭕**-p 9090:8080 绑定端口**

image-20240718162749250

image-20240718163345146\

[root@localhost chentainxi]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
9b857f539cb1: Pull complete 
0ff50609e3ed: Pull complete 
8ec0d02fe661: Pull complete 
b0d053b8dd8b: Pull complete 
b05b6f2f8269: Pull complete 
348c7b20cdd3: Pull complete 
4f4fb700ef54: Pull complete 
0d211925efa0: Pull complete 
Digest: sha256:8b677dabf8609f0870803eef736dfee6dfac113a29cb9e52559e0a227fd7c904
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost chentainxi]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
tomcat       latest         c6c34e2baf1c   5 days ago      454MB
rabbitmq     3-management   a97320763e5e   20 months ago   263MB
openjdk      8              b273004037cc   23 months ago   526MB
centos       latest         5d0da3dc9764   2 years ago     231MB
[root@localhost chentainxi]# docker run -d --name my_tomcat -p 9090:8080   tomcat
a8e4ace661d6bb07bf3a1e8d93904c9095e65f5b6422034faeeecd932cb0ce7b

image-20240718165119165

另外知识补充

-it交互式模式, exec进去容器看看, exit退出容器

image-20240718164406027

docker run -it centos /bin/bash
  • -it就等于 -i和-t,这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)

  • /bin/bash`是要在容器内部执行的命令。 这条命令的含义是在指定的Docker容器内启动一个bash shell,从而可以在容器内执行更多的命令或进行交互操作。1

    当你执行docker exec CONTAINER /bin/bash这个命令时,Docker会在指定容器内启动一个新的Bash进程。⭕⭕⭕**/bin/bash是大多数Linux发行版中的Shell绝对路径,相当于提供了一个命令行界面,允许用户以命令行的方式与操作系统交互。** 通过这个shell,你可以在Docker容器内执行各种命令,就仿佛你在一个独立的Linux环境中一样。

    接下来,让我们详细了解这条命令的使用和相关知识。

5.3安装MySql💹💹💹(重点)

💹想象以前怎么安装mysql,有了docker之后一键安装

image-20240718165346459 image-20240718171035284
[root@localhost chentainxi]# docker pull mysql:5.7
5.7: Pulling from library/mysql
20e4dcae4c69: Pull complete 
1c56c3d4ce74: Pull complete 
e9f03a1c24ce: Pull complete 
68c3898c2015: Pull complete 
6b95a940e7b6: Pull complete 
90986bb8de6e: Pull complete 
ae71319cb779: Pull complete 
ffc89e9dfd88: Pull complete 
43d05e938198: Pull complete 
064b2d298fba: Pull complete 
df9a4d85569b: Pull complete 
Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@localhost chentainxi]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
tomcat       latest         c6c34e2baf1c   6 days ago      454MB
mysql        5.7            5107333e08a8   7 months ago    501MB
rabbitmq     3-management   a97320763e5e   20 months ago   263MB
openjdk      8              b273004037cc   23 months ago   526MB
centos       latest         5d0da3dc9764   2 years ago     231MB
[root@localhost chentainxi]# docker run -d --name my_mysql  -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
720c5643ed767b98ccd77a4f261ca35189cff0da4e9582428d688caf24e7622f
[root@localhost chentainxi]# docker  exec -it 72  /bin/bash
bash-4.2# 
bash-4.2# 
bash-4.2# 
bash-4.2# mysql -uroot -p  ⭕登录
Enter password:  ⭕#输入密码
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql>
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> 
mysql># exit
Bye
bash-4.2# 
bash-4.2# 
bash-4.2# exit
exit
[root@localhost chentainxi]# 
[root@localhost chentainxi]# 
[root@localhost chentainxi]# ifconfig
💹docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255  💹#inet 172.17.0.1 就是docker的主机
        inet6 fe80::42:75ff:fe9c:6218  prefixlen 64  scopeid 0x20<link>
        ether 02:42:75:9c:62:18  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15  bytes 1930 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

💹ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.221.129  netmask 255.255.255.0  broadcast 192.168.221.255  💹 #192.168.221.129是虚拟机的ip
        inet6 fe80::c488:f50:22a8:aa4a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:34:23:64  txqueuelen 1000  (Ethernet)
        RX packets 432677  bytes 624162414 (595.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 102868  bytes 6435188 (6.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

打开Navicat进行测试

连接使用的是windows 系统的Navicat,不是linux里面的

image-20240718180743320

不从之前rabbitmq

  • ⭕⭕⭕❗❗❗然后是在虚拟机上访问火狐浏览器上访问 http: //docker容器的IP地址:15672/,不是在windows操作系统上访问
  • ⭕⭕⭕❗❗❗然后是在windows访问浏览器上访问 http://虚拟机ip地址:15672/,

6.docker数据管理

6.1数据卷概念

什么是数据卷?

  • ⭕⭕⭕Docker数据卷宿主机中的一个 目录/文件 , 这个目录/文件是 和容器中的,目录/文件绑定在一起的,是一份副本
  • ⭕镜像一直在,但是容器 stop之后, 数据就没有了,所以要在容器外保存一份一样的 目录/文件
image-20240718222032989 image-20240718215547436 image-20240718215724767

image-20240718215616523

  • 由于外部主机不能访问容器里面的目录文件数据,只能访问宿主机(虚拟机)的目录 ----->所以需要 把容器目录绑定到 宿主机目录
  • 当外部主机 访问 宿主机目录时, 也就相当于访问容器里面的目录,因为容器目录 = 宿主机目录 , 是同步的
image-20240718215822310

数据卷作用

  1. 容器数据持久化。(当容器删除stop后,由于容器数据绑定到宿主机目录中,即使容器和目录销毁后,我也还保存着 同样一份副本在宿主机目录)
  2. 外部机器和容器间接通信。
  3. 容器之间数据交换。

一句话: 卷技术就是为了实现数据的持久化和同步操作, 容器间也是数据共享

6.2怎么样配置自己项目的数据卷

image-20240718221224842

命令

docker run -v 宿主机目录(文件):容器内目录(文件)
docker run -d --name mytomcat -p 8080:8080  -v /home/chentainxi/test1/webapps:/usr/local/tomcat/webapps    tomcat

注意

  • 目录必须是绝对路径
  • 如果目录不存在则会自动创建
  • 可以挂载多个数据卷

实操把项目放到tomcat中部署

[root@localhost chentainxi]# docker run -d --name mytomcat  tomcat
821f9ec52d724869b4ed9e715bb506937c1317e30c03caf6e542c5108a2e2659
[root@localhost chentainxi]# docker exec -it 82 /bin/bash  ⭕为了进去找/usr/local/tomcat/webapps这个路径
root@⭕821f9ec52d72:/usr/local/tomcat# ls
root@821f9ec52d72:/usr/local/tomcat/webapps# pwd
#/usr/local/tomcat/webapps  
root@821f9ec52d72:/usr/local/tomcat/webapps# exit  退出容器
exit
[root@localhost chentainxi]# 
[root@localhost chentainxi]# pwd
/home/chentainxi
[root@localhost chentainxi]# 
[root@localhost chentainxi]# ⭕⭕⭕docker run -d --name mytomcat -p 8080:8080 -v /home/chentainxi/test1/webapps:/usr/local/tomcat/webapps      tomcat
67a09f64794ebe192cd90eeeeb44496113a1435d4f44de91f47b3a1f02358ea9
[root@localhost chentainxi]# ls
a.txt  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  test1  test3  Videos
[root@localhost chentainxi]# cd test1
[root@localhost test1]# ls
aa  c  ccc.txt  d  #webapps💹新mkdir的
a.txt  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  test1  test3  Videos
[root@localhost chentainxi]# cd test1
[root@localhost test1]# ls
aa  c  ccc.txt  d  webapps
[root@localhost test1]# ^C
[root@localhost test1]# mkdir test
[root@localhost test1]# ls
aa  c  ccc.txt  d  test  webapps
[root@localhost test1]# cd webapps
[root@localhost webapps]# ls
[root@localhost webapps]# mkdir test
[root@localhost webapps]# cd test
[root@localhost test]# vim index.html
[root@localhost test]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
67a09f64794e   tomcat    "catalina.sh run"   7 minutes ago   Up 7 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   mytomcat
[root@localhost test]# docker restart 67
67


#再次进入容器里面查看
[root@localhost test]# docker ⭕exec -it 67 /bin/bash
root@67a09f64794e:/usr/local/tomcat# ls
bin  BUILDING.txt  conf  CONTRIBUTING.md  lib  LICENSE  logs  native-jni-lib  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  temp  webapps  webapps.dist  work
root@67a09f64794e:/usr/local/tomcat# cd webapps
root@67a09f64794e:/usr/local/tomcat/webapps# ls
#test
root@67a09f64794e:/usr/local/tomcat/webapps# cd test
root@67a09f64794e:/usr/local/tomcat/webapps/test# ls
#index.html                💹你看,这里就是同步了/home/chentainxi/test1/webapps/test/index.html
root@67a09f64794e:/usr/local/tomcat/webapps/test# 

⭕⭕docker run -d --name mytomcat -p 8080:8080 -v /home/chentainxi/test1/webapps:/usr/local/tomcat/webapps tomcat 其实也就是在中间加了这些**-v /home/chentainxi/test1/webapps:/usr/local/tomcat/webapps** 进行数据卷绑定

访问测试

❗❗❗注意访问地址不能加https:// , 不然访问失败

image-20240719000155127

操作vim index.html时注意事项

enter是输入模式,esc键退出输入模式,然后 : wq 保存退出

image-20240718233916720

6.3第二方式p15集

之前都是用 -v 地址: 地址 来绑定

这种方式可以实现多个容器同步,❗❗❗省略不看了

7.Docker实战_Mysql数据卷挂载

⭕当我们把mysql容器done掉,数据就没有咯,只有干巴巴的镜像,所以我们需要把mysql容器的数据 保存出来
💹所以需要用数据卷保存mysql容器里的数据, 就算你删掉 mysql容器,但是linux外面同步的数据也还在

image-20240719001909824

-d后台运行

下载镜像

docker pu11 mysq1:5.7

运行镜像

docker run -d -p 3306:3306   \  
-v /opt/mysql/conf:/etc/mysql/conf.d  \  
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysql:5.7

两个 -v代表了一个容器里的两个目录分别挂载同步到linux 外面的目录

image-20240719002051284 image-20240719003022233

💹当我挂载之后,我在容器里面 执行sql数据插入数据,linux外面的文件也会跟着同步数据

[root@localhost chentainxi]# mkdir test2
[root@localhost chentainxi]# ls
a.txt  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  test1  💹test2  test3  Videos
[root@localhost test2]# docker run -d -p 3306:3306  -v /test2/conf:/etc/mysql/conf.d  -v /test2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysql:5.7
8d054da067cb5a0ffc93edaa7e6bcae118b04ad99810274d407a777623472911
[root@localhost test2]# ls

image-20240719003138488

8.Dockerfile💹💹💹

Dockerfile是用来构建dokcer镜像的文件,是一个命令参数脚本。
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那么我们也可以去构建自己的镜像。
每次都要去 dockerhub去找镜像,但是如果没有镜像呢? 用来创建自己想要的镜像

image-20240719010600188

基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

image-20240719011537761

dockerfileDockerfile 四部分说明:

  1. 一开始必须要指明所基于的镜像名称,关键字是FROM,这是必须的.
  2. 接下来是维护者信息关键字是MAINTAINER,非必须,但良好的习惯有利于后期的职责明确.
  3. 后面是镜像操作指令,如RUN等,每执行一条RUN命令,镜像添加新的一层.
  4. 最后是CMD指令,来指明运行容器时的操作命令. (运行容器时,💹会去执行 catalina.sh这个程序

重点概念

Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockfile文件,这个文件十分简单。
Docker镜像逐渐成为企业交付的标准,因此必须要掌握。

步骤:开发、部署、运维…缺一不可

Dockerfile :构建文件,定义了一切步骤,源代码;
DockerImages :通过Dockerfile构建生成的镜像,最终发布和运行的产品;

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

原文链接:https://blog.csdn.net/weixin_43246215/article/details/108934216

实战

image-20240719140257119

①在一个空白的文本文件,命名为Dockerfile1

vim Dockerfile

⭕名字必须交dockerfile

②编写dockerfile文件里面的内容

#基础镜像
FROM centos
#维护者信息
MAINTAINER baizhan<baizhan@163.com>
#当容器启动执行命令
CMD echo "Hello Dockerfile"

③构建镜像

docker build -t 镜像名字:版本 .

注意:末尾的的点 . 代表Dockerfile文件在当前的路径

[root@localhost chentainxi]# cd test1
[root@localhost test1]# ls
aa  c  ccc.txt  d  test  webapps
[root@localhost test1]# vim dockerfile
[root@localhost test1]# vim dockerfile
[root@localhost test1]# docker build -t test:v1 .
Sending build context to Docker daemon   7.68kB
Step 1/3 : FROM centos
 ---> 5d0da3dc9764
Step 2/3 : MAINTAINER baizhan<baizhan@163.com>
 ---> Running in 0cb6730e135e
Removing intermediate container 0cb6730e135e
 ---> 1e724a5b24fc
Step 3/3 : CMD echo "Hello Dockerfile"
 ---> Running in 12f2fb4f3dec
Removing intermediate container 12f2fb4f3dec
 ---> f8e98581ea4b
Successfully built f8e98581ea4b
Successfully tagged test:v1
[root@localhost test1]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED          SIZE
test         v1             f8e98581ea4b   26 seconds ago   231MB
tomcat       latest         c6c34e2baf1c   6 days ago       454MB
mysql        5.7            5107333e08a8   7 months ago     501MB
rabbitmq     3-management   a97320763e5e   20 months ago    263MB
openjdk      8              b273004037cc   23 months ago    526MB
centos       latest         5d0da3dc9764   2 years ago      231MB
[root@localhost test1]# docker run test:v1
💹#Hello Dockerfile     执行打印了出来
[root@localhost test1]# 

Dockerfile文件通过docker build 命令构建成镜像。

image-20240719142512602

image-20240719143506967

下面两个run操作分别在两个不同的目录下进行操作

WORKDIR /OPT
RUN mkdir docker  
WORKDIR /usr/local
RUN echo "test" > a.info

cmd是用于,自动启动一些服务

❗❗❗p20和p21集讲了很多dockerfile的构建指令

[【学习笔记】学习Docker,看完这篇超详细的教程就足够了_docker学习笔记-CSDN博客](https://blog.csdn.net/weixin_43246215/article/details/108934216

8.2综合案例⭕⭕⭕

image-20240719153036014

注意:

有26个,如果是个人开发或者测试,随意使用一个, ⭕若是生产环境使用,就不合适了。

  • 项目需要的Tomcat版本可能不同。
  • 项目需要的Tomcat变量不一致。
  • 项目需要的JDK可能不一致。
  • 用别人的版本都是写死的,我可以使用dockerfile来构建自己的镜像

构建步骤

  1. 编写一个dockerfile 文件
  2. docker build构建成为一个镜像
  3. docker run运行镜像

image-20240719155646009

9.Dockerfile网络管理

查看容器内部网络ip地址的命令:ip addr 【或者 ifconfig】

img

从上图可知,我们的ip地址有三个网络,这三个网络分别代表了三个不同的环境。

问题:⭕

docker 是如何处理容器网络访问的呢?例如我们在tomcatr容器中运行着一个web项目,同时web项目需要连接一个mysql数据库,那么tomcat和数据库之间该怎么连接呢?
img

1、启动一个tomcat

命令:docker run -d -P --name tomcat01 tomcat
然后使用【docker exec -it tomcat01 ip addr】再进入容器并查看一下tomcat的ip地址,发现容器启动的时候会得到一个vethcdb1d6c@if64 的ip地址,这个ip地址就是docker分配的。

在这里插入图片描述

思考:Linux能不能ping通容器内部呢?

我们ping一下刚刚启动的tomcat01,直接ping它的ip地址

**命令:**ping 172.17.0.2 Ctrl+C停止

172.17.0.2 是容器里面的ip地址

在这里插入图片描述

💹结论:Linux是可以ping通docker容器内部的。

容器与容器之间也能ping通

1.我们在创建多一个容器tomcat02

docker run -d -P --name tomcat02 tomcat

2.然后再使用【docker exec -it tomcat02 ip addr】查看一下tomcat的ip

在这里插入图片描述

3、下面我们来测试一下tomcat01和tomcat02是否能够ping通!

命令:

docker exec -it tomcat02 ping 172.17.0.2   #【注:这里的172.17.0.2是tomcat01的ip】

在这里插入图片描述

💹结论:容器与容器之间是可以互相ping通的。

我们根据以上的测试,绘制一个网络模型图【结合测试输出的容器IP地址】

在这里插入图片描述

结论:tomcat01和tomcat02是共用的一个路由器docker0,所有容器再不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP地址。

容器互联 --link 【了解即可】

❗❗❗**【由于这个不常用且有坑,所以不过多介绍】**

自定义网络【create】💹

【学习笔记】学习Docker,看完这篇超详细的教程就足够了_docker学习笔记-CSDN博客

①创建命令:

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  • –driver bridge # 桥接模式
  • –subnet 192.168.0.0/16 # 配制一个子网,65535个字段 192.168.0.2——192.168.255.255
  • –gateway 192.168.0.1 # 配制默认的路由网关
  • mynet #表示自定义的网络名

在这里插入图片描述

②查看一下,命令:docker network ls

在这里插入图片描述

③查看一下mynet的详情,命令:docker network inspect mynet

在这里插入图片描述

④我们自己的网络就创建好了,下面使用我们自定义的网络启动两个tomcat,然后查看一下信息。
依次运行:

# 启动tomcat-net-01
docker run -d -P --name tomcat-net-01 ⭕--net mynet tomcat 
# 启动tomcat-net-02
docker run -d -P --name tomcat-net-02 ⭕--net mynet tomcat 
# 查看一下
docker network inspect mynet

在这里插入图片描述

然后我们测试一下tomcat01和tomcat02之间能不能互相ping通

# tomcat01 ping一下02的IP地址
docker exec -it tomcat-net-01 ping 192.168.0.3
# tomcat02 ping一下01的IP地址
docker exec -it tomcat-net-02 ping 192.168.0.2
在这里插入图片描述

结论:
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
而且这样做的好处:

  • ⭕redis-不同的集群使用不同的网络,保证集群是安全和健康的;
  • ⭕mysql-不同的集群使用不同的网络,保证集群是安全和健康的;

10.Docker推送镜像到远程仓库

image-20240719213209566

❗❗❗省略

11.SpringBoot微服务打包成Docker镜像⭕

【学习笔记】学习Docker,看完这篇超详细的教程就足够了_docker学习笔记-CSDN博客

12.docker核心技术_联合文件

image-20240719214018203 image-20240719214626956 image-20240719214131813

减少镜像的层数

image-20240719214229428

优化前

image-20240719214504461

优化后

image-20240719214553438

Docker以前

  1. 由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

  2. **Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。**或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

  3. 由于容器是进程级别的,相比虚拟机有很多优势。

特点

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

四、Docker 是什么?

**Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。**它是目前最流行的 Linux 容器解决方案。

💹💹💹⭕⭕⭕

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
  1. Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

  2. ⭕Docker 容器通过 Docker 镜像来创建。

  3. 容器与镜像的关系类似于面向对象编程中的对象与类。

Docker面向对象
容器对象
镜像

docker中有三大核心组件:

  • 1.镜像镜像是一个只读的静态模版,它保存了容器需要的环境和应用的执行代码,可以将镜像看成是容器的代码,当代码运行起来之后,就成了容器, (镜像和容器的关系也类似于程序和进程的关系。)
  • 2.容器容器是一个运行时环境,是镜像的一个运行状态,它是镜像执行的动态表现。
  • 3.口库库是一个特定的用户存储镜像的目录,一个用户可以建立多个库来保存自己的镜像。

创建容器创建

容器整体上来说有两种不同的方式,可以先创建,再启动,也可以连创建带启动一步到位,无论是那种方式,流程都是相似的,当执行一个创建命令之后, docker首先会去本地路径下查找是否有相应的镜像,如果没有**,就去docker hub上口搜索口**,如果搜索到了,则下载下来,然后利用该镜像口创建一个容器并启动。容器的文件系统是口在只读的镜像文件上添加一层可读写的文件层,这样可以使在不改变镜像的情况下,只记录改变的数据。下面对这两种方式分别予以介绍。

💹💹💹⭕⭕⭕

容器就相当于一个个环境,mysql、nginx、rabbitmq、这些技术栈的环境,docker可以一键安装,不需要在本机上安装,他是很轻量级的,他一般在docker hub上面去找来安装,

image-20221103091218405

容器创建+启动

image-20221103091430798

容器导出

💹💹💹⭕⭕⭕docker的一大优势就是可移植性,容器因此docker容器可以随意的进行导入导出操作。

image-20221103092415436

⭕⭕⭕看到容器导出

启动mq

启动docker

service docker start

查看

docker ps    查看正在运行的
docker ps -a   #查看所有,包括没有运行的
#江南一点雨的
docker run -d --hostname my-rabbit --name javaboy-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management

docker run -d -p 15672:15672 rabbitmq:management

(51条消息) docker启动并访问RabbitMq_宇泽希的博客-CSDN博客_docker中访问mq

重启一个容器 (上面所指的rabbitmq)

 docker start javaboy-rabbit

删除容器

docker rm $(docker ps -a -q)

无法访问问题💹💹💹

[root@localhost chentainxi]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255  💹#inet 172.17.0.1 就是docker的主机
        inet6 fe80::42:81ff:fe71:1772  prefixlen 64  scopeid 0x20<link>
        ether 02:42:81:71:17:72  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1743 (1.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

两种访问方式

  • ⭕⭕⭕❗❗❗然后是在虚拟机上访问火狐浏览器上访问 http://172.17.0.1 ( docker容器的ip地址):15672/,不是在windows操作系统上访问
  • ⭕⭕⭕❗❗❗然后是在windows访问浏览器上访问 http://虚拟机ip地址:15672/

要关闭防火墙

(51条消息) docker安装rabbitmq后无法访问页面,已解决_光头才能变强的博客-CSDN博客

[root@localhost chentianxi]# docker exec javaboy-rabbit rabbitmq-plugins list
Listing plugins with pattern ".*" ...
 Configured: E = explicitly enabled; e = implicitly enabled
 | Status: * = running on rabbit@my-rabbit
 |/
[  ] rabbitmq_amqp1_0                  3.11.2
[  ] rabbitmq_auth_backend_cache       3.11.2
[  ] rabbitmq_auth_backend_http        3.11.2
[  ] rabbitmq_auth_backend_ldap        3.11.2
[  ] rabbitmq_auth_backend_oauth2      3.11.2
[  ] rabbitmq_auth_mechanism_ssl       3.11.2
[  ] rabbitmq_consistent_hash_exchange 3.11.2
[  ] rabbitmq_event_exchange           3.11.2
[  ] rabbitmq_federation               3.11.2
[  ] rabbitmq_federation_management    3.11.2
[  ] rabbitmq_jms_topic_exchange       3.11.2
[E*] rabbitmq_management               3.11.2
[e*] rabbitmq_management_agent         3.11.2
[  ] rabbitmq_mqtt                     3.11.2
[  ] rabbitmq_peer_discovery_aws       3.11.2
[  ] rabbitmq_peer_discovery_common    3.11.2
[  ] rabbitmq_peer_discovery_consul    3.11.2
[  ] rabbitmq_peer_discovery_etcd      3.11.2
[  ] rabbitmq_peer_discovery_k8s       3.11.2
[E*] rabbitmq_prometheus               3.11.2
[  ] rabbitmq_random_exchange          3.11.2
[  ] rabbitmq_recent_history_exchange  3.11.2
[  ] rabbitmq_sharding                 3.11.2
[  ] rabbitmq_shovel                   3.11.2
[  ] rabbitmq_shovel_management        3.11.2
[  ] rabbitmq_stomp                    3.11.2
[  ] rabbitmq_stream                   3.11.2
[  ] rabbitmq_stream_management        3.11.2
[  ] rabbitmq_top                      3.11.2
[  ] rabbitmq_tracing                  3.11.2
[  ] rabbitmq_trust_store              3.11.2
[e*] rabbitmq_web_dispatch             3.11.2
[  ] rabbitmq_web_mqtt                 3.11.2
[  ] rabbitmq_web_mqtt_examples        3.11.2
[  ] rabbitmq_web_stomp                3.11.2
[  ] rabbitmq_web_stomp_examples       3.11.2

[(51条消息) Centos7安装配置RabbitMQ_不知名架构师的博客-CSDN博客_centos7配置rabbitmq](https://blog.csdn.net/Siebert_Angers/article/details/127429611#:~:text=要想远程访问web管理界面还需要开放防火墙的 5672 和 15672两个端口%2C可以依次执行下面两条命令开放%2C最后再重启一下防火墙%2C使配合生效。 %2F%2F 开放5672端口 firewall-cmd --zone%3Dpublic,%2F%2F 开放15672端口 firewall-cmd --zone%3Dpublic --add-port%3D15672%2Ftcp --permanent 1 2)

http:// 虚拟机的ip地址 :15672/

⭕⭕⭕❗❗❗然后是在windows访问浏览器上访问 http://虚拟机ip地址:15672/,不是在linux操作系统上访问

管理端登录 账号: guest 密码也是 :guest

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值