Docker的基础知识详解(镜像,容器,网络)

Docker

一. Docker的概述

1. Docker为什么会出现

在这里插入图片描述

虚拟机: 在window中装一个Vmware 通过这个软件我们可以虚拟出来或者多台电脑 笨重

----本质上也是一种虚拟化技术 Docker容器也是一种虚拟化技术

2. Docker能干什么

虚拟技术的缺点:

  1. 资源占用十分多
  2. 冗余步骤多
  3. 启动慢

容器化技术:

  1. 容器化技术不是模拟的一个完整的操作系统
  2. 传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作系统上安装和运行软件
  3. 容器内的应用直接运行在 宿主机的内核 容器是没有自己的内核的 不用虚拟硬件 轻便
  4. 每个容器间是互相隔离 每个容器内都有一个属于自己的文件系统 互不影响

Docker的优点:

  1. 应用更快速的交付和部署
  2. 更便捷的升级和扩缩容
  3. 更简单的系统运维
  4. 更高效的计算资源利用
3. Docker的组成

在这里插入图片描述

镜像(Image):

Docker的镜像就好比是一个模板 通过这个模板来创建容器服务

tomcat镜像=>Run=>tomcat01容器(提供服务)

通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

容器(Container):

Docker利用容器技术 独立运行一个或一组应用 ----通过镜像来创建

可以把这个容器理解为一个简易的 Linux系统

仓库(Repository):

仓库就是存放镜像的地方

分为公有仓库和私有仓库

Docker Hub----默认是国外的

阿里云等也支持(需要配置镜像加速)

4. Docker的运行流程

在这里插入图片描述

5. Docker的底层原理

Docker是怎么工作的?

Docker是一个Client-Server 结构的系统 Docker的守护进程运行在主机上 通过Socket从客户端访问

DockerServer接受到Docker-Client 的指令 就会执行这个命令

在这里插入图片描述

Docker为什么比VM快

  1. Docker有着比虚拟层更少的抽象层

  2. Docker利用的是宿主机的内核,VM需要的是Guest OS

    所以说 新建一个容器的时候 Docker不需要像虚拟机一样重新加载一个操作系统内核

    避免引导 虚拟机是加载Guest OS —分钟级别 而Docker是利用宿主机的操作系统 省略

    了这个复杂过程 —秒级

二. Docker的常用命令

1. 镜像命令
docker images   ---查看docker 镜像

[root@hdzs-zhuji ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB
####解释
REPOSITORY     镜像的仓库源
TAG            镜像的标签
IMAGE ID       镜像的ID
CREATED        镜像的创建时间
SIZE           镜像的大小
###命令可选项
[root@hdzs-zhuji ~]# docker images --help
  -a, --all             显示全部
  -q, --quiet           只显示镜像ID
docker search 搜索镜像
[root@hdzs-zhuji ~]# docker search  mysql
NAME                            DESCRIPTION                                     STARS(收藏数)     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13210     [OK]
mariadb                         MariaDB Server is a high performing open sou…   5050      [OK]
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   630       [OK]
percona                         Percona Server is a fork of the MySQL relati…   586       [OK]
bitnami/mysql                   Bitnami MySQL Docker Image                      77                   [OK]
####可选项
--filter=STARS=3000
###筛选收藏数大于3000的
[root@hdzs-zhuji ~]# docker search  mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13210     [OK]
mariadb   MariaDB Server is a high performing open sou…   5050      [OK]

####镜像下载
docker pull xxx  (默认就是下载最新)
docker pull xxx:版本  (指定版本下载)====推荐使用
####镜像的卸载
docker rmi -f xxxx  ---镜像id   -f就是全删  id id 可以多删
docker rmi -f $(docker images -qa)  ---所有镜像文件全删
###删除镜像大有玄机###
1.docker rmi 镜像ID
2.docker rmi -f 镜像ID
3.docker rmi 镜像仓库名:tag

在这里插入图片描述

2. 容器命令

说明: 我们有了镜像才可以创建容器 Linux 下载一个centos 镜像来测试学习

docker pull centos

新建容器并启动

docker run [参数]  镜像

###参数说明
--name="名称"   容器名字  例如tomcat01  tomcat02 tomcat03
-d             后台方式运行
-it            使用交互方式运行  进入容器查看内容
-p             小p  指定容器的端口  8080:8080
                                 -p ip:主机端口:容器端口
                                 -p 主机端口映射容器端口  --常用  xxx:xxx
                                 -p 容器端口
-P             大p  随机指定端口

开始测试

##下载一个centos 镜像
docker pull centos   --下载
[root@hdzs-zhuji ~]# docker run -it centos /bin/bash  ##运行并进入
[root@86c89d8f0f3c /]#             ---成功进入 
[root@86c89d8f0f3c /]# ls          ---它就是一个小型服务器
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@86c89d8f0f3c /]# exit  ---退出

###
exit  ---这是直接退出 容器会关闭
ctrl + P  + Q   ---容器不停止退出

查看哪些在运行中的容器

[root@hdzs-zhuji ~]# docker ps   ###查看正在运行中的容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@hdzs-zhuji ~]# docker ps -a  ###查看历史运行记录
CONTAINER ID   IMAGE         COMMAND       CREATED          STATUS                      PORTS     NAMES
86c89d8f0f3c   centos        "/bin/bash"   5 minutes ago    Exited (0) 27 seconds ago             quizzical_gauss
7ff70fc643cf   hello-world   "/hello"      46 minutes ago   Exited (0) 46 minutes ago             funny_bhaskara
6d3fca38f081   hello-world   "/hello"      47 minutes ago   Exited (0) 47 minutes ago             sweet_pascal
c3543080d146   hello-world   "/hello"      2 hours ago      Exited (0) 2 hours ago                suspicious_maxwell
[root@hdzs-zhuji ~]#

####可带参数
docker ps -a -n=1   1就是查看最近一个启动的
          -q        只显示编号
###删除容器
docker rm 容器id     不能删除正在运行的容器  如果强制删除就 rm -f
docker rm  $(docker ps -aq)  删除全部
###容器的启停
docker start 容器id   --启动
docker restart 容器id   --重启
docker stop 容器id        --停止
docker kill 容器id        --强制杀掉
3. 常用的其他命令

后台启动容器

#docker run -d 镜像名docker run -d centos
#这时使用docker -ps 发现centos停止了
###原因###
docker 容器使用后台运行  就必须要有一个前台进程  docker发现没有应用 就会自动停止

查看日志

###查询日志
docke logs -tf  xxxx           ---容器的id 显示全部
docke logs -tf --tail 10 xxxx  ---容器的id 10--就是显示最近10条

查看容器的进程

###容器进程查询
docker top xxxx   --容器的进程id

查看镜像的元数据

docker inspect xxx  --容器的进程id

进入当前正在运行的容器

第一种:
docker exec -it 容器id /bin/bash
第二种:
docker attach 容器id

##区别
docker exec      ---进入容器后开启一个新的终端  在里面操作
docker attach    ---进入容器正在执行的终端

从容器内拷贝文件到主机

docker cp 容器id:容器内路径  目的的主机路径

在这里插入图片描述

查看Docker容器的内存消耗

###查看容器的内存消耗
docker stats

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O     PIDS
f426762ca2bb   tomcat01   0.36%     126.2MiB / 1.695GiB   7.27%     60.1kB / 796kB   2.11MB / 0B   30
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O     PIDS
f426762ca2bb   tomcat01   0.06%     126.2MiB / 1.695GiB   7.27%     60.1kB / 796kB   2.11MB / 0B   30

三. Docker镜像的加载原理

核心: UnionFS(联合文件系统)

Docker镜像的下载都是一层一层的下载

UnionFS(联合文件系统)是一种分层 ,轻量级并且高性能的文件系统 它支持对文件系统的修改,作为一次提交来一层层的叠加 同时可以将不同目录挂载到同一个虚拟文件系统下

Union文件系统是Docker镜像的基础

镜像可以通过分层来进行继承 基于基础镜像(没有父镜像) 可以制作各种具体的应用镜像

特性: 一次同时加载多个文件系统 但从外面看起来 只能看到一个文件系统 联合加载会把各层文件系统叠加起来

这样最终的文件系统包含所有底层的文件和目录

特点:

Docker镜像都是只读的 当容器启动时 一个新的可写层就会被加到镜像的顶部

这一层就是我们通常说的容器层 容器之下就叫镜像层

在这里插入图片描述

四. 如何提交一个自己的镜像

1. Commit镜像
docker commit 提交容器成为一个新的副本
##命令和git原理类似
docker commit -m "提交的描述信息" -a "作者" 目标镜像名

测试

  1. 启动一个Tomcat
  2. 发现原始的Tomcat并不完整
  3. 配置webapps
  4. 将操作后的容器通过commit 提交为一个新的镜像 后面就可以直接使用新的镜像了
###具体操作###
[root@hdzs-zhuji ~]# docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED       STATUS       PORTS                                       NAMES
f426762ca2bb   b8e65a4d736d   "catalina.sh run"   3 hours ago   Up 3 hours   0.0.0.0:3355->8080/tcp, :::3355->8080/tcp   tomcat01
[root@hdzs-zhuji ~]# docker commit -a="wblx" -m="add webapps" f426762ca2bb tomcat-02-wblx:1.0
sha256:549a30ec0573f054f8fd9ac2dc3a4db961457c571188754e948bce8ad3af1594
[root@hdzs-zhuji ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
tomcat-02-wblx   1.0       549a30ec0573   15 seconds ago   685MB  ---明显比较大
tomcat           9.0       b8e65a4d736d   9 months ago     680MB
[root@hdzs-zhuji ~]#

五. 容器数据卷

1. 什么是容器数据卷

Docker的理念:将应用和环境打包成一个镜像

数据—如果都在容器里面 那么我们容器删除 数据就会丢失!!!

-----------如何解决数据的持久化问题 例如我用Docker装了Mysql 当Mysql容器被删了 那么数据也就丢失了

解决方案: 容器之间可以有一个数据共享技术 Docker容器产生的数据 同步到本地

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

在这里插入图片描述

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

2. 使用数据卷
方式一:
直接使用命令来挂载   -v  文件映射  -p 端口映射

docker run -it -v 主机目录:容器内目录
###开始
# 映射并启动进入centos
docker run -it -v /home/test/:/home/ centos /bin/bash
、
[root@hdzs-zhuji home]# ll
total 0
drwx------ 2 mysql mysql 83 Sep 19 19:56 mysql
drwxr-xr-x 2 root  root  20 Sep 23 17:52 test    --test自动创建
[root@hdzs-zhuji home]#
#######
[root@4f70f2355622 home]# vi 23.txt         --写个文件
[root@4f70f2355622 home]# ls
12.txt  23.txt
[root@4f70f2355622 home]#
####
-rw-r--r-- 1 root root 4 Sep 23 17:52 12.txt
-rw-r--r-- 1 root root 5 Sep 23 17:57 23.txt   --自动同步了!
[root@hdzs-zhuji test]#
#####
映射路径下双方同步 新增 删除 修改的操作
##查看容器信息
docker inspect 4f70f2355622
#########

 "Mounts": [                     ##挂载信息
            {
                "Type": "bind",
                "Source": "/home/test",    #主机内
                "Destination": "/home",    #容器
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

好处:容器内的文件可以在外面进行修改了

3. 具名和匿名挂载
##匿名挂载
###启动 -v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx

[root@hdzs-zhuji ~]# docker volume

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
##查看所有volume的情况
[root@hdzs-zhuji ~]# docker volume ls
DRIVER    VOLUME NAME
local     74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
local     e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
[root@hdzs-zhuji ~]#
##########
这就是匿名挂载  我们-v的时候  没有去写容器外的路径  只是写了容器内的
##具名挂载
##通过具名挂载  我们可以方便的找到我们的卷  --推荐使用
##我们通过  -v 卷名:容器路径  给它取了名字  这就是具名挂载
[root@hdzs-zhuji ~]# docker run -d -P --name nginx02 -v wblx:/ect/nginx nginx
b9a093d3d674fdea5f4daccdadd307961ae9c97fb7462df5e71204fba95f23ac
[root@hdzs-zhuji ~]# docker volume ls
DRIVER    VOLUME NAME
local     74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
local     e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
local     wblx   ----这就是我们刚加的
####查看卷的位置
docker volume inspect 卷名
[root@hdzs-zhuji ~]# docker volume inspect wblx
[
    {
        "CreatedAt": "2022-09-23T23:55:50+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/wblx/_data",  --具体的路径
        "Name": "wblx",
        "Options": null,
        "Scope": "local"
    }
]

注意:

我们发现 docker容器的卷 在没有指定目录的情况下 都是在 /var/lib/docker/volumes/xxxx/_dada 这个目录下

[root@hdzs-zhuji volumes]# cd /var/lib/docker/volumes/
[root@hdzs-zhuji volumes]# ll
total 24
drwx-----x 3 root root     19 Sep 23 23:44 74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
brw------- 1 root root 253, 3 Sep 22 15:58 backingFsBlockDev
drwx-----x 3 root root     19 Sep 23 23:47 e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
-rw------- 1 root root  32768 Sep 23 23:55 metadata.db
drwx-----x 3 root root     19 Sep 23 23:55 wblx
[root@hdzs-zhuji volumes]#

具名挂载和匿名挂载的区别

###具名挂载###
-v  名字:/容器内路径/
###匿名挂载###
-v /容器内路径/
###指定挂载###
-v /外部路径/:/容器内路径/

扩展:

###权限的设置####
:ro   ---只能读取  带上了这个 那么文件就只能在外部(宿主机)上进行修改了 里面没权限了
:rw   ---默认  可读可写
docker run -d -P --name nginx02 -v wblx:/ect/nginx:ro nginx
docker run -d -P --name nginx02 -v wblx:/ect/nginx:rw nginx
4. Dockerfile
1. 什么是Dockerfile

​ Dockerfile 就是用来构建Docker 镜像的构建文件 命令脚本

​ 脚本的讲解

  1. 左边的指令都是大写的

  2. VOLUME [“volume-test01”,“volume-test02”] 这其实就是一个匿名挂载

    当启动后容器内会自动创建这两个文件夹

    当热我们的宿主机也会生成一个映射文件

    可以通过 docker inspect 容器id 去查看

###编写一个Docker 脚本
vim Dockerfile
####内容######
FROM centos

VOLUME ["volume-test01","volume-test02"]       

CMD echo "=======end======"
CMD /bin/bash
###执行脚本###
[root@hdzs-zhuji docker-dockerfile]# docker build -f Dockerfile -t ddzs/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume-test01","volume-test02"]
 ---> Running in 31832eba621a
Removing intermediate container 31832eba621a
 ---> cf1197e9b44a
Step 3/4 : CMD echo "=======end======"
 ---> Running in 1b70a9b25afe
Removing intermediate container 1b70a9b25afe
 ---> 981654c3cbd5
Step 4/4 : CMD /bin/bash
 ---> Running in 73b1f5ed27f6
Removing intermediate container 73b1f5ed27f6
 ---> 9c3ef7a2b422
Successfully built 9c3ef7a2b422
Successfully tagged ddzs/centos:1.0
[root@hdzs-zhuji docker-dockerfile]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
ddzs/centos      1.0       9c3ef7a2b422   22 seconds ago   231MB
tomcat-02-wblx   1.0       549a30ec0573   23 hours ago     685MB
nginx            latest    605c77e624dd   8 months ago     141MB
mysql            5.7       c20987f18b13   9 months ago     448MB
centos           latest    5d0da3dc9764   12 months ago    231MB
[root@hdzs-zhuji docker-dockerfile]#

###当我们进入就会发现  容器以及建了新的文件夹
[root@hdzs-zhuji docker-dockerfile]# docker run -it 9c3ef7a2b422  /bin/bash
[root@6967974fbf83 /]# ls -al
total 0
drwxr-xr-x   1 root root  48 Sep 23 17:01 .
drwxr-xr-x   1 root root  48 Sep 23 17:01 ..
-rwxr-xr-x   1 root root   0 Sep 23 17:01 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root 360 Sep 23 17:01 dev
drwxr-xr-x   1 root root  66 Sep 23 17:01 etc
drwxr-xr-x   2 root root   6 Nov  3  2020 home
lrwxrwxrwx   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x   2 root root   6 Nov  3  2020 media
drwxr-xr-x   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x 114 root root   0 Sep 23 17:01 proc
dr-xr-x---   2 root root 162 Sep 15  2021 root
drwxr-xr-x  11 root root 163 Sep 15  2021 run
lrwxrwxrwx   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x  13 root root   0 Sep 23 17:01 sys
drwxrwxrwt   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x  12 root root 144 Sep 15  2021 usr
drwxr-xr-x  20 root root 262 Sep 15  2021 var
drwxr-xr-x   2 root root   6 Sep 23 17:01 volume-test01   ###通过脚本进行
drwxr-xr-x   2 root root   6 Sep 23 17:01 volume-test02   ###

####查看挂载的详情####
#找到了我们新建的volume-test01 volume-test02 在宿机的映射路径#
docker inspect 6967974fbf83  
 
 "Mounts": [
            {
                "Type": "volume",
                "Name": "e055a495e81e2a32a626acf6d492263e6d3dfbcb0c3b9dc1ef7154e5b1431a22",
                "Source": "/var/lib/docker/volumes/e055a495e81e2a32a626acf6d492263e6d3dfbcb0c3b9dc1ef7154e5b1431a22/_data",
                "Destination": "volume-test01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "75e879033df77be549d7c79268e7128f635a8e34f00638a8fa91a8b3de4807e0",
                "Source": "/var/lib/docker/volumes/75e879033df77be549d7c79268e7128f635a8e34f00638a8fa91a8b3de4807e0/_data",
                "Destination": "volume-test02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

5. 数据卷容器

在这里插入图片描述

#####测试####
##先启动一个父容器## 9c3ef7a2b422 镜像id
docker run -it --name docker01 9c3ef7a2b422
##启动一个容器来继承这个父容器##
##--volumes-from 父容器名称##
docker run -it --name docker02 --volumes-from docker01 9c3ef7a2b422
##我们发现新启动的镜像也有了这个volume-test01  volume-test02文件##
[root@hdzs-zhuji docker-dockerfile]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
3557deac2ef7   9c3ef7a2b422   "/bin/sh -c /bin/bash"   About a minute ago   Up About a minute             docker02
1a52196089b3   9c3ef7a2b422   "/bin/sh -c /bin/bash"   6 minutes ago        Up 6 minutes                  docker01
[root@hdzs-zhuji docker-dockerfile]# docker attach 3557deac2ef7
[root@3557deac2ef7 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume-test01  volume-test02
##测试##
#进入父容器  docker01 并创建了一个 test-wblx#
##########################################
docker01  这个我们就称之为 数据卷容器!!!!!!!
##########################################
[root@hdzs-zhuji docker-dockerfile]# docker attach 1a52196089b3
[root@1a52196089b3 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume-test01  volume-test02
[root@1a52196089b3 /]# cd volume-test01/
[root@1a52196089b3 volume-test01]# mkdi
mkdict  mkdir
[root@1a52196089b3 volume-test01]# mkdir test-wblx
[root@1a52196089b3 volume-test01]# ls
test-wblx
[root@1a52196089b3 volume-test01]#
##进入子容器docker02##
#数据自动同步给了 docker02 #  #互通共享#
[root@hdzs-zhuji docker-dockerfile]# docker attach 3557deac2ef7
[root@3557deac2ef7 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume-test01  volume-test02
[root@3557deac2ef7 /]# cd volume-test01/
[root@3557deac2ef7 volume-test01]# ls
test-wblx
[root@3557deac2ef7 volume-test01]#
#这个用的是刚才脚本构建的一个centos#
#默认是带匿名挂载的#  我们在本地进行新增  发现也是同步了!!
[root@hdzs-zhuji docker-dockerfile]# cd /var/lib/docker/volumes/333445d5797aa6721f71aaea01fc5e03683d61242bf58b1dd36d3fb038626f03/_data
[root@hdzs-zhuji _data]# ll
total 0
[root@hdzs-zhuji _data]# cd /var/lib/docker/volumes/855777f785adb8d2b1c0c5ab5e772ee5b82248ba90d53adfc67c29fb0b13ccc0/_data
[root@hdzs-zhuji _data]# ll
total 0
drwxr-xr-x 2 root root 6 Sep 24 01:32 test-wblx
[root@hdzs-zhuji _data]# mkdir 0111
[root@hdzs-zhuji _data]# ll
total 0
drwxr-xr-x 2 root root 6 Sep 24 02:00 0111
drwxr-xr-x 2 root root 6 Sep 24 01:32 test-wblx
[root@hdzs-zhuji _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
3557deac2ef7   9c3ef7a2b422   "/bin/sh -c /bin/bash"   35 minutes ago   Up 35 minutes             docker02
1a52196089b3   9c3ef7a2b422   "/bin/sh -c /bin/bash"   40 minutes ago   Up 40 minutes             docker01
[root@hdzs-zhuji _data]# docker attach 3557deac2ef7
[root@3557deac2ef7 volume-test01]# ls
0111  test-wblx

注意:

数据卷的共享是一个拷贝的概念 即我们删除了任意一个容器 剩下的共享容器内的文件不会被删除

同理如果有 -v 映射到本地 那么跟本地也是互通的

案例:实现Mysql的数据共享
在这里插入图片描述

六. DockerFile详解

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

1. 构建步骤
  1. 编写一个dockerfile 文件
  2. dockerfile build构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像 (DockerHub 阿里云镜像仓库)

很多官方镜像包都是基础包 没啥功能

2. 编写Docker基础知识
  1. 每个保留关键字(指令)都必须是大写字母

  2. 从上到下顺序执行

  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层 并提交

在这里插入图片描述

3. Dockerfile指令说明
FROM              #基础镜像   一切从这里开始构建
MAINTAINER        #镜像是谁写的  一般都是姓名+邮箱
RUN               #镜像构建的时候需要运行的命令
ADD               #步骤  例如添加tomcat镜像  添加内容
WORKDIR           #镜像的工作目录
VOLUME            #挂载的目录
EXPOST            #保留端口配置
CMD               #指定这个容器启动时需要执行的命令  只有最后一个会生效 可被替代
ENTRYPOINT        #指定这个容器启动时需要执行的命令  可以追加
ONBUILD           #当构建一个被继承 DockerFile 这个时候就会执行ONBUILD 指令
COPY              #类似ADD 将文件拷贝镜像中
ENV               #构建的时候设置环境变量  例如 mysql密码

Docker Hub 中99% 镜像都是从这个基础镜像过来的 FROM scratch 然后配置需要的软件和配置来进行构建

4. 查看构建历史
docker history xxx镜像id  

在这里插入图片描述

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

例如我在脚本上编写  CMD ["ls","-a"]
那么当我进入容器的时候就会正常执行这个
如果在启动命令上加了 -l
docker run xxx -l   理想情况是 docker run xxx -ls-al  但是这个-l 就会替换"ls","-a"
我们可以使用
ENTRYPOINT
ENTRYPOINT ["ls","-a"]
如果在启动命令上加了 -l
docker run xxx -l   那么就是 == docker run xxx -ls-al    追加概念

七. 发布自己的镜像

1. 通过DockerHub
  1. 先登录

    #####     docker login -u xxx用户   #####
    [root@hdzs-zhuji test]# docker login -u hdzs
    Password:
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    [root@hdzs-zhuji test]#
    
  2. 提交

    ##注意镜像的名字  需要  作者名称/镜像名
    docker tag  id  xxx:xxx  这种方式修改
    [root@hdzs-zhuji .docker]# docker images
    REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
    hdzs/wblxtomcat   1.0       3bbc46dbce36   3 hours ago     1.04GB
    
    
    [root@hdzs-zhuji .docker]# docker push hdzs/wblxtomcat:1.0
    The push refers to repository [docker.io/hdzs/wblxtomcat]
    a8c3bae70234: Pushing [=>                                                 ]  1.337MB/42.22MB
    e733ee274ce5: Pushing [>                                                  ]  1.102MB/67.05MB
    c2300b2f51a5: Pushing [>                                                  ]  524.8kB/289.2MB
    57aa96055b91: Pushing [=>                                                 ]  585.2kB/27.19MB
    92ee41e6a5dc: Pushing [==================================================>]  20.48kB
    07c3e38c92d2: Waiting
    aa93e9bd4166: Waiting
    72f4cf7fe69f: Waiting
    7838270baa49: Waiting
    74ddd0ec08fa: Waiting
    
    
2. 通过阿里云
  1. 登录阿里云

  2. 找到容器镜像服务

  3. 创建命名空间

  4. 创建容器镜像

    https://cr.console.aliyun.com/cn-beijing/instance/repositories

    https://cr.console.aliyun.com/repository/cn-beijing/hedong-docker/hedong-hdzs/details

在这里插入图片描述

八. Docker网络

1. Linux外部为什么可以联通容器网络

原理:

  1. 我们每启动一个docker容器,docker就会给docker容器分配一个ip 我们只要安装了docker,就会有一个网卡docker0

    桥接模式 使用的技术是 evth-pair 技术

    我们发现 容器带来的网卡 内外是成对出现的 —这就是evth-pair 技术.

    evth-pair 就是一对虚拟设备接口 他们都是成对出现的 一端连着协议 一端彼此相连

    正因为有这个特性 那么我们就用 evth-pair 充当一个桥梁 连接各种虚拟网络设备

保障了我们内部与外部的通信 当然各个容器之间也是互通的

在这里插入图片描述
在这里插入图片描述

  1. Docker中所有的网络接口都是虚拟的 虚拟的转发效率高(内网传递文件)
  2. 只要容器删除 对应的网桥 对就没了
2. 容器互联 --link

当我们知道了 容器之间其实是可以互联的 但是ip确是每次重启随机分配的

那么当我们两个容器需要稳定连接该怎么办

–link 解决

在这里插入图片描述

–link本质上就是 我们在hosts里面增加了一个 172.18.0.3(随机分配ip) 的映射

但是 这个已经不使用了!

现在都采用 自定义网络的方式

3. 自定义网络
  1. 查看所有的docker网络

    # docker network ls#
    [root@hdzs-zhuji .docker]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    e63c61792a98   bridge    bridge    local
    189f8ad6551a   host      host      local
    f9370eb1acef   none      null      local
    [root@hdzs-zhuji .docker]#
    
  2. 网络模式

    bridge ---- 桥接 docker 搭桥

​ none — 不配置网络

​ host ---- 和宿主机共享

​ container ---- 容器网络联通 (用得少)

  1. 注意

    #在我们之前启动命令  其实--net bridge 就是一个默认值 这个就是我们的docker0
    docker run -d -P --name tomcat01 --net bridge tomcat
    
    #docker0 特点 默认:域名不能访问  --link 可以打通  麻烦!
    
    ####开始自定义#####
    ##
    --driver bridge  桥接模式
    --subnet 192.168.0.0/16  子网   192.168.0.2 - 192.168.255.255
    --gateway 192.168.0.1   网关
       mynet     叫啥名
    ##
    [root@hdzs-zhuji .docker]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    a1686e9689a0536e1d3c9b966fe3887480be222c9df05b0dc9c0f723e0c2e737
    [root@hdzs-zhuji .docker]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    e63c61792a98   bridge    bridge    local
    189f8ad6551a   host      host      local
    a1686e9689a0   mynet     bridge    local   ---成功
    f9370eb1acef   none      null      local
    [root@hdzs-zhuji .docker]#
    

    查看配置的网络详情 – docker network inspect mynet

在这里插入图片描述

开始测试

##将服务搭建到自己配置的网络上来##
##
--net mynet  指定我创建的网络
##
docker run -d  -P --name centos-net-01 --net mynet centos
docker run -d  -P --name centos-net-02 --net mynet centos

###查看网络详情###
docker network inspect mynet

在这里插入图片描述

[root@hdzs-zhuji ~]# docker run -it  -P --name centos-net-01 --net mynet centos
[root@2b6fc28a88b3 /]# [root@hdzs-zhuji ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
2b6fc28a88b3   centos    "/bin/bash"   11 seconds ago   Up 10 seconds             centos-net-01

[root@hdzs-zhuji ~]# docker run -it  -P --name centos-net-02 --net mynet centos
[root@2f65df2e23d7 /]# [root@hdzs-zhuji ~]# ll
total 0
[root@hdzs-zhuji ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
2f65df2e23d7   centos    "/bin/bash"   20 seconds ago   Up 19 seconds             centos-net-02
2b6fc28a88b3   centos    "/bin/bash"   37 seconds ago   Up 36 seconds             centos-net-01
[root@hdzs-zhuji ~]# docker exec -it 2b6fc28a88b3 /bin/bash
######我们发现容器1 可以ping 通容器2 的随机ip 了########
[root@2b6fc28a88b3 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.186 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.064 ms
^C
######同时我们发现容器1 可以ping 通容器2 容器名  没用 --link ########
[root@2b6fc28a88b3 /]# ping centos-net-02
PING centos-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.076 ms
^C
--- centos-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2027ms
rtt min/avg/max/mdev = 0.074/0.080/0.090/0.007 ms
[root@2b6fc28a88b3 /]#

好处: 例如

redis 设置192.161.0.0

mysql 集群搭建等 设置192.162.0.0 来保证集群网络互通

4. 网络联通

我们知道例如 192.161.0.0 内的网络是互通的

但是192.161.0.0和192.162.0.0 的网络就可能没法直接联通

这时候我们就需要打通网络 ----连接一个容器到网络

在这里插入图片描述

####将需要打通的容器  切换到自定义网络组
docker network connect mynet centos-xxx-01
####这就是  一个容器两个ip 地址####
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值