Docker
【学习笔记】学习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其实就是可以打包程序和运行环境,把环境和程序—起发布的容器,“集装箱技术”
张三的程序复制到李四的电脑上,任然可以运行。不需要安装任何依赖环境
Docker其实就是可以打包 程序和运行环境放到一个容器里,把环境和程序一起发布的容器。
为什么要使用Docker
我把JDK和Tomcat一起打包成一个容器,一块发送给阿里云
一次配置,到处运行
对开发和运维( DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任a刀。意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军
优势
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理⭕ dockerfile
docker与虚拟机的对比
宿主机
共享地基,共享花园,独立卫生间、厨房和宽带
Docker
1.1docker的核心概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
1.镜像(静态)
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
可以放程序、环境,也可以放操作系统,其实就是一个文件系统
镜像从何而来
- ⭕从Docker Hub下载 (maven->中央仓库)
- ⭕⭕⭕通过Docker File自己创建出来
docker Hub 相当于maven的中央仓库,需要拉下来本地
2.容器(动态)
动态的
容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,
可以记住这个简单的公式:容器 = 容器镜像 + ⭕可读可写层
- 多一个可读写层
- ⭕⭕⭕镜像是一个光盘,光盘是一个操作系统,镜像(OS)运行起来就变成了容器
3.仓库
Docker利用仓库管理镜像的设计理念与⭕Maven非常相似。
Docker总结
- 「Build, Ship and Run (搭建,发送,运行)」
- 「Build once,Run anywhere (搭建一次,运行到任何地方)」
1.2 docker安装
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
- 来自于哪个仓库.比如 ubuntu仓库。镜像的标签信息.比如14,04
- 镜像的ID号(唯一)。
- 创建时间。
- 镜像大小。
- 镜像的ID信息十分重要,它唯一标识了镜像。
imagID很重要,以后删除这个镜像或者xxx操作都是对id进行操作
2.3**镜像搜索 **
搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。
docker serach [镜像名字]
参数:
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
2.4删除镜像
docker rmi 源名字
docker rmi image_id
3.容器核心命令
💹容器依赖镜像,要有镜像才能创建容器
3.1创建容器
Docker的容器十分轻量级,用户可以随时创建或者删除容器。
docker create -it镜像名字
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
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命令。
Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂载一层💹可读写层。
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
- ⭕从地址池配置一个IP地址给容器。
- ⭕执行用户指定的应用程序。 //💹创建完会执行 上面 echo 'hello world’打印
- 执行完毕后容器被终止。
⭕⭕⭕docker只是管理容器的一个工具,他并不是容器
3.4终止容器
3.5 进入容器
命令
docker exec -it /bin/bash
- -it表示交互式进去
- /bin/bash表示进去执行一些命令
⭕里面的 ls 打印的是容器里面的 文件目录, 他跟linux是隔离开的
4.容器的其他命令
开发遇到问题,需要查看日志
4.2查看容器里面的进程
linux 使用top命令查看进程,如果是docker的的进程是阉割版的,使用docker top
docker top 43 #就会展示容器id为43下面所有的进程,只要进程属于容器id=43 的都展示出来
⭕⭕⭕我在容器里跑了个服务/进程,这个服务起来没有? 所以需要查看容器里面的进程
4.3从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目录路径
docker cp 43:/opt/b.info /opt
一定是在exit退出容器后在[root**@localhost opt]上使用这个命令,不能在{root@43f675948db3** opt]容器里使用
5.Docker实践
5.1安装JDK
[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
平时要使用 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 绑定端口**
\
[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
另外知识补充:
-it交互式模式, exec进去容器看看, exit退出容器
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之后一键安装
[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里面的
不从之前rabbitmq
- ⭕⭕⭕❗❗❗然后是在虚拟机上访问火狐浏览器上访问 http: //docker容器的IP地址:15672/,不是在windows操作系统上访问
- ⭕⭕⭕❗❗❗然后是在windows访问浏览器上访问 http://虚拟机ip地址:15672/,
6.docker数据管理
6.1数据卷概念
什么是数据卷?
- ⭕⭕⭕Docker数据卷是宿主机中的一个 目录/文件 , 这个目录/文件是 和容器中的,目录/文件绑定在一起的,是一份副本
- ⭕镜像一直在,但是容器 stop之后, 数据就没有了,所以要在容器外保存一份一样的 目录/文件
- 由于外部主机不能访问容器里面的目录文件数据,只能访问宿主机(虚拟机)的目录 ----->所以需要 把容器目录绑定到 宿主机目录
- 当外部主机 访问 宿主机目录时, 也就相当于访问容器里面的目录,因为容器目录 = 宿主机目录 , 是同步的
数据卷作用
- 容器数据持久化。(当容器删除stop后,由于容器数据绑定到宿主机目录中,即使容器和目录销毁后,我也还保存着 同样一份副本在宿主机目录)
- 外部机器和容器间接通信。
- 容器之间数据交换。
一句话: 卷技术就是为了实现数据的持久化和同步操作, 容器间也是数据共享。
6.2怎么样配置自己项目的数据卷
命令
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:// , 不然访问失败
操作vim index.html时注意事项
enter是输入模式,esc键退出输入模式,然后 : wq 保存退出
6.3第二方式p15集
之前都是用 -v 地址: 地址 来绑定
这种方式可以实现多个容器同步,❗❗❗省略不看了
7.Docker实战_Mysql数据卷挂载
⭕当我们把mysql容器done掉,数据就没有咯,只有干巴巴的镜像,所以我们需要把mysql容器的数据 保存出来
💹所以需要用数据卷保存mysql容器里的数据, 就算你删掉 mysql容器,但是linux外面同步的数据也还在
-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 外面的目录
💹当我挂载之后,我在容器里面 执行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
8.Dockerfile💹💹💹
Dockerfile是用来构建dokcer镜像的文件,是一个命令参数脚本。
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那么我们也可以去构建自己的镜像。
每次都要去 dockerhub去找镜像,但是如果没有镜像呢? 用来创建自己想要的镜像
基本结构:
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
dockerfileDockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称,关键字是FROM,这是必须的.
- 接下来是维护者信息关键字是MAINTAINER,非必须,但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令,如RUN等,每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令. (运行容器时,💹会去执行 catalina.sh这个程序)
重点概念
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockfile文件,这个文件十分简单。
Docker镜像逐渐成为企业交付的标准,因此必须要掌握。
步骤:开发、部署、运维…缺一不可
Dockerfile :构建文件,定义了一切步骤,源代码;
DockerImages :通过Dockerfile构建生成的镜像,最终发布和运行的产品;
Docker容器:容器就是镜像运行起来提供服务器。
原文链接:https://blog.csdn.net/weixin_43246215/article/details/108934216
实战
①在一个空白的文本文件,命名为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 命令构建成镜像。
下面两个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综合案例⭕⭕⭕
注意:
有26个,如果是个人开发或者测试,随意使用一个, ⭕若是生产环境使用,就不合适了。
- 项目需要的Tomcat版本可能不同。
- 项目需要的Tomcat变量不一致。
- 项目需要的JDK可能不一致。
- 用别人的版本都是写死的,我可以使用dockerfile来构建自己的镜像
构建步骤
- 编写一个dockerfile 文件
- docker build构建成为一个镜像
- docker run运行镜像
9.Dockerfile网络管理
查看容器内部网络ip地址的命令:ip addr 【或者 ifconfig】
从上图可知,我们的ip地址有三个网络,这三个网络分别代表了三个不同的环境。
问题:⭕
docker 是如何处理容器网络访问的呢?例如我们在tomcatr容器中运行着一个web项目,同时web项目需要连接一个mysql数据库,那么tomcat和数据库之间该怎么连接呢?
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推送镜像到远程仓库
❗❗❗省略
11.SpringBoot微服务打包成Docker镜像⭕
【学习笔记】学习Docker,看完这篇超详细的教程就足够了_docker学习笔记-CSDN博客
12.docker核心技术_联合文件
减少镜像的层数
优化前
优化后
Docker以前
- 在 Windows | 上安装 Docker Desktop泊坞窗文档
- (50条消息) Docker安装指南——如何在Linux中安装Docker?(最新2022-2 for centOS stream 8)_Mymel_晗的博客-CSDN博客_docker安装
-
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
-
**Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。**或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
-
由于容器是进程级别的,相比虚拟机有很多优势。
特点
(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):仓库可看成一个代码控制中心,用来保存镜像。
-
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
-
⭕Docker 容器通过 Docker 镜像来创建。
-
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
docker中有三大核心组件:
- 1.镜像镜像是一个只读的静态模版,它保存了容器需要的环境和应用的执行代码,可以将镜像看成是容器的代码,当代码运行起来之后,就成了容器, (镜像和容器的关系也类似于程序和进程的关系。)
- 2.容器容器是一个运行时环境,是镜像的一个运行状态,它是镜像执行的动态表现。
- 3.口库库是一个特定的用户存储镜像的目录,一个用户可以建立多个库来保存自己的镜像。
创建容器创建
容器整体上来说有两种不同的方式,可以先创建,再启动,也可以连创建带启动一步到位,无论是那种方式,流程都是相似的,当执行一个创建命令之后, docker首先会去本地路径下查找是否有相应的镜像,如果没有**,就去docker hub上口搜索口**,如果搜索到了,则下载下来,然后利用该镜像口创建一个容器并启动。容器的文件系统是口在只读的镜像文件上添加一层可读写的文件层,这样可以使在不改变镜像的情况下,只记录改变的数据。下面对这两种方式分别予以介绍。
💹💹💹⭕⭕⭕
容器就相当于一个个环境,mysql、nginx、rabbitmq、这些技术栈的环境,docker可以一键安装,不需要在本机上安装,他是很轻量级的,他一般在docker hub上面去找来安装,
容器创建+启动
容器导出
💹💹💹⭕⭕⭕docker的一大优势就是可移植性,容器因此docker容器可以随意的进行导入导出操作。
⭕⭕⭕看到容器导出
启动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