首页 > 技术文章 > Docker进阶:容器卷、DockerFile、Docker网络原理

pengboke 2021-07-10 18:45 原文

 

1.Docker镜像

1.1镜像是什么

1.2Docker镜像加载原理

2.docker分层

3.commit镜像

3.1 启动一个默认tomcat

3.2 进入容器

3.3 拷贝文件

3.4 提交

4.容器数据卷

4.1什么是容器卷

4.2 使用容器卷

5.安装mysql

5.1 docker pull mysql

5.2 启动容器

5.3 安装后用工具连接

5.4 删除容器

6.具名和匿名挂载

6.1匿名挂载

6.2 查看所有volume的情况

6.3 具名挂载

6.4拓展

7.DockerFile

7.1 初始DockerFile

7.2 数据容器卷

7.3DockerFile介绍

7.4 发布自己的镜像

8.Docker网络

8.1 理解Docker 0

8.2 三个网络

8.3 -link

9.自定义网络

9.1 docker network

9.2 网络模式

9.3 测试

10 网络连通

 

 

1.Docker镜像

1.1镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和机遇运行环境开发的软件。

包含一个软件的所有内容。蒋所有的应用和环境,直接打包为docker镜像,直接运行

1.2Docker镜像加载原理

1.2.1UnionFs(联合文件系统)

Union是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交

一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统

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

1.2.3Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成(UnionFs)

boots(boot file system):主要包含bootloader和Kernel bootloader主要是引导加kernal,linux刚启动

                                        时会加bootfs文件系统,在Docker镜像的最底层是boots

rootfs(root file system):在bootfs之上。包含linux的/dev /proc /bin /etc 等标准目录和文件

 

2.docker分层

相同的镜像可以共享

 

3.commit镜像

3.1 启动一个默认tomcat

docker run -d -p 8080:8080 tomcat

3.2 进入容器

docker exec -it 容器id /bin/bash

3.3 拷贝文件

cp -r webapps.dist/* webapps

3.4 提交

docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]

docker commit -a="pengpeng" -m="add webapps app" 84a61bab7659 tomcat02:1.0

 

4.容器数据卷

4.1容器数据卷

容器的持久化和同步操作,容器间也是可以共享数据的

4.2 使用容器卷

4.2.1 使用 -v 命令挂载

docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口

docker run -it -v /home/ceshi:/home centos /bin/bash

使用 docker inspect 807be22b4072 查看

 测试

 

5.安装mysql

5.1docker pull mysql

docker pull mysql:5.7

5.2 启动容器

#参考官网 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# -d 后台运行

# -p 端口映射

# -v 卷挂载

# -e 环境配置

# -- name 容器名字

docker run -d -p 3306: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

5.3 安装后用工具连一下

5.4 删除容器

docker rm -f mysql01

docker ps  

docker ps -a

 

6.具名和匿名挂载

6.1匿名挂载

docker run -d -P --name nginx01 -v /etc/nginx nginx

这里只写了容器内的路径 没有写宿主机的路径

6.2 查看所有volume的情况

docker volume ls

6.3 具名挂载

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

docker volume ls

docker volume inspect juming-nginx

所以docker容器内的卷 没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

如果指定了目录,docker volume ls 是查看不到的

6.4拓展

ro #readonly 只读 这个路径只能通过宿主机来操作 容器内部无法操作

rw #readwrite 可读可写

docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx

docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

 

7.DockerFile

7.1 初始DockerFile

7.1.1 home 新建 Docker-test-volume/Dockerfile

[root@localhost ~]# cd /
[root@localhost /]# cd home
[root@localhost home]# mkdir docker-test-volume
[root@localhost home]# cd docker-test-volume/
[root@localhost docker-test-volume]# touch Dockerfile

7.1.2 vim Dockerfile

编辑如下

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

7.1.3 docker build

docker build -f /home/docker-test-volume/Dockerfile -t pengpeng/centos:1.0 .

7.1.4  查看

docker images

docker run -it 7beb069f53c9 /bin/bash

docker inspect 7beb069f53c9

7.2 数据容器卷

容器之间的配置信息的传递 数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦持久化到了本地,本地的数据不会删除

多个mysql实现数据共享

docker run -d -p 3306: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

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

7.3DockerFile介绍

7.3.1 dockerfile是用来构建docker镜像的文件

步骤

(1)编写一个dockerfile文件

(2)docker build构建称为一个镜像

(3)docker run运行镜像

(4)docker push发布镜像(DockerHub、阿里云仓库)

7.3.2 DockerFile构建过程

(1)关键字(指令)必须大写

(2)执行从上到下顺序

(3)#表示注释

(5)每个指令都会创建提交一个新的镜像 并提交 

7.3.3 DockerFile常用指令

  FROM # 基础镜像,一切从这里开始构建
  MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令
  ADD                   # 步骤
  WORKDIR         # 镜像的工作目录
  VOLUME            # 挂载的目录
  EXPOSE            # 保留端口配置
  CMD                   # 指定这个容器启动的时候要运行的命令,可被替代。
  ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令
  ONBUILD           # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令
  COPY                 # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!

7.3.4 创建一个自己的centos

(1)home下创建 docker-test-centos/Dockerfile

   cd /

   cd home

   mkdir docker-test-centos

   vim Dockerfile

   

 (2)docker build

   docker build -t mycentos:0.1 .

7.3.5 CMD和ENTRYPOINT

 CMD                  #容器启动的时候要运行的命令 可被替代

 ENTRYPOINT   #容器启动的时候要运行的命令 可以追加

7.3.5.1 CMD

(1)home下新建docker-test-cmd/Dockerfile

 mkdir docker-test-cmd

(2)vim Dockerfile

(3)运行

docker build -t cmd-test:0.1 .

docker run cmd-test:0.1

7.3.5.2 ENTRYPOINT  

(1)home下新建docker-test-entrypoint/Dockerfile

mkdir docker-test-entrypoint

(2)vim docker-test-entrypoint

(3)测试

docker run entrypoint-test:0.1

 

docker run entrypoint-test:0.1 -l

7.4 发布自己的镜像

docker login

docker build -t pengpeng/mytomcat:0.1 .

docker tag 容器id pengpeng/mytomcat:1.0 

 

8.Docker网络

8.1 理解Docker 0

8.2 三个网络

docker run -d --name tomcat01 tomcat

ip addr

docker exec -it tomcat01 ip addr

再次启动一个tomcat02

docker run -d -P --name tomcat02 tomcat

ip addr

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

一个docker0桥接模式,使用的是veth-pair

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

veth-pair充当一个桥梁,连接各种虚拟网络设备

docker exec -it tomcat01 ip addr

docker exec -it tomcat02 ip addr

docker exec -it tomcat02 ping 172.17.0.2

docker中所有的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

8.3 -link

docker exec -it tomcat02 ping tomcat01

tomcat01和02无法ping通

docker run -d -P --name tomcat03 --link tomcat02 tomcat  #--link运行一个tomcat03

docker exec -it tomcat03 ping tomcat02 #tomcat03 ping tomcat02 可以ping通

docker inspect tomcat03

docker exec -it tomcat03 cat /etc/hosts

--link本质就是在hosts配置中添加映射

现在Docker已经不建议使用--link了

自定义网络不适用docker0

docker0不支持容器名连接访问

 

9.自定义网络

9.1 docker network

docker network

docker network ls

9.2 网络模式

bridge:桥接docker(默认,自己创建也是bridge模式)

none:不配置网络

host:和所主机共享网络

container:容器网络连通

9.3 测试

docker run -d -P --name tomcat01  tomcat

’等价于

docker run -d -P --name tomcat01 --net bridge tomcat

#docker0 特点:默认 域名不能访问

#自定义网络

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

docker network ls

docker network inspect mynet

启动俩个tomcat

docker run -d -P --name tomcat-net-01 --net mynet tomcat

docker run -d -P --name tomcat-net-02 --net mynet tomcat

docker network inspect mynet

在自定义网络下,服务可以互相ping通,不再使用-link

docker exec tomcat-net-02 ping tomcat-net-01

docker exec tomcat-net-01 ping tomcat-net-02

 

10 网络连通

启动俩个tomcat 使用默认的docker0

docker run -d -P --name tomcat01 tomcat

docker run -d -P --name tomcat02 tomcat

tomcat01 connect后 tomcat01 和 tomcat-01-net ping通了

docker network connect mynet tomcat01
docker exec tomcat-net-01 ping tomcat01

 

推荐阅读