注:由于文章是提前写好markdown格式,直接导入的,部分图片不能正常显示。
下面提供完整版的PDF个文档:提取码:1111

文章目录

  • Docker概述
    • docker的优点
    • docker的历史
    • docker能干嘛
  • Docker的安装
    • docker的组成
    • 安装docker
    • 阿里云镜像加速
    • run的运行流程
    • 底层原理
    • docker为什么比虚拟机快?
    • Namespace名称空间
    • Cgroup 控制组
      • 内存限额
      • CPU限制
      • 容器的Block IO
  • Docker常用命令
    • docker命令逻辑图
    • 帮助命令
    • 镜像命令
    • 容器命令
    • 其他常用命令
    • docker命令逻图
  • 实践练习
    • 1.部署Nginx服务
    • 2.部署Tomcat
    • 3.部署ES+Kibana
    • 4.可视化工具portainer
  • Docker镜像理论与原理
    • 镜像是什么?
    • UnionFS 联合文件系统概念
    • Docker镜像加载原理
    • 分层概念
    • commit镜像
  • Docker 数据存储
    • 指定路径挂载(Bind mount)
      • 实践-MySQL数据同步
      • 挂载权限
    • 具名和匿名挂载(Docker Manager Volume)
    • 小总结
    • Dockerfile 方式挂载卷
    • 容器之间共享卷
  • Dockerfile
    • 初识dockerfile
    • dockerfile 构建过程
    • dockerfile的指令
    • 实践1 构建自己的centos版本
    • CMD和ENTRYPOINT区别
    • 实践2 构建tomcat
  • Docker 仓库
    • Registry私有仓库
    • Harbor
    • Docker Hub
    • 阿里云仓库
  • Docker 网络
    • 理解Docker0
    • 容器互联 --link
    • 自定义网络
    • 容器连通性

Docker概述

docker官网:https://www.docker.com/

docker官方文档:https://docs.docker.com/

docker的优点

  • 隔离性:docker每个容器都是相互隔离的,当一个容器出现问题,并不会影响到其他容器。
  • 轻量级:docker基于半解耦 ,有namespace(名称空间)六项隔离。并不是完全型解耦。
  • 部署方便:使用docker部署服务 直接是秒级别的。
  • 快速回滚:docker支持回滚版本。

docker的历史

2010年 几个搞TI的年轻人,在美国成立了一家公司 dotCloud

做一些有关容器技术,他们将自己的技术(容器技术)命名docker

docker 刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去了。

2013年,docker开放源代码

越来越多的人发现了docker的优点!所以docker就火了,之后docker没有月都会出一个新的版本!

2014年4月,docker发布1.0版本

docker能干嘛

传统虚拟机方式!

虚拟机技术缺点:

1、资源占用十分多,因为传统虚拟机技术是完全虚拟化。

2、冗余步骤多

3、启动很慢!

容器技术方式

容器化技术不是模拟一个完整的操作系统,容器都是运行在宿主机的内核,每个容器里面的数据都是隔离的。

比较docker和虚拟机技术不同

  • 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,探后在这个系统上安装和运行软件。
  • docker容器内应用直接运行在宿主机的内核,容器是没有自己内核的,也没有虚拟硬件,所以轻便了。
  • 每个容器间都是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。

应用更快速的交付和部署

传统虚拟机:一堆文档,安装程序

docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

服务器A资源不足 ,可以将项目打包成一个镜像,然后放到服务器B上去。

更简单的运维

在容器化之后,我们开发,测试环境都是高度一致的。

更高效的计算资源利用

docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被压榨到极致。

Docker的安装

docker的组成

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器,通过镜像可以创建多个容器(最终服务和项目运行在容器里面)

容器(container):

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

可以将容器看做是一个简易的Linux操作系统。

仓库(repository):

仓库就是存放镜像的地方!

仓库分为私有仓库和公有仓库!

安装docker

环境配置

# 系统内核是3.10 以上的
[root@shenming ~]# uname  -r
3.10.0-1160.el7.x86_64
# 系统版本
[root@shenming ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

# 1、卸载的docker版本
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2、安装必要工具
yum install -y yum-utils device-mapper-persistent-data lvm2# 3、设置镜像仓库
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo  #默认是官方的 十分慢yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #推荐使用阿里云的# 更新yum软件索引
yum makecache fast# 确认docker的yum源
ls /etc/yum.repos.d/ | grep docker# 4、安装docker
# docker-ce 社区版  docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io  #默认安装最新版# 选择安装指定版本命令如下:
yum list docker-ce --showduplicates | sort -r# 5、启动docker
systemctl start docker
systemctl enable docker# 6、使用docker version是否安装成功

拓展:卸载docker

# 1、卸载docker
yum remove docker-ce docker-ce-cli containerd.io# 2、删除资源
rm -rf /var/lib/docker   #docker的默认工作路径
rm -rf /var/lib/containerd

阿里云镜像加速

1、登入阿里云找到 容器镜像服务

2、复制阿里云加速地址cp到操作系统上

3、配置镜像加速器

mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://cl2lpj44.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

run的运行流程

底层原理

docker是怎么工作的?

docker 是一个 client-server 结构的系统 , docker的守护进程运行在主机上。 通过socket从客户端访问。

docker server 接收到这个 docker-client的指令,就会运行这个命令!

docker为什么比虚拟机快?


1、docker有着比虚拟机更少的抽象层。

2、Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkhADywI-1626612848479)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210604205847510.png)]

Namespace名称空间

Docker 通过namespace六项隔离,实现了容器与宿主机之间的隔离。

/proc /sys : 虚拟文件系统。 伪目录文件 — > 运行在内存中的文件

# 1、查看namespace六项隔离
[root@docker-01 ~]# cd /proc/1090/ns/

namespace 隔离内容
MNT 挂载点、文件系统
IPC 共享内存、消息队列
NET 网络设备、端口等。
PID 进程编号
USER 用户和用户组
UTS 主机名、域名

Cgroup 控制组

Docker通过cgroup限制容器对宿主机资源的使用。

# 1、查看cgroup路径
[root@docker-01 cpu]# pwd
/sys/fs/cgroup/cpu
[root@docker-01 cpu]# cat tasks
# tasks这个文件内的数字,记录的是进程编号。PID 权重比

cgroup四大功能

  • 资源限制:cgroup可以对进程组使用的资源总额进行限制。
  • 优先级分配:通过分配的cpu时间片数量以及硬盘IO带宽大小,实际上相当于控制了进程运行的优先级别。
  • 资源统计:cgroup可以统计系统资源使用量,比如cpu使用时间,内存使用量等,用于按量计费。同时,还支持挂起动能,也就是说通过cgroup把所有资源限制起来,对资源都不能使用,注意着并不是说我们的程序不能使用了,只是不能使用资源,处于等待状态
  • 进程控制:可以对进程组执行挂起、恢复等操作。

内存限额

容器内存包含两个部分:物理内存和swap

-m 或者 --memory: 限制容器内存使用多少

–memory-swap: 限制容器swap的使用多少

举例:

# 运行一个容器,并且限制该容器最多使用200M内存和100swap
[root@docker-01 ~]# docker run -itd --name container1 --memory 200MB --memory-swap 300MB centos:7
dc1202c8f933d4c17a8f304337f66fcfd753772620982a31a95a1bac339470c2
# swap容量要大于memory 不然限制不成功
#查看对容器的内存限制
[root@docker-01 ~]# cd /sys/fs/cgroup/memory/docker/dc1202c8f933d4c17a8f304337f66fcfd753772620982a31a95a1bac339470c2/
[root@docker-01 dc1202c8f933d4c17a8f304337f66fcfd753772620982a31a95a1bac339470c2]# cat memory.limit_in_bytes
209715200
# 209715200/1024/1024 = 200M#查看swap限制
[root@docker-01 dc1202c8f933d4c17a8f304337f66fcfd753772620982a31a95a1bac339470c2]# cat memory.memsw.limit_in_bytes
314572800

对比一个没有限制的容器,我们会发现,如果运行容器之后不限制内存的话,以为着没有限制。

CPU限制

通过-c或者–cpu-shares设置容器使用cpu的权重。如果不设置默认为1024.

举例:

[root@docker-01 ~]# docker run -itd --name container2 -c 512 centos:7
31c381d99ee6e4ad1fee9be9790e232c5660a8c8b07245b4c4e59d38e04cab79# 查看cpu权重比
[root@docker-01 31c381d99ee6e4ad1fee9be9790e232c5660a8c8b07245b4c4e59d38e04cab79]# pwd
/sys/fs/cgroup/cpu/docker/31c381d99ee6e4ad1fee9be9790e232c5660a8c8b07245b4c4e59d38e04cab79
[root@docker-01 31c381d99ee6e4ad1fee9be9790e232c5660a8c8b07245b4c4e59d38e04cab79]# cat cpu.shares
512

容器的Block IO

磁盘的读写。

docker中可以通过设置权重,限制bps和iops的方式控制容器读写磁盘的IO

bps:每秒读写的数据量

iops:每秒IO的次数

默认情况下,所有容器都能够平等的读写磁盘,也可以通过–blkio-weight参数改变容器的blockIO 的优先级。

–device-read-bps: 限制读取某个设备的bps。

–device-write-bps: 限制写入某个设备的bps。

–device-read-iops: 限制读取某个设备的iops。

–device-write-iops: 限制写入某个设备的iops。

举例:

# /限制testA这个容器,写入/dev/sda这块磁盘的bps为30MB.
[root@docker-01 ~]# docker run -itd --name testA --device-write-bps /dev/sda:30MB centos:7

验证

# 从/dev/zero输入,然后输出到test.out文件中,每次大小为1M,总共800次,oflag=direct 用来指定directIO方式写文件,这样才会使--devicewrite-bps生效。[root@docker-01 ~]# docker exec -it testA /bin/bash
[root@5f13ea4a15a9 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 26.6301 s, 31.5 MB/sreal   0m26.639s
user    0m0.001s
sys 0m1.470s#由于限制了写入/dev/sda设备bps 所以会比没有限制的慢些。
# 创建testB没有限制测试速度
[root@docker-01 ~]# docker run -itd --name testB centos:7
3599ec7041c391bd22f5e8be96b818c32d13e1bf4074abdc3e562f0439a90d18
[root@docker-01 ~]# docker exec -it testB /bin/bash
[root@3599ec7041c3 /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
800+0 records in
800+0 records out
838860800 bytes (839 MB) copied, 1.4597 s, 575 MB/sreal 0m1.462s
user    0m0.000s
sys 0m0.819s
#很明显要比testA快了不少

Docker常用命令

docker命令逻辑图

帮助命令

docker官方命令参考文档:https://docs.docker.com/engine/reference/commandline/cli/

# 1、help
[root@docker-01 ~]# docker --help
[root@docker-01 ~]# docker 命令 --help  #万能命令# 2、docker info
[root@docker-01 ~]# docker info        # 显示系docker的系统信息,包括镜像和容器的数量# 3、docker version
[root@docker-01 ~]# docker version     # 显示docker版本信息

镜像命令

docker images 查看本地所有镜像

[root@docker-01 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       7         8652b9f0cb4c   6 months ago   204MB# 解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的id
CREATED     镜像的创建时间
SIZE        镜像大小# 可选项-a, --all            #列出所有镜像-q, --quiet          #只显示镜像id

docker search 搜索镜像

[root@docker-01 ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10957     [OK]
mariadb                           MariaDB Server is a high performing open sou…   4142      [OK]       # 可选项
-f 针对条件进行过滤
docker search -f=STARS=3000 mysql #过滤STARS大于3000的mysql镜像

docker pull 下载镜像

# docker pull 镜像名:[tag]
[root@docker-01 ~]# docker pull mysql
Using default tag: latest     #如果不写tag 默认下载最新的
latest: Pulling from library/mysql
69692152171a: Pull complete   #分层下载 docker image的核心 联合文件系统
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969  #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址# docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

docker rmi 删除镜像

[root@docker-01 ~]# docker rmi -f 镜像id                  #删除指定镜像
[root@docker-01 ~]# docker rmi -f 镜像id 容器id 容器id     #删除多个镜像
[root@docker-01 ~]# docker images -qa |xargs docker rmi -f #删除所有镜像
[root@docker-01 ~]# docker rmi -f $(docker images -aq)     #删除所有镜像

容器命令

docker run 运行一个容器-

docker run [可选参数] image#常用参数说明
-- name 容器名字
-d 后台运行
-it 使用交互运行 直接进入容器
-p 指定容器端口-p ip:主机端口:容器端口-p 主机端口:容器端口-p 容器端口
-P  随机指定端口# 运行并进入容器
[root@docker-01 ~]# docker run -it centos:7 # 后台运行一个容器
[root@docker-01 ~]# docker run -itd --name test1 -p80:8080 centos:7
6f1a3d767eee54c7105787cb991d18f2304b99e670fd6890db5c106bfbf0443a
[root@docker-01 ~]# docker ps   # 可以看到宿主机80端口映射到容器的8080端口了
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS                  NAMES
6f1a3d767eee   centos:7   "/bin/bash"   5 seconds ago   Up 4 seconds   0.0.0.0:80->8080/tcp   test1

docker ps 列出运行中的容器

docker ps [可选参数]可选参数:-a, --all        #列出所有容器          -n, --last  x    #列出最近创建的x个容器-q               #只显示容器id# 列出最近创建的一个容器
[root@docker-01 ~]# docker ps -n=1

docker rm 删除容器

docker rm [可选参数] 容器1 容器2可选参数:
-f    #强制删除# 删除所有容器
[root@docker-01 ~]# docker ps -aq |xargs  docker rm -f
[root@docker-01 ~]# docker rm -f $(docker ps -aq)

退出容器

exit 直接退出容器并停止

Ctrl+P+Q 退出但不停止容器

启动、停止容器操作

docker start 容器id    #启动容器
docker restart 容器id  #重启容器
docker stop 容器id     #停止容器
docker kill 容器id     #强制停止当前容器

其他常用命令

后台启动容器(常见的坑)

[root@docker-01 ~]# docker run -d centos:7 # 问题docker ps 发现 容器并没有运行#常见的坑:docker 容器使用了后台运行 ,就必须要有一个前台进程,docker发现没有要运行的应用就自动停止了。
#容器启动后,发现自己没有提供服务,就会停止,就是没有程序了。

docker logs 查看日志

docker logs [可选参数] 容器可选参数:-f, --follow         #实时监控日志-t, --timestamps     #显示时间戳-n,--tail number    #指定要显示日志的条数[root@docker-01 ~]# docker logs -f -t -n 3 57ebaf7b95ec  #这里使用nginx镜像创建的容器会有日志  使用centos镜像创建的容器默认没有日志
2021-06-05T15:36:33.144253026Z 2021/06/05 15:36:33 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021-06-05T15:36:33.144255099Z 2021/06/05 15:36:33 [notice] 1#1: start worker processes
2021-06-05T15:36:33.144257159Z 2021/06/05 15:36:33 [notice] 1#1: start worker process 31#写一段脚本 来让centos镜像容器生成日志
[root@docker-01 ~]# docker run -d  --name=testlog centos:7 /bin/bash  -c "while true;do echo qinziteng;sleep 1;done"
dca6b9c87a53ceeca79f43265613c582a5533d7dc0b3b1dfdc21632f6ef09283
[root@docker-01 ~]# docker logs -ft -n 3 testlog
2021-06-05T15:56:22.471945023Z qinziteng
2021-06-05T15:56:23.473931027Z qinziteng
2021-06-05T15:56:24.477220305Z qinziteng

docker top 查看容器中的进程

dcf485f94691   centos:7   "/bin/bash"              About an hour ago   Up About an hour             t1
[root@docker-01 ~]# docker top 57ebaf7b95ec
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4492                4475                0                   Jun05               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 4541                4492                0                   Jun05               ?                   00:00:00            nginx: worker process# UUID 用户id
# PID进程id
# PPID是父进程

docker inspect 查看容器元数据

docker inspect 容器id
[root@docker-01 ~]# docker inspect 57ebaf7b95ec
[{"Id": "57ebaf7b95ec94ca838f8a9bc8e82c9fa4b3f896c23c99ca4a7d13834404ffa5","Created": "2021-06-05T15:36:32.70520947Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 4492,"ExitCode": 0,"Error": "","StartedAt": "2021-06-05T15:36:33.110346159Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee","ResolvConfPath": "/var/lib/docker/containers/57ebaf7b95ec94ca838f8a9bc8e82c9fa4b3f896c23c99ca4a7d13834404ffa5/resolv.conf","HostnamePath": "/var/lib/docker/containers/57ebaf7b95ec94ca838f8a9bc8e82c9fa4b3f896c23c99ca4a7d13834404ffa5/hostname",..................省略部分

**docker exec 、docker attach **进入容器

# 命令1:docker exec
docker exec [可选项] 容器id bashshell可选项:
-i :即使没有附加也保持STDIN 打开 (可交互)
-d :分离模式: 在后台运行
-t :分配一个伪终端[root@docker-01 ~]# docker exec  -it 89b5de5b5ec5 /bin/bash
[root@89b5de5b5ec5 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 20:58 pts/0    00:00:00 /bin/bash
root         47      0  1 21:10 pts/1    00:00:00 /bin/bash
root         61     47  0 21:10 pts/1    00:00:00 ps -ef
# 命令2:docker attach
docker attach [可选项] 容器id[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS              PORTS     NAMES
89b5de5b5ec5   centos:7   "/bin/bash"   20 minutes ago   Up About a minute             test1
[root@docker-01 ~]# docker attach 89b5de5b5ec5
[root@89b5de5b5ec5 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 21:17 pts/0    00:00:00 /bin/bash
root         14      1  0 21:19 pts/0    00:00:00 ps -ef# attach使用exit退出容器时容器也会关闭  可以使用Ctrl+P+Q退出容器

docker exec 、docker attach区别

docker exec: 进入容器后分配一个新的终端(常用)

docker attach: 进入容器后不会启用新的终端,可以多人同时连接共享屏幕

docker cp 用来容器与宿主机copy文件

docker cp [可选项] 容器id:文件路径  宿主机目标路径
docker cp [可选项] 宿主机文件路径   目标容器路径可选项
-L :保持源目标中的链接#演示容器向宿主机copy文件
[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
3c365d251d2c   centos:7   "/bin/bash"   17 minutes ago   Up 17 minutes             test2#进入容器 touch一个文件
[root@docker-01 ~]# docker attach 3c365d251d2c
[root@3c365d251d2c /]# touch qinziteng.txt#退出容器 将在容器上创建的文件copy到宿主机
[root@docker-01 ~]# docker cp 3c365d251d2c:/qinziteng.txt .
[root@docker-01 ~]# ls
anaconda-ks.cfg  qinziteng.txt
#演示宿主机向容器copy文件
[root@docker-01 ~]# touch  shenming.txt
[root@docker-01 ~]# docker cp shenming.txt test1:/home/
[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
3c365d251d2c   centos:7   "/bin/bash"   22 minutes ago   Up 22 minutes             test2
[root@docker-01 ~]# docker cp shenming.txt 3c365d251d2c:/home/
[root@docker-01 ~]# docker attach 3c365d251d2c
[root@3c365d251d2c /]# ls /home/
shenming.txt

docker命令逻图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Exx0RVLh-1626612848481)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210611215906753.png)]

实践练习

思路:
# 1、首先搜索是否有镜像 search(建议去Docker Hub搜索, Docker Hub可以查看到可以用的版本号和帮助文档 如下图:)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nL1Pncwp-1626612848483)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612135948245.png)]

# 2、下载镜像  pull
# 3、运行测试  run

1.部署Nginx服务

# 1、部署nginx并验证访问[root@docker-01 ~]# docker pull nginx:1.21
[root@docker-01 ~]# docker run -d --name nginx-1 -p333:80 nginx:1.21
7a2611a833945d989759b8257ec9f6e1bba56ec4ac3aa141d6b9c245a8e0b3e6
[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                 NAMES
7a2611a83394   nginx:1.21   "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:333->80/tcp   nginx-1
[root@docker-01 ~]# curl localhost:333
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;............ 省略

docker run 选项说明

-d 后台运行
–name 容器命名
-p333:80 端口映射(将宿主机333端口映射到容器80端口)

# 2、进入nginx1容器修改web页面内容[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                 NAMES
7a2611a83394   nginx:1.21   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:333->80/tcp   nginx-1
[root@docker-01 ~]# docker exec 7a2611a83394  -it /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "-it": executable file not found in $PATH: unknown
[root@docker-01 ~]# docker exec -it  7a2611a83394  /bin/bash
root@7a2611a83394:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@7a2611a83394:/# ls /usr/share/nginx/
html
root@7a2611a83394:/# echo "<h1>qinziteng</h1>" > /usr/share/nginx/html/index.html[root@docker-01 ~]# curl localhost:333
<h1>qinziteng</h1>

思考:这样修改nginx页面都要进入容器内修改 十分的不便 后期可以使用-v卷的方式将容器将路径映射,达到在宿主机修改文件 容器内自动修改!!

2.部署Tomcat

[root@docker-01 ~]# docker run -d --name tomcat-1 -p334:8080 tomcat:9.0
c8393946c09442f07ba8938ff783cb64b5dc94bca1cd740665414126fdc1cec7#测试可以访问到 但是访问时出现404 如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-croT0FBi-1626612848483)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612153634037.png)]

原因:是因为默认是最小的镜像,剔除掉所有没有必要的内容

可以将tomcat容器里面的模板copy到webapps目录 继续访问即可!

# 1、进入tomcat容器
[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED         STATUS         PORTS                   NAMES
c8393946c094   tomcat:9.0   "catalina.sh run"   8 minutes ago   Up 8 minutes   0.0.0.0:334->8080/tcp   tomcat-1
[root@docker-01 ~]# docker exec -it c8393946c094 /bin/bash# 2、查看tomcat路径
root@c8393946c094:/usr/local/tomcat# whereis tomcat
tomcat: /usr/local/tomcat# 3、webapps.dist(模板)里面所有内容 copy到 webapps里面
root@c8393946c094:/usr/local/tomcat# cd /usr/local/tomcat/
root@c8393946c094:/usr/local/tomcat# cp -r webapps.dist/* /usr/local/tomcat/webapps
root@c8393946c094:/usr/local/tomcat# cd webapps
root@c8393946c094:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager# 4、刷新浏览器 没有404的报错了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lsuVZdE-1626612848484)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612154757548.png)]

3.部署ES+Kibana

ES配置

[root@docker-01 ~]# docker pull elasticsearch
[root@docker-01 ~]# docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:latest
4bd3508b34a9fccc4ebef4168d150d6ed22d6cf12c1464d840c29b77d30aef46
docker update elasticsearch --restart=always#更新elasticsearch1为开机自启
[root@docker-01 ~]# docker update elasticsearch1 --restart=always
elasticsearch1

问题:启动ES后发现非常的卡 因为ES十分耗内存的 虚机资源配置高就不会有这种烦恼了!

或者 启动后使用docker ps 发现es容器根本就没运行!!

解决问题:限制ES的内存使用量

[root@docker-01 ~]# docker run -d --name elasticsearch1  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms512m  -Xmx1024m" elasticsearch:latest
ce8294895f8dd748a9f4597765205f2759041138f8827718a19ad29dac22a229#限制es使用64m内存 最高使用512内存[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                            NAMES
ce8294895f8d   elasticsearch:latest   "/docker-entrypoint.…"   20 seconds ago   Up 19 seconds   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch1#查看es资源使用信息
[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                                            NAMES
ce8294895f8d   elasticsearch:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch1
[root@docker-01 ~]# docker stats ce8294895f8d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6z7w3NZ-1626612848485)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612162320681.png)]

# 测试es是否能够正常访问
[root@docker-01 ~]# curl localhost:9200
{"name" : "D4TfV-p","cluster_name" : "elasticsearch","cluster_uuid" : "SZGfG8UfSn6l4sgQtON-wA","version" : {"number" : "5.6.12","build_hash" : "cfe3d9f","build_date" : "2018-09-10T20:12:43.732Z","build_snapshot" : false,"lucene_version" : "6.6.1"},"tagline" : "You Know, for Search"
}
# 配置es允许跨域
[root@docker-01 docker]# docker exec -it elasticsearch1 /bin/bashroot@ce8294895f8d:/usr/share/elasticsearch# echo "http.cors.enabled: true" >> /usr/share/elasticsearch/config/elasticsearch.yml
root@ce8294895f8d:/usr/share/elasticsearch# echo "http.cors.allow-origin: "*"" >> /usr/share/elasticsearch/config/elasticsearch.yml [root@docker-01 docker]# docker restart elasticsearch1
elasticsearch1

Kibana配置

启动Kibana时需要配置ES的IP 可以使用docker inspect命令查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vi8aWjXr-1626612848485)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612170455993.png)]

所以我们启动Kibana容器的时候需要链接到172.17.0.2这个地址

[root@docker-01 ~]# docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.2:9200 -p 5601:5601 -d kibana:latest
e9a2e899a9e74458fc4040229cacfb546b948031f4ac966b811a9d6fcbf1cb58[root@docker-01 ~]# docker update kibana --restart=always
kibana#浏览器访问测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BqJDvpeP-1626612848485)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612205736323.png)]

4.可视化工具portainer

portainer是docker图形化管理工具,提供web页面供我们操作

[root@docker-01 ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

浏览器访问

//第一次进入会要创建用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zANjAiEO-1626612848486)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612220004729.png)]

//选择数据 local本地即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EDt5502o-1626612848487)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612220254571.png)]

//设置好进入就可以对本地docker 提供可视化web页面了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MjmTCCkx-1626612848488)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210612220422209.png)]

Docker镜像理论与原理

镜像是什么?

镜像是运行容器的前提,镜像可以看作是一个特殊的文件系统,可以提供容器运行时所需要的程序、库、资源、配置等文件,还包含了一些运行时准备的一些配置参数(环境变量、用户等)。

镜像不包含任何动态数据,其内容在构建之后也不会被改变。

UnionFS 联合文件系统概念

下载镜像是看到的一层一层的就是UnionFS联合文件系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28X32JXN-1626612848488)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210619090050251.png)]

UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite severl directories into a single virtual filesystem)。union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于镜像基础(没有父级镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

docker的镜像实际上由一层层文件系统组成,这种文件系统及时union文件系统。

**bootfs(boot file system):**主要包含bootloader(加载器)和kernel(内核),bootloader主要是引导加载内核,Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs。这一层与我们典型的Linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

**rootfs(root file system):**在bootfs之上,包含的就是典型Linux系统中的/dev ,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同操作系统发行版本,比如:Ubuntu,centos等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LU10iwPZ-1626612848489)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210619093851510.png)]

对于一个精简的OS ,rootfs可以很小,只需要包含最基本的命令和工具库就可以了,因为底层直接用宿主机的内核,自己只需要一个rootfs就可以了,由此可见对于不同的Linux发型版本,bootfs基本是一致的,rootfs会有差别,因此不同的发行版本可用公用bootfs。

分层概念

对于同一个软件,它的内容被拆分成为了一个不同的部分,每个部分成为一个层,而每一个层中可能包含了许多的内容(小到一个文件,大到一个软件)。
对于docker的分层思想,目前感知到的好处就是复用、共享、高效。

**复用:**我们拉取镜像是一层一层拉取到本地的,当我们需要拉取的镜像某些层在我们本地已经存在的话,那就可以不用拉取那部分,这就提升了拉取速度。

**共享:**当我们某些部分是很多应用运行所共同需要的,那么它可以单独为一个层,为其它应用共同使用,减少了本地的存储资源的占用。

**高效:**公共层的运行资源可以供给所有的其它的层共同使用,不用对公共都需要的资源进行重复创建与运行,降低宿主机(host)的资源占用,提高资源利用效率,速度也就快了,更高效了(这一点主要体现在操作系统方面,操作系统那一部分可以说是大伙都需要使用的,所以各个镜像运行起来编程容器的时候,直接与操作系统交互,效率更好;当然不同容器运行的时候需要的环境可能有差别,这部分由容器自己负责管理,而共有的系统内核大伙都一样,则共用)。

**特点:**docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部。

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nsd0TZ27-1626612848489)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210619095610504.png)]

commit镜像

docker commit 将容器提交为镜像

docker commit [可选参数] 容器id 目标镜像名[tag]# 可选参数
-m:提交描述信息
-a:作者

实操练习

# 1、tomcat默认并没有页面内容
# 2、将页面模板cp到webapps目录下  之后生成新的镜像[root@docker-01 ~]# docker run -itd --name tomcat -p3001:8080 tomcat:9.0
889c6c41cecc3825e471139ae127f73f7792e8e0ac8b51ddd5a4fc053538d0bf
[root@docker-01 ~]# docker exec -it 889c6c /bin/bash
root@889c6c41cecc:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md  RUNNING.txt  conf  logs        temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@889c6c41cecc:/usr/local/tomcat# cd  webapps
root@889c6c41cecc:/usr/local/tomcat/webapps# cp -r ../webapps.dist/* .
root@889c6c41cecc:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager[root@docker-01 ~]# curl localhost:3001<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Apache Tomcat/9.0.46</title><link href="favicon.ico" rel="icon" type="image/x-icon" /><link href="tomcat.css" rel="stylesheet" type="text/css" />..... 可以看到tomcat可以访问到页面内容了(默认什么也没有 访问页面会显示404类似的错误)# 将上面修改好页面的tomcat 制作成新的镜像[root@docker-01 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED         STATUS         PORTS                    NAMES
889c6c41cecc   tomcat:9.0   "catalina.sh run"   6 minutes ago   Up 6 minutes   0.0.0.0:3001->8080/tcp   tomcat
[root@docker-01 ~]# docker commit  -a "qinziteng" -m "app V1" 889c6c41cecc tomcatapp:v1
sha256:c7c6c9d565ec0af6d18fa1e6fdb55d8c8ca8501043d7b345fd7319a0048fd9ac
[root@docker-01 ~]# docker images

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNgL1R8u-1626612848490)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210619200137301.png)]

# 导出镜像命令
docker save > 包名字.tar.gz  镜像
docker save -o 包名字.tar.gz  镜像
[root@docker-01 ~]# docker save  > tomcat:v1.tar.gz tomcat:v1 #导入镜像命令docker load  <  指定包docker load  -i 指定包[root@docker-02 ~]# docker load  < tomcat\:v1.tar.gz 

Docker 数据存储

指定路径挂载(Bind mount)

持久化存储:将docker宿主机和容器进行目录挂载,并且删除容器后,宿主机目录中数据不会丢失!

注:-v 做持久化 宿主机目录内容 会覆盖掉容器内目录内容

举例: 假设容器/tmp/data目录和宿主机的/home/data做持久化

容器/tmp/data目录有数据 但是宿主机的/home/data没有数据

思考:当宿主机和容器两个目录做持久化后 data目录下是否有数据?

答:没有 因为会根据宿主机的/data目录而定,上面宿主机/data没有数据 所以做持久化后 也没有数据。

docker run  -itd --name test -v 宿主机路径:容器路径   //格式和-p端口映射相似

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-msj2IAyi-1626612848490)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622140507978.png)]

[root@docker-01 ~]# docker run  -itd --name test -v /root/data:/tmp/data centos:7
-v: 将宿主机/root/data目录和容器/tmp/data目录关联起来265feed19c583b824aff16b642714ecdbd16d7a7efa7afdf1db412d86d1706bb
[root@docker-01 ~]# ls /root/data/
[root@docker-01 ~]#
[root@docker-01 ~]# cd /root/data/
[root@docker-01 data]# touch test.sh   #宿主机创建一个文件
[root@docker-01 data]# ls
test.sh
[root@docker-01 data]# docker exec -it test /bin/bash   #进入容器查看是否文件同步了
[root@265feed19c58 /]# ls /tmp/data/
test.sh[root@docker-01 ~]# docker inspect test

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Qp3Mofe-1626612848491)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622141722959.png)]

实践-MySQL数据同步

[root@docker-01 ~]# docker run -itd -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
36b96c6b2654ad17465051ef94e148d80b7453e524fa50d98e7ebc1f4702c151
-it 交互式
-d 后台运行
-p 端口映射 [宿主机端口]:[容器端口]
-v 数据卷挂载 [宿主机地址]:[容器地址]
-e env 环境变量设置(给root一个密码)[root@docker-01 ~]# ls /home/mysql/data/
# 疑惑:做持久化后宿主机会覆盖容器内容,那这里怎么还有文件呢?
#答:覆盖后 mysql自动生成的。auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem# 尝试连接mysql
//默认宿主机没有mysql连接工具 这里我们安装mariadb-server[root@docker-01 ~]# yum -y install mariadb-server.x86_64 //使用宿主机的ip进行连接
[root@docker-01 ~]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 10.10.14.50/24 brd 10.10.14.255 scope global noprefixroute ens33[root@docker-01 ~]# mysql  -uroot -p123456 -P 3310 -h 10.10.14.50# 因为root是远程用户所以-h指定ip可以连上
MySQL [(none)]> select * from mysql.user \G
.......*************************** 4. row ***************************Host: %User: rootSelect_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YReload_priv: YShutdown_priv: YProcess_priv: YFile_priv: YGrant_priv: Y

挂载权限

# 通过 -v 容器内路径:ro rw 改变权限docker run -itd --name  test1 -v /home/data1:/tmp/data:ro centos:7
docker run -itd --name  test2 -v /home/data2:/tmp/data:rw centos:7
# ro 只读
# rw 可读可写# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内只有可读权限!

具名和匿名挂载(Docker Manager Volume)

# 匿名挂载
-v 容器内路径[root@docker-01 ~]# docker run  -d -P --name nginx -v /etc/nginx nginx:1.21 nginx:1.21 # 查看所有的volume 的情况
[root@docker-01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     1c31b31617fefe565a14e9db40ebbaa279a17c215f23faaa92f72288ec4e8316
local     2a5a9f0fa8da085cc4f2e3a8658c07c94e82df410a8281e33722dd7dd4d430a1
........ 省略部分
# 看到这些以容器id命名的volume都是匿名挂载
# 具名挂载
-v volume名字:容器内路径[root@docker-01 ~]# docker run -itd --name nginx1 -P -v nginx1-volume:/etc/nginx nginx# 查看volume的情况
[root@docker-01 ~]# docker volume ls
DRIVER    VOLUME NAME
.......
local     nginx1-volume# 查看nginx1-volume卷路径[root@docker-01 ~]# docker volume inspect nginx1-volume

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M8o4P0Gw-1626612848492)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622191546968.png)]

docker容器内的卷,没有制定目录的情况下默认都是在/var/lib/docker/volumes/这个路径下

小总结

-v /宿主机路径:容器内路径   # 制定路径挂载
-v 卷名:容器内路径         #具名挂载
-v 容器内路径              #匿名挂载docker默认存放卷路径:/var/lib/docker/volumes/
bind mount docker manager volume
卷位置 可任意制定 /var/lib/docker/volumes/
有mount point影响 隐藏并替换为volume 原有数据复制到 volume
是否支持单个文件 支持 不支持,只能是目录
权限控制 可设置为只读,默认为读写权限 可设置为只读,默认为读写权限
移植性 移植性弱,与host path 绑定 移植性强,无需制定host目录

Dockerfile 方式挂载卷

# 创建一个dockerfile文件, 名字可以随机
# 文件中的内容 指令要大写[root@docker-01 ~]# mkdir /volume-test
[root@docker-01 ~]# cd /volume-test/
[root@docker-01 volume-test]# cat dockerfile1 FROM centos
VOLUME ["/test01","/test02"]    #这种方式是匿名挂载
CMD echo"----end-----"
CMD /bin/bash#文件中的每一个命令   就是镜像的一层[root@docker-01 volume-test]# docker build -f /volume-test/dockerfile1 -t qinziteng/centos:v1 .
# 运行dockerfile生成的镜像[root@docker-01 ~]# docker run -itd --name t1-qinziteng  qinziteng/centos:v1
7dc45b976f2074c9965526856beeb42017a9fdb9044b329481ba8327313a94cd
[root@docker-01 ~]# docker exec  -it t1-qinziteng /bin/bash
# 进入容器后可以查看到挂载的卷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-86kOtqSl-1626612848493)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622200320566.png)]

//查看详细信息

[root@docker-01 ~]# docker inspect t1-qinziteng

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDfaf50u-1626612848493)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622200719001.png)]

容器之间共享卷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aidkUvfm-1626612848494)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210624203226292.png)]

实践:

//t1作为父容器 使用t2容器挂载t1容器里面的卷。

[root@docker-01 ~]# docker run -itd --name t1 -v t1:/tmp centos:7   #创建t1容器
8330160c1e4df53a7781c915154c8053ad2d4f0bd309ed8e10ece2dfbc8c9eee
[root@docker-01 ~]# docker run -itd --name t2 --volumes-from t1 centos:7
#创建t2容器,只需要使用 --volumes-from 指定父容器即可!
5e474b4dcd1ec384fafa576162f9c4ad42cddbb93e8b101a4b2dade157f8f472

//此时容器t1和t2之间实现了卷同步,当然也可以创建t3容器,之后在挂载到t1(父容器) 三台容器实现共享!

# 容器t2上创建任意文件测试
[root@docker-01 ~]# docker exec -it t2 /bin/bash
[root@5e474b4dcd1e /]# cd /tmp/
[root@5e474b4dcd1e tmp]# ls
ks-script-DrRL8A  yum.log
[root@5e474b4dcd1e tmp]# touch  a
# 容器t1上查看  可以看到在t2上创建的文件同步到了t1
[root@docker-01 ~]# docker exec -it t1 /bin/bash
[root@8330160c1e4d /]# cd /tmp/
[root@8330160c1e4d tmp]# ls
a  ks-script-DrRL8A  yum.log

Dockerfile

初识dockerfile

dockerfile 是用来构建自定义镜像的脚本,dockerfile中每一个指令都是一层。

其实在Docker Hub上的镜像也是由dockerfile构建来的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QYdJJTYH-1626612848494)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210626110800450.png)]

下图是centos7的dockfile构建过程!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmeVoro1-1626612848495)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210626111048285.png)]

dockerfile 构建过程

过程

1、编写dockerfile文件

2、dockerbuild 构建镜像

3、docker run 运行容器

4、docker push 上传镜像

须知

1、每个保留关键字(指令)都是大写字母

2、执行顺序是 从上往下

3、# 表示注释

4、每一个指令都会提交一个新的镜像层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIPrp4xs-1626612848495)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210626112141021.png)]

dockerfile的指令

FROM          # 基础镜像,一切从这里开始构建
MAINTAINER    # 镜像是哪位写的 姓名+邮箱
RUN           # 镜像构建的时候需要运行的命令
ADD           # copy内容到容器(压缩包,自动解压)
COPY          # 类似ADD 将文件copy到容器中
WORKDIR       # 指定镜像工作目录
VOLUME        # 设置容器卷
EXPOSE        # 指定暴露端口
CMD           # 指定这个容器启动的时候要运行的命令(只有最后一个会生效,可被代替)
ENTRYPOINT    # 指定这个容器启动的时候要运行的命令(可以追加命令)
ONBUILD       # 当构一个被继承的容器 dockerfile这个时候会运行ONBUILD 的指令 ,触发指定。
ENV           # 构建时设置环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOERcT4H-1626612848496)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210626112706203.png)]

实践1 构建自己的centos版本

[root@docker-01 ~]# mkdir /var/lib/docker/dockerfile
[root@docker-01 ~]# cd /var/lib/docker/dockerfile/
[root@docker-01 dockerfile]# cat dockerfile01
FROM centos:7
MAINTAINER qinziteng<qinziteng05@163.com>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "------end-----"
CMD /bin/bash# docker build 构建镜像
docker build -f 指定dockerfile路径 -t 镜像名字:tag .
[root@docker-01 dockerfile]# docker build -f dockerfile01  -t qin1-centos:0.1  .# 使用刚构建的镜像运行容器
[root@docker-01 dockerfile]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
qin1_centos           0.1       5006069595ef   38 minutes ago   506MB
.......[root@docker-01 dockerfile]# docker run -itd --name test-centos qin1_centos:0.1
b5e9a7f686b75b8d04a18b4f9148789f6c2465cd0e14aa4a7326df3734706f57
[root@docker-01 dockerfile]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS     NAMES
b5e9a7f686b7   qin1_centos:0.1   "/bin/sh -c /bin/bash"   3 seconds ago   Up 2 seconds   80/tcp    test-centos# 测试test-centos
[root@docker-01 dockerfile]# docker run -it --name test-centos qin1-centos:0.1
[root@9e555aa3f096 local]# pwd       # 工作目录为/usr/local
/usr/local
[root@9e555aa3f096 local]# vim a     # 可以使用vim命令
[root@9e555aa3f096 local]# ifconfig  # 可以使用ifconfig命令
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)RX packets 8  bytes 656 (656.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

使用 docker history 查看镜像构建过程

docker history 镜像名字
[root@docker-01 ~]# docker history qin1-centos:0.1
IMAGE          CREATED             CREATED BY                                      SIZE      COMMENT
070dce983019   18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
49ae2fe89094   18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
919054dca79a   18 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
4a30a3ff25d9   18 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B
8040386b9290   18 minutes ago      /bin/sh -c yum -y install net-tools             123MB
79ed9a317f57   18 minutes ago      /bin/sh -c yum -y install vim                   178MB
b92d028301aa   18 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B
1a2db6372118   About an hour ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
b937fb13ac28   About an hour ago   /bin/sh -c #(nop)  MAINTAINER qinziteng<qinz…   0B
8652b9f0cb4c   7 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      7 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      7 months ago        /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

CMD和ENTRYPOINT区别

CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替(覆盖)

ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令(追加)

测试cmd

[root@docker-01 dockerfile]# cat dockerfile_com_test
FROM centos:7
CMD ["ls","-a"]
# []中可写多个指令 逗号隔开 [root@docker-01 dockerfile]# docker build -f dockerfile_com_test  -t cmdtest:1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7---> 8652b9f0cb4c
Step 2/2 : CMD ["ls","-a"]---> Running in 68644a61f187
Removing intermediate container 68644a61f187---> 549fd355ebc2
Successfully built 549fd355ebc2
Successfully tagged cmdtest:1[root@docker-01 dockerfile]# docker run cmdtest:1   # 当运行时运行了 dockerfile 中写的指令 “ls -a” 命令
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var# docker run 后面可以加参数的
//当加 -l 正常就相当于 ls -al 但是CMD是覆盖机制 当我们执行-l 时 ls -a 就会覆盖为 -l  ,而-l并不是一个命令 所以有了下面的报错。
[root@docker-01 dockerfile]# docker run  cmdtest:1  -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

测试ENTRYPOINT

[root@docker-01 dockerfile]# cat dockerfile_ENTRYPOINT_test
FROM centos:7
ENTRYPOINT ["ls","-a"][root@docker-01 dockerfile]# docker build -f dockerfile_ENTRYPOINT_test  -t entrypoint:1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:7---> 8652b9f0cb4c
Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in cfdfe65ac874
Removing intermediate container cfdfe65ac874---> cf8df8629b3d
Successfully built cf8df8629b3d
Successfully tagged entrypoint:1
[root@docker-01 dockerfile]# docker run entrypoint:1
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var# 我们在docker run 后面追加参数
//添加-l参数 可以看到当在docker run 后面添加 -l 参数 就相当于 “ls -al”
[root@docker-01 dockerfile]# docker run entrypoint:1 -l
total 12
drwxr-xr-x   1 root root     6 Jun 28 12:40 .
drwxr-xr-x   1 root root     6 Jun 28 12:40 ..
-rwxr-xr-x   1 root root     0 Jun 28 12:40 .dockerenv
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   5 root root   340 Jun 28 12:40 dev
drwxr-xr-x   1 root root    66 Jun 28 12:40 etc
drwxr-xr-x   2 root root     6 Apr 11  2018 home
lrwxrwxrwx   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x   2 root root     6 Apr 11  2018 media
drwxr-xr-x   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x 146 root root     0 Jun 28 12:40 proc
dr-xr-x---   2 root root   114 Nov 13  2020 root
drwxr-xr-x  11 root root   148 Nov 13  2020 run
lrwxrwxrwx   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x  13 root root     0 Jun 28 12:34 sys
drwxrwxrwt   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x  13 root root   155 Nov 13  2020 usr
drwxr-xr-x  18 root root   238 Nov 13  2020 var

实践2 构建tomcat

1、准备tomcat和jdk的源码包 并放到dockerfile文件夹中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGqdYjII-1626612848497)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630150354631.png)]

2、编写Dockerfile文件

[root@docker-01 dockerfile]# cat Dockerfile
FROM centos:7
MAINTAINER qinziteng<1790168505@qq.com>ADD apache-tomcat-9.0.48.tar.gz /usr/local/
ADD jdk-8u152-linux-x64.tar.gz /usr/local/RUN mv /usr/local/jdk1.8.0_152  /usr/local/javajdk
RUN mv /usr/local/apache-tomcat-9.0.48 /usr/local/tomcatRUN yum -y install net-tools vim ENV JAVA_HOME /usr/local/javajdk
ENV CLASSPATH $JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 8080
WORKDIR /usr/local/CMD /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/bin/logs/catalina.out #最后的CMD 一定要写上 tail -F 不然容器会自动关闭 因为docker 不支持daemon进程

3、生成镜像

[root@docker-01 dockerfile]# docker build -t tomcat:v1 .
# 使用Dockerfile 命名 不需要使用 -f指定文件 (docker build 默认会找名字为 Dockerfile 的文件)[root@docker-01 dockerfile]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat                v1        a333e7afe59c   5 seconds ago   1.18GB

4、运行容器 并浏览访问

[root@docker-01 dockerfile]# docker run -itd --name tomcat_01 -p8080:8080^C
[root@docker-01 dockerfile]# netstat -anput |grep 8080
[root@docker-01 dockerfile]# docker run -itd --name tomcat_01 -p8080:8080 tomcat:v1 [root@docker-01 dockerfile]# curl localhost:8080#浏览器中访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLainjgO-1626612848497)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630151341047.png)]

Docker 仓库

Registry私有仓库

docker-registry是官方提供的工具,可以用于构建私有的镜像仓库

一般情况下,不论是通过commit容器得到的镜像,或者是用dockerfile制作的镜像,如果需要将镜像保存,可以使用我们之前提到的导出导入命令(save -o ; load -i)。导出的包,然后再传给其他dockerHost,这种方法也是可行的。

# 导出镜像命令
docker save > 包名字.tar.gz  镜像
docker save -o 包名字.tar.gz  镜像
[root@docker-01 ~]# docker save  > tomcat:v1.tar.gz tomcat:v1 #导入镜像命令docker load  <  指定包docker load  -i 指定包[root@docker-02 ~]# docker load  < tomcat\:v1.tar.gz

1、获取镜像

[root@docker-01 ~]# docker pull registry:2

2、运行registry

[root@docker-01 ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
fba8daa8f8047ec4550e2003f5b6864f269d6406dfed0f41a2d4feae25293792

3、编辑docker配置文件

因为docker默认是从dockehub上下载镜像的,需要在本地指定一下私有仓库的IP加端口, 这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。 如果没做这一步,会报HTTPS的错。

//编辑docker的配置文件,指定私有仓库地址

[root@docker-01 ~]# vim /usr/lib/systemd/system/docker.service
#--insecure-registry 指定registry仓库地址及端口号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSj6NDmj-1626612848498)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630173342194.png)]

[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker

4、上传镜像到registry仓库

//因为我们使用的私有镜像,在上传或下载的时候,都需要我们将镜像的名称直接重命名,要注明它私有仓库的IP地址:暴露端口。切记是必须,否则将识别不到仓库而上传或下载失败。

# 打标签
docker tag 镜像:[tag] 私有仓库地址:端口/命名:[tag]
[root@docker-01 ~]# docker tag tomcat:v1 10.10.14.50:5000/tomcat:v1[root@docker-01 ~]# docker images
REPOSITORY                TAG       IMAGE ID       CREATED        SIZE
10.10.14.50:5000/tomcat   v1        a333e7afe59c   3 hours ago    1.18GB# 上传
[root@docker-01 ~]# docker push 10.10.14.50:5000/tomcat:v1

这里注意,既然是私有仓库,肯定是要考虑多台DockerHost共用的情况,如果有其他的DockerHost想要使用私有仓库,仅需要修改docker的配置文件,指定私有仓库的IP和端口即可。当然别忘了,更改过配置文件之后,daemon-reload ,restart docker服务。

5、查看仓库镜像

//查看有哪些镜像

[root@docker-01 ~]# curl -XGET http://10.10.14.50:5000/v2/_catalog
{"repositories":["tomcat"]}

Harbor

Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是DockerRegistry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库【注:helm就相当于k8s的yum】。另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。

1、下载一个docker-compse工具。

//这里使用之前准备好的tar包,解压后将docker-compse移动到/usr/local/bin即可

提取码:1111 harbor提取码:1111

[root@docker-01 ~]# tar zxf docker-compose.1.25.0.tar.gz
tar: Removing leading `/' from member names
[root@docker-01 ~]# cd usr/local/bin/
[root@docker-01 bin]# ls
docker-compose
[root@docker-01 bin]# cp docker-compose /usr/local/bin/
[root@docker-01 bin]# chmod +x /usr/local/bin/docker-compose
[root@docker-01 bin]# docker-compose -v  # 测试docker-compose命令是否可用
docker-compose version 1.25.0, build 0a186604

2、部署安装harbor

# 下载依赖包
[root@docker-01 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2# 下载harbor包 网速慢可用使用上面提供的包
[root@docker-01 ~]# wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.4.tgz[root@docker-01 home]# tar zxf harbor-offline-installer-v1.7.4.tgz  -C /usr/local/
[root@docker-01 local]# cd /usr/local/harbor/
[root@docker-01 harbor]# vi harbor.cfg

//修改为宿主机ip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENEHY68m-1626612848498)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630181103978.png)]

[root@docker-01 harbor]# ./install.sh ....... 省略部分内容
✔ ----Harbor has been installed and started successfully.----Now you should be able to visit the admin portal at http://10.10.14.50.
For more details, please visit https://github.com/goharbor/harbor .# 显示上面内容 安装成功

//docker-compose这个命令可以管理harbor服务,不过需要注意的是想使用以下命令,必须是和docker-compose.yml这个文件在同一个目录下,其实就是通过管理这个文件而管理harbor仓库的。

启动harbor: docker-compose start
停止harbor: docker-compose stop
重启harbor: docker-compose restart

3、访问并创建仓库

安装没问题之后访问web页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbyCAYqr-1626612848499)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630181847011.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7rnRIOCG-1626612848499)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630182107147.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bszmM0ep-1626612848500)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630182129696.png)]

4、docker client的设置

其他dockerhost想要使用harbor仓库 需要进行下面操作

[root@docker-01 ~]# vim /lib/systemd/system/docker.service
.....
ExecStart=/usr/bin/dockerd --insecure-registry 10.10.14.50[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker

5、登入账号 上传镜像

# 登入账号
[root@docker-01 ~]# docker login -u admin -p Harbor12345 10.10.14.50# 打标签
[root@docker-01 ~]# docker tag tomcat:v1 10.10.14.50/qin/tomcat:v1 # 上传
[root@docker-01 ~]# docker push 10.10.14.50/qin/tomcat:v1 # web页面查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vPty0Qwh-1626612848500)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630183920932.png)]

6、下载镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5KN0pZc-1626612848501)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210630184046094.png)]

//选好指定镜像后 点击pull命令 复制命令下载即可

# 登入账号
docker login -u admin -p Harbor12345 10.10.14.50# pull镜像
[root@docker-02 ~]# docker pull 10.10.14.50/qin/tomcat:v1
v1: Pulling from qin/tomcat
2d473b07cdd5: Already exists
8fb41e8ecfc9: Extracting [============================================>      ]  10.22MB/11.5MB
7497dfe59924: Downloading [============================>                      ]  110.2MB/190.8MB
814f2fbba62b: Downloading [======================================>            ]  146.3MB/190.8MB
8d7f4bd29a1c: Download complete
386286b9bc09: Downloading [===========>                                       ]  14.33MB/61.97MB# 下载好之后查看镜像
[root@docker-02 ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
10.10.14.50/qin/tomcat   v1        a333e7afe59c   4 hours ago    1.18GB

Docker Hub

Docker Hub社区:https://registry.hub.docker.com/

1、首先需要一个可以登入的DockerHub的账号密码

2、使用docker login 登入

[root@docker-01 ~]# docker login -u qinziteng
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

3、打标签上传镜像

[root@docker-01 ~]# docker tag tomcat:v1 qinziteng/tomcat:v1
#打标签时前面要跟上DockerHub的账号名称  我的DockerHub账号是qinziteng  所以我tag时在前面加上qinziteng [root@docker-01 ~]# docker push qinziteng/tomcat:v1
The push refers to repository [docker.io/qinziteng/tomcat]
c86bab0350f1: Pushing [=>                                                 ]  3.791MB/178.9MB
18eae4728e98: Pushing [====>                                              ]  1.372MB/15.93MB
2ed629ee2db1: Pushing [>                                                  ]  1.093MB/384.5MB
f6065f276424: Preparing
c52d6019a38b: Preparing
174f56854903: Waiting 

4、退出登入

[root@docker-01 ~]# docker logout
Removing login credentials for https://index.docker.io/v1/

阿里云仓库

1、登入阿里云

2、找到镜像服申请仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlwqxiDO-1626612848501)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210701204601520.png)]

3、创建仓库

//首先创建一个命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SmHW7dgj-1626612848501)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210701204810151.png)]

//创建仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72tOZxlQ-1626612848502)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210701204941460.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UT62Re62-1626612848503)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210701205036368.png)]

4、登入阿里云账号

[root@docker-01 ~]# docker login -uqinziteng05 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

5、打标签上传镜像

[root@docker-01 ~]# docker tag tomcat:v1 registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat:v1
[root@docker-01 ~]# docker push registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat
Using default tag: latest
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat]
tag does not exist: registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat:latest
[root@docker-01 ~]# docker push registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat:v1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/qin_test1/tomcat]
c86bab0350f1: Pushing [>                                                  ]  1.605MB/178.9MB
18eae4728e98: Pushing [======>                                            ]  2.045MB/15.93MB
2ed629ee2db1: Pushing [>                                                  ]  1.621MB/384.5MB
f6065f276424: Pushing [>                                                  ]  4.397MB/384.5MB
c52d6019a38b: Pushing [=======>                                           ]  2.373MB/15.93MB
174f56854903: Waiting

6、下载镜像

docker pull registry.cn-hangzhou.aliyuncs.com/qin_test1/qinziteng:[镜像版本号]

Docker 网络

理解Docker0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hyqgT18-1626612848503)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705201706384.png)]

原理

1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装docker了,就会有一个docker0网卡(docker默认网卡)使用的是桥接模式,使用的技术是evth-pair技术!

//运行一个容器查看

[root@docker-01 images]# docker run -d -P --name tomcat-01 tomcat:9.0
779d77b2e042e7244c9de7fe32db1b8e110485c6a310016a817b37e2e4f15afe
[root@docker-01 images]# ip a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UzpbZ7WU-1626612848504)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705203825864.png)]

//查看容器里面的网卡信息 也会出现一个eth0@if144

[root@docker-01 images]# docker exec -it tomcat-01 ip addr

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTSKPFFn-1626612848504)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705203618054.png)]

2、在启动一台容器查看

[root@docker-01 images]# docker run -d -P --name tomcat-02 tomcat:9.0
66d2f6f381db47656e94b7ddec646cf254a78d7d1db6389fd2365971bdb7725b
[root@docker-01 images]# ip a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7YNp8Zj-1626612848505)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705204432388.png)]

//再去tomcat-02容器看下网卡信息

[root@docker-01 images]# docker exec  -it tomcat-02 ip addr

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xr1qkROv-1626612848506)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705204538761.png)]

# 我们发现这个容器和宿主机容器的网卡,都是一对一对的,这就是evth-pair技术# evth-pair 就是一对虚拟设备接口,他们是成对出现的,一段连着协议,一段彼此相连# 正因为这个特性 ,evth-pair充当一个桥梁,连接各种虚拟网络设备

3、docker-01 是否可以ping通 docker-02 ?

[root@docker-01 ~]# docker inspect tomcat-02 | grep IPAddress   #获取tomcat-02的ip"SecondaryIPAddresses": null,"IPAddress": "172.17.0.3","IPAddress": "172.17.0.3",[root@docker-01 ~]# docker exec  -it tomcat-01 ping 172.17.0.3    使用tomcat-01 ping tomcat-02
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.037 ms# 结论 docker容器是可以相互ping通的!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUpgZs3h-1626612848506)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705211644197.png)]

# 结论:tomcat-01和tomcat-02 是公用一个路由器,那就是docker0# 所有的容器在不指定网络情况下,都是docker0路由的,docker会给容器分配一个默认可用IP# 172.17.0.3/16 是一个B类地址   大约有65535个可用地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnJ0ZfUH-1626612848507)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705213429706.png)]

4、删除容器 veth也会被删除

[root@docker-01 ~]# docker rm -f tomcat-02

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IfdaQ6f-1626612848507)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210705213928331.png)]

容器互联 --link

# link 解决2个容器之间互相访问通信的问题# 首先创建两个容器
[root@docker-01 ~]# docker run  -itd --name test1 tomcat:9.0
a7a989a7314792b25b139828b9869a7f7bbeebf399c27f5a9222e8847a0866b9
[root@docker-01 ~]# docker run  -itd --name test2 tomcat:9.0
d76420b48ad038a436601bf8a1bcc5fc0e439356af93a389a191f59fe40b2e41# 测试 test1 不使用ip地址ping
[root@docker-01 ~]# docker exec  -it test1 ping test2
ping: test2: Name or service not known
//可以看到默认使用主机名是ping不通的# 再创建一台容器 test3   使用--link连接test2
[root@docker-01 ~]# docker run -itd --name test3 --link test2 tomcat:9.0
a7855617234c4f83a95c6d78002236709875b03db76073c1c35da843374d0bc2[root@docker-01 ~]# docker exec -it test3 ping test2
PING test3 (172.17.0.3) 56(84) bytes of data.
64 bytes from test3 (172.17.0.3): icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from test3 (172.17.0.3): icmp_seq=2 ttl=64 time=0.138 ms#那反向可以ping通吗?(test2 ping test3)
[root@docker-01 ~]# docker exec -it test2 ping test3
ping: test3: Name or service not known
//答案是 不能 因为不是双向的[root@docker-01 ~]# docker inspect test3  #在test3容器上可以查看到test2的互联信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teVZJNix-1626612848508)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210706204942793.png)]

# --link互联实际上就是 更改了 容器里面的 /etc/hosts 文件[root@docker-01 ~]# docker exec  -it test3 /bin/bash
root@a7855617234c:/usr/local/tomcat# cat /etc/hosts
......
172.17.0.3  test2 4978dd7d02f4

//至今 docker 已经不建议使用 --link了 代替的有 自定义网络(不使用默认的Docker0)

自定义网络

自定义网络可以解决默认Docker0 的使用域名ping

# 查看所有的docker网络
[root@docker-01 ~]# docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
0cdc33062df7   bridge          bridge    local
108ec64df7d1   harbor_harbor   bridge    local
ce3eda59699f   host            host      local
ffbc05a30138   none            null      local

网络模式

bridge桥接:docker 默认,自己也使用bridge模式

none :不配置网络

host: 和宿主机共享网络

container:容器网络连通(很少用)

# 下面两条运行容器命令可以能达到同样的效果 因为不加--network 默认也是bridge模式(Docker0)
docker run -d -P --name tomcat_01 tomcat:9.0
docker run -d -P --name tomcat_02 --network bridge  tomcat:9.0
# 自定义一个网络
[root@docker-01 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mybridge_01
# --driver 网络类型(默认为bridge)
# --subent 子网(表示一个网段)
# --gateway 网关
43021ac7f0cbe24cd5a52f52ceaa377cba36e36868c607a40ec05504ca9add20
[root@docker-01 ~]# docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
0cdc33062df7   bridge          bridge    local
108ec64df7d1   harbor_harbor   bridge    local
ce3eda59699f   host            host      local
43021ac7f0cb   mybridge_01     bridge    local
ffbc05a30138   none            null      local# 现在就创建好了一个网络  查看mybridge_01 详细信息
[root@docker-01 ~]# docker network inspect mybridge_01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sywyeTA-1626612848508)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210707211423303.png)]

# 运行两个容器 相互ping测试
[root@docker-01 ~]# docker run -itd --name test2_ping --network mybridge_01 tomcat:9.0
a61bb19fdd3b6c52ecc52a428833cb8c6ce55d3dd0f8def6b9b6a5f86da7ef3e
[root@docker-01 ~]# docker run -itd --name test1_ping --network mybridge_01 tomcat:9.0
c11d0a794b42bcff70e33d2365118557651a7f8653eea28f0cf60395873d13d2[root@docker-01 ~]# docker exec  -it test1_ping ping test2_ping
PING test2_ping (192.168.0.3) 56(84) bytes of data.
64 bytes from test2_ping.mybridge_01 (192.168.0.3): icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from test2_ping.mybridge_01 (192.168.0.3): icmp_seq=2 ttl=64 time=0.140 ms--- test2_ping ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.135/0.137/0.140/0.012 ms
[root@docker-01 ~]# docker exec  -it test2_ping ping test1_ping
PING test1_ping (192.168.0.4) 56(84) bytes of data.
64 bytes from test1_ping.mybridge_01 (192.168.0.4): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from test1_ping.mybridge_01 (192.168.0.4): icmp_seq=2 ttl=64 time=0.145 ms//可以看到 能够相互ping通。可以使用 docker inspect 查看容器的IP地址和详细信息。

容器连通性

如下图环境所示 思考不同网段的容器是否可以ping通呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYs7CnN9-1626612848509)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210708204147426.png)]

# 测试不同网络是否可以ping通
# 首先创建一个自定义网络
[root@docker-01 ~]# docker network create  --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
454038b54296c2f601e05370b8eeb67db735be63834f3c701f3bf6e863fdccab# 创建基于docker0的容器(默认就是docker0)
[root@docker-01 ~]# docker run -itd  -P --name  tomcat01 tomcat:9.0
5cd482906c4bc948708804974c26f8cb86bdb7a8a6b695d1ff01045e59c4f47f
[root@docker-01 ~]# docker run -itd  -P --name  tomcat02 tomcat:9.0
a2eb63e0bbd1e808931e17bc7862f8b10d289dfe15fbe71a0bca21b5a26d311b# 创建基于mynet的容器
[root@docker-01 ~]# docker run -itd --name tomcat3 -P --network mynet tomcat:9.0
0e498f88dd9e5c71ce8610e1a57f837f2ebf45e519a637b400cf0ea654782fd0
[root@docker-01 ~]# docker run -itd --name tomcat4 -P --network mynet tomcat:9.0
4441db5f69e322bfbb4b37341df3f61a677d9bab3122fd1970aa6315bc9da9f5#测试不同网段ping
[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat3
ping: tomcat3: Name or service not known# 答案是不同网段ping不通

实现不通网段容器ping通

测试:tomcat01容器 到 mynet网络打通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1n7lWzF-1626612848509)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210708204514780.png)]

[root@docker-01 ~]# docker network connect mynet tomcat01  # 为tomcat01容器打通mynet网络# 测试ping
[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat3
PING tomcat3 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat3.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.115 ms[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat4
PING tomcat4 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat4.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.146 ms# 查看tomcat01 容器的详细信息
[root@docker-01 ~]# docker inspect  tomcat01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hB1FwZ78-1626612848510)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210708205253151.png)]

打通mynet网络 实际上就是给tomcat01容器 配置双网卡!
cs —
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.135/0.137/0.140/0.012 ms
[root@docker-01 ~]# docker exec -it test2_ping ping test1_ping
PING test1_ping (192.168.0.4) 56(84) bytes of data.
64 bytes from test1_ping.mybridge_01 (192.168.0.4): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from test1_ping.mybridge_01 (192.168.0.4): icmp_seq=2 ttl=64 time=0.145 ms

//可以看到 能够相互ping通。

可以使用 docker inspect 查看容器的IP地址和详细信息。


## 容器连通性如下图环境所示  思考不同网段的容器是否可以ping通呢[外链图片转存中...(img-fYs7CnN9-1626612848509)]```bash
# 测试不同网络是否可以ping通
# 首先创建一个自定义网络
[root@docker-01 ~]# docker network create  --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
454038b54296c2f601e05370b8eeb67db735be63834f3c701f3bf6e863fdccab# 创建基于docker0的容器(默认就是docker0)
[root@docker-01 ~]# docker run -itd  -P --name  tomcat01 tomcat:9.0
5cd482906c4bc948708804974c26f8cb86bdb7a8a6b695d1ff01045e59c4f47f
[root@docker-01 ~]# docker run -itd  -P --name  tomcat02 tomcat:9.0
a2eb63e0bbd1e808931e17bc7862f8b10d289dfe15fbe71a0bca21b5a26d311b# 创建基于mynet的容器
[root@docker-01 ~]# docker run -itd --name tomcat3 -P --network mynet tomcat:9.0
0e498f88dd9e5c71ce8610e1a57f837f2ebf45e519a637b400cf0ea654782fd0
[root@docker-01 ~]# docker run -itd --name tomcat4 -P --network mynet tomcat:9.0
4441db5f69e322bfbb4b37341df3f61a677d9bab3122fd1970aa6315bc9da9f5#测试不同网段ping
[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat3
ping: tomcat3: Name or service not known# 答案是不同网段ping不通

实现不通网段容器ping通

测试:tomcat01容器 到 mynet网络打通

[外链图片转存中…(img-t1n7lWzF-1626612848509)]

[root@docker-01 ~]# docker network connect mynet tomcat01  # 为tomcat01容器打通mynet网络# 测试ping
[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat3
PING tomcat3 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat3.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.115 ms[root@docker-01 ~]# docker exec -it tomcat01 ping tomcat4
PING tomcat4 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat4.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.146 ms# 查看tomcat01 容器的详细信息
[root@docker-01 ~]# docker inspect  tomcat01

打通mynet网络 实际上就是给tomcat01容器 配置双网卡!

狂神docker笔记相关推荐

  1. 狂神Docker笔记之:Docker的常用命令

    docker官网的命令大全:https://docs.docker.com/engine/reference/commandline/docker/ 1.镜像命令 1.docker version 显 ...

  2. 狂神docker笔记1

    docker概述 隔离:Docker核心思想!打包装箱!每个箱子相互隔离! Docker通过隔离机制,可以将服务器利用到极致! Docker历史: 2010年成立公司dotCloud 2013年开源 ...

  3. 狂神docker学习笔记

    狂神docker(基础+进阶)-学习笔记 狂神说docker 三体:弱小和无知不是生存的障碍,傲慢才是. 从基础到进阶,每个视频都有认真看,做笔记和练习,以此篇分享整个学习过程 画图网页 docker ...

  4. RabbitMQ狂神说笔记(RabbitMQ B站狂神说笔记、KuangStudy、学相伴飞哥)

    一. 引用文章 RabbitMQ狂神说笔记(B站狂神说笔记.KuangStudy.学相伴飞哥) RabbitMQ狂神说笔记(B站狂神说笔记.KuangStudy.学相伴飞哥)百度云盘地址,提取码:07 ...

  5. Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)

    转载地址:https://www.cnblogs.com/spec-dog/p/11320513.html 开发中经常需要安装一些常用的服务软件,如Nginx.MySql.Redis等,如果按照普通的 ...

  6. Docker笔记——jdk镜像制作

    Docker笔记--jdk镜像制作 openjdk镜像依赖如下: openjdk:8-jdk -> buildpack-deps:jessie-scm -> buildpack-deps: ...

  7. Docker笔记四 发布自制DockerImage 到 Dockerhub

    Docker笔记 四 发布自制DockerImage 到 Dockerhub 1.注册Dockerhub账号 https://hub.docker.com/ 2.制作准备上传的dockerp_w_pi ...

  8. docker 笔记(2) -- 镜像

    docker 笔记(2) -- 镜像 Ubuntu 14.04 无论如何,飞蛾扑火都是一种高贵的姿态. 参考 菜鸟教程 -- docker 额 当使用的镜像文件本地不存在时,则从远程镜像库中下载,默认 ...

  9. Docker笔记三 Docker镜像制作

    Docker笔记三 Docker镜像制作 1.Docker镜像制作方法: docker commit 保存当前container的状态到镜像,生成p_w_picpath. docker build 利 ...

最新文章

  1. FreeBSD 8.0 终于发布正式版了
  2. 十分钟了解分布式计算:Spark
  3. 一分钟明白各种SQL语句加的什么锁——《深究Mysql锁》
  4. Linux--结构体的详细学习
  5. don't run elasticsearch as root
  6. HTTP方法:幂等性和安全性
  7. 学计算机的误解,让人误解的六大专业
  8. linux自动挂载usb打印机,Linux下使用Usbmount实现USB设备自动挂载
  9. win102004优化_windows 10新版2004和1909该如何选择
  10. mysql 存储过程写入文件
  11. css中关于居中的问题
  12. Bundle Adjustment原理及应用
  13. 测试网络速度的软件 哪款好,网络测速工具有哪些?2018网络测速工具推荐
  14. 一种基于波状扩散特征分析的光斑检测方法
  15. MapReduce之求各个部门工资的总和
  16. php wordpress 代码模板,wordpress模板代码详解
  17. C51串口通信(张毅刚)例8-1程序解释
  18. redis之数据倾斜如何处理
  19. 基于ThreeJS实现3D模型上的室内灯光效果模拟
  20. 用JS操作FRAME中的IFRAME及其内容

热门文章

  1. mysql监控-常用的mysql监控脚本
  2. 微信小程序 请求报错419 laravel
  3. 震撼收藏:《歌声飘过30年--百首金曲演唱会 第一场 春回大地(1978年-1985年)抒情歌曲的复兴》,场场精彩!
  4. 重庆市计算机一级理论题,重庆市计算机一级题库加答案
  5. android如何定时息屏_Android亮屏和熄屏控制实例详解
  6. python竖式计算_Python 模拟竖式大数乘法
  7. 雷电模拟器谷歌套件安装的时候总是卡着转圈圈
  8. ChatGPT Something went wrong 处理
  9. Photoshop 2021 Win10系统总安装失败,打不开,501错误等,如何解决安装教程!
  10. Unity3D 马赛克效果