Docker


概述?:

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

步骤:开发、部署、运维

DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像
DockerContainer:容器就是镜像运行起来提供服务器

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/6281f95028548629391efd696296c68e.jpeg

镜像


镜像是什么❓

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

如何得到镜像❓

1、从远程仓库下载 2、来自他人 3、自己制作一个docker镜像

Docker镜像加载原理


UnionFS(联合文件系统)

下载镜像的时候看到的一层层的就是这个!

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

Docker镜像加载原理

Docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统UnionFS。

参考文章地址:

docker镜像原理_yanyf的博客-CSDN博客_docker 镜像原理

Docker分层原理

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。

参考文章地址:

Docker镜像详解(分层理解)_myjess的博客-CSDN博客_docker镜像分层原理

运行镜像说明

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled.png

Docker命令


启动关闭:

  • sudo systemctl start docker :启动doncker服务
  • sudo systemctl stop docker :关闭doncker服务

帮助命令:

  • docker 命令 —help :查看帮助信息
  • docker info :查看docker系统信息
  • docker version :查看docker版本信息
  • docker查看所有docker的所有命令 ?

管理命令:

镜像命令:

  • docker images :查看本地镜像;
  • docker search :搜索镜像;
  • docker pull 镜像名 [:version] : 下载镜像;
  • docker rmi -f 镜像id/镜像名 : 删除镜像 ,多个用空格分隔,建议通过id删除;
  • docker rmi -f $(docker images -aq) : 删除所有镜像 ;
  • docker history :查看镜像是如何构建(构建结构)

容器命令:

Docker运行容器是以Docker run 命令开头来运行的。

给容器命名的时候不能有重复的,否则不能正常运行

如果容器需要暴露多个端口 -p 宿主机:容器 -p 宿主机:容器 .... 用-p配置多组

如果以容器名的方式运行需要指定版本(:tag)否则回去pull最新的版本执行

  • 启动容器 :docker run [可选参数] image
docker run [可选参数] image

#参数说明
--name="Name" 容器名字
-d  后台运行方式
-it 使用交互方式运行,进入容器查看内容 
-p  指定容器的端口 -p 8080:8080
		-p ip:主机端口:容器端口
		-p 主机端口:容器端口(常用)
		-p 容器端口

#测试,启动并进入容器
[root@iZf0railv34ewtZ /]# docker run -it 300e315adb2f /bin/bash
[root@42b692e65f49 /]# ls   #此时运行的是容器内的centos
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
#从容器返回主机
[root@42b692e65f49 /]# exit
exit
  • exit:在容器内运行,退出容器并停止
  • ctrl +p +q :退出容器,容器在后台运行
  • docker ps:查看正在运行的容器
  • docker start 容器id :运行容器
  • docker restart 容器id :重启容器
  • docker stop 容器id :停止运行容器
  • docker kill 容器id :强制停止容器
  • docker logs [-t] [-f]:查看日志
  • docker top 容器id :查看容器中进程信息;
  • docker inspect 容器id :查看镜像元数据
  • docker stats:查看docker状态
  • docker network ls 查看docker网络
  • docker network inspect 查看指定网络信息
  • docker stop $(docker ps -aq):停止所有正在运行的容器

进入正在运行的容器:

  • docker exec -it 容器it /bin/bash :进入容器后开启一个新的终端
  • docker attach 容器id :进入容器正在执行的终端

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

  • docker cp 容器id:文件在容器中的路径 目的主机的路径:将容器中的文件移动到主机上

查看正在运行容器的状态

  • docker stats :查看运行容器状态

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%201.png

Commit镜像

  • docker commit -m="描述信息"-a="author" 容器id 目标镜像名:tag 提交容器成为一个新的副本。
[root@iZf0railv34ewtZ run]# docker commit -a="ikart" -m="add webapps" 3eb521a43c48 tomcat03:1.0
sha256:de24ad6f63efc4e2d8c272825c49bb60478544ab27ba3900d03b05b17eaab433
[root@iZf0railv34ewtZ run]#

容器数据卷


什么是容器卷❓

容器之间有一个数据共享的技术,Docker容器中产生数据,同步到本地,这就是卷技术。目录的挂载,将我们容器内的目录,挂到Linux上面(即宿主机)。总结一句话:容器的持久化和同步操作,容器间数据也是可以共享的!

使用数据卷?

方式一使用命令挂载 -v

如果mysql添加端口后启动容器报错,重启Docker(试了一个小时,枯了?)/c

  • docker run -v 宿主机目录:容器内目录 :将容器中的数据同步到宿主机中
docker run --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -it -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql mysql:5.7

具名挂载和匿名挂载


匿名挂载或者只设置了卷名的挂载文件在/var/lib/docker/volume/** ?

什么是具名挂载❓

具名挂载就是:在-v 宿主机路径/卷名:容器内路径

什么是匿名挂载❓(不推荐使用)

匿名挂载就是:在- v 只写了容器内的路径,没有写容器外的路径

拓展?

  • v 容器内路径后添加 :ro:rw 来限定权限,:ro(read only)表示容器内是只读的权限,只能通过宿主机修改;:rw(read write) 表示容器内可读可写的权限
docker run -it -v /home/nginx:/etc/nginx/***:rw** mysql:5.7

DockerFile


DockerFile就是用来构建docker镜像的构件文件(命令脚本)。
通过这个可以脚本文件可以生成镜像,镜像是一层一层的,脚本中的一条条命令,每条命令都代表一层镜像

建议构建文件名为Dockerfile(官方命名),在build的时候自动寻找,就不用-f来指定文件

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%202.png

构建dockerfile

  1. 编写dockerfile文件
  2. docker build 构建镜像文件
  3. docker run 运行镜像
  4. docker push 发布镜像到DockerHub或阿里云

dockerfile的指令(常用)

  • FROM:基础镜像,一切从这里开始构建
  • **MAINTAINER**:镜像作者信息,姓名+邮箱
  • **RUN**:构建镜像的时候需要运行的命令
  • **ADD**:添加内容;例如:tomcat镜像,这个comcat压缩包,添加内容
  • **WORKDIR**:镜像的工作目录
  • **VOLUME**:挂载的目录
  • **EXPOSE**:暴露端口配置
  • **CMD**:指定这个容器启动的时候要运行的命令,只有最后一行会生效,可被替换
  • **ENTRYPOINT**:指定这个容器启动的时候要运行的命令,可以追加命令
  • **ONBUILD**:触发指令。当构建一个继承Dockerfile镜像的时候,就会运行ONBUILD的指令
  • COPY:类似于ADD,将文件复制到镜像中
  • **ENV**:构架镜像的环境变量

查看构建结构:docker history

dockerfile文件:指令大写

#每个命令都是镜像的一层
FROM centos #拉取centos
VOLUME ["volume01","volume02"] #匿名挂载
CMD echo "-----end------" 
CMD /bin/bash

查看挂载文件的位置

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%203.png

构建dockerfile

语法格式:docker build -f file -t tag .


[root@iZf0railv34ewtZ docker_test]# docker build -f dockerfile -t ikart/centos .
Sending build context to Docker daemon  14.85kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 68db888f226f
Removing intermediate container 68db888f226f
 ---> 296a89e6cf97
Step 3/4 : CMD echo "-----end------"
 ---> Running in 6da731a6591d
Removing intermediate container 6da731a6591d
 ---> e7c8f5b9e0bc
Step 4/4 : CMD /bin/bash
 ---> Running in 8246ae304c1c
Removing intermediate container 8246ae304c1c
 ---> 16c01d4fd107
Successfully built 16c01d4fd107
Successfully tagged ikart/centos:latest
[root@iZf0railv34ewtZ docker_test]#

参数说明:

  • -f :(file)文件所在位置
  • -t:(tag)我们生成目标镜像的名字
  • .:表示当前目录

数据卷容器


数据卷容器:共享同步多个容器间的数据

语法格式:docker run -d --name docker02 --volumes-from 父容器 要运行的容器ID/Name

#创建父容器
[root@iZf0railv34ewtZ docker_test]# docker run -d --name docker01 16c01d4fd107
3708265f60600eaa16c5f87c998259c91f3de342fbb251109a30b299165de037

#绑定父容器,共享数据
[root@iZf0railv34ewtZ docker_test]# docker run -d --name docker02 --volumes-from docker01 16c01d4fd107
6de1fc3efd3226c54b85e9edcafc1afbbd007d4934ebfc5c8f878943ed775f20

[root@iZf0railv34ewtZ docker_test]# docker run -d --name docker03 --volumes-from docker01 16c01d4fd107
d93098eaa93f8bc4b65d7dab2c3adc41d53cc2850934d527b08901ee28f97e0e
[root@iZf0railv34ewtZ docker_test]#

结论:

容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器为止,但是你持久到了本地,即使删除容器数据也会在本地保存

发布镜像


登录:docker login -u -p

[root@VM-0-10-centos ~]# docker login -u imokay
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

登录腾讯云:sudo docker login --username=100018420866 ccr.ccs.tencentyun.com

Docker网络(Network命令)


Docker网络知识

veth-pari:

充当一个桥梁,连接各种虚拟网络设备。是一对虚拟接口设备,它们都是成对出现,一段连着协议,一段彼此相连。

Docker0(路由器)

特点:启动Docker容器的默认方式。域名不能访问

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%204.png

Docker网络命令(Network):

  • docker exec -it 容器 ip addr :查看容器的IP信息
  • docker exec -it 容器 ping :在容器中ping某个IP地址

自定义网络(Network Create)

网络模式:

  • bridge:桥接模式(docker默认)
  • none:不配置网络
  • host:和宿主机共享网络
  • container:容器网络连通(用的少)

指定网络模式:

默认启动方式 docker run - -net bridge 容器 只是我们通常省略了- -net bridge

通过- -net 网络模式 来指定网络模式。

创建自定义网络:

详细过程在Docker网络代码

#通过docker network create命令创建自定义网络
[root@VM-0-10-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
41c7dfcca8f97f44d083efe5d7fae7055a5031cc7f56bde30f174c2fe2598944
#查看网络模式列表 ,可以找到自定义的mynet网络模式
[root@VM-0-10-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
1fda20b497e9   bridge    bridge    local
52d322258c89   host      host      local
41c7dfcca8f9   mynet     bridge    local
90f5e701cf20   none      null      local

参数说明:

  • driver :指定网络模式
  • subnet :指定子网范围
  • gateway :指定网关地址

创建及使用步骤:

  1. 通过docker network create命令创建自定义网络
  2. 启动时指定网络模式

网络连通(Network Connect)

网络连通是指将某个网络中的容器连接到另一个指定的网络下,这个容器同时拥有了两个网络IP地址。

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%205.png

代码实现:

[root@iZf0railv34ewtZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS      NAMES
9b7c47ee5d5e   tomcat    "catalina.sh run"   21 minutes ago   Up 21 minutes   8080/tcp   tomcat02
bcf7e5bfb321   tomcat    "catalina.sh run"   22 minutes ago   Up 22 minutes   8080/tcp   tomcat01

#创建一个不在mynet的网关下的容器
[root@iZf0railv34ewtZ ~]# docker run -d -P --name tomcat-default tomcat
f69f0f716f1cb1d94fd59e6b45002b478bb8098e409128a01562e1b4f8edda49
[root@iZf0railv34ewtZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                     NAMES
f69f0f716f1c   tomcat    "catalina.sh run"   4 seconds ago    Up 3 seconds    0.0.0.0:49153->8080/tcp   tomcat-default
9b7c47ee5d5e   tomcat    "catalina.sh run"   23 minutes ago   Up 23 minutes   8080/tcp                  tomcat02
bcf7e5bfb321   tomcat    "catalina.sh run"   23 minutes ago   Up 23 minutes   8080/tcp                  tomcat01

#没加入网络之前ping,网络未能连通
[root@iZf0railv34ewtZ ~]# docker exec -it tomcat01 ping tomcat-default 
ping: tomcat-default: Name or service not known

#加入网络
[root@iZf0railv34ewtZ ~]# docker network connect mynet tomcat-default

#没加入网络后ping,网络连通
[root@iZf0railv34ewtZ ~]# docker exec -it tomcat01 ping tomcat-default 
PING tomcat-default (192.168.0.4) 56(84) bytes of data.
64 bytes from tomcat-default.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.133 ms
64 bytes from tomcat-default.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.135 ms
64 bytes from tomcat-default.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.105 ms
read escape sequence
[root@iZf0railv34ewtZ ~]#

此时查看网络信息

Docker%207af9da87b3e94ce39b5ee9cd63318bb3/Untitled%206.png

打包java jar项目

代码实现查看Docker网络代码

  • 编写Dockerfile文件
  • 将java打成jar包
  • 上传Dockerfile和jar包到服务器
  • 使用Docker构建镜像

卸载Docker

第一步:卸载Docker

yum remove docker-ce docker-ce-cli containerd.io

第二步:删除配置文件

rm -rf /var/lib/docker rm -rf /var/lib/containerd

Docker高级

Docker Compose

定义、运行多个容器,yaml格式的配置文件,对容器进行批量编排。
Compose是Docker官方的开源项目,需要安装。单机部署多个项目

Dockerfile 让程序在任何地方运行

Compose的重要概念

  • 服务(service):容器、应用
  • 项目(project):一组关联的容器

Composer的步骤

  1. 编写Dockerfile文件
  2. 编写docker-composer.yml文件
  3. 启动服务docker-compose up

Compose命令

如果第一次没能正常启动,重新构建后重试

  • 启动:docker-compose up
  • 关闭:
    • 强制停止:docker-compose down
    • 停止:docker-compose stop
  • 重新构建:docker-compose up --build

Swarm


Raft协议:保证大多数节点存活才可以使用,集群主节点应在三个以上,至少1台管理节点存活,保证服务的可用性。

Swarm命令

[root@iZbp1g2g2zubvtsxtk7s0qZ /]# docker swarm 

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm
  • 初始化节点(生成主节点):docker swarm init
    • 加入身份:manager、worker
  • 生成管理节点令牌:docker swarm join-token manager
  • 生成工作节点令牌:docker swarm join-token worker
  • 加入节点:docker swarm join
  • 退出节点:docker swarm leave
  • 查看节点信息:docker node ls
  • 查看集群状态信息:docker info

Swarm集群弹性创建服务


docker run 与 docker service 的区别:run 是容器启动,不具有扩缩容。service 是服务,具有扩缩容器,滚动更新。

发现:但我们在集群后,工作节点即使停止容器(来自主节点的服务副本)也会即时再次启动

Service命令

docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services #动态扩缩容
  update      Update a service #更新服务,更新副本数
  • 创建一个服务:docker service create -p 9999:80 --name my-nginx nginx
  • 查看服务进程:docker service ps 服务名
  • 创建副本:docker service update --replicas 10 my-nginx-testdocker service scale 服务名=副本数量 (推荐)
  • 移除服务:docker service rm 服务名

Swarm总结:

swarm用于集群的管理和编排。docker可以初始化swarm集群,其他节点可以加入(管理节点、工作节点)

节点工作:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e9694c0d-7bce-429e-a1b5-6d25c536bd87/Untitled.png

服务、任务和容器:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1ba501fe-b450-4da5-9e5f-48539263003e/Untitled.png

  • available:可获得的,可找到的
  • replicas:复制品、副本

Docker Stack

与docker-compose 相识,不同的时docekr stack用于集群部署

Docker Secret

证书,安全、配置密码

Docker Config

参考文献


Docker overview

Docker常见单词


  • volume :[ˈvɑːljuːm] n.体积;容积;容量;量;额;音量;响度
  • inspect: [ɪnˈspekt] v.检查,查看,审视,视察
  • command:命令,指令,控制,统治
  • **repository:**仓库,存储库
  • daemon:守护进程
  • **attach:**贴上 (进入运行中容器的一种方式)
  • gateway:网关

代码解析

Docker网络代码

ikart

Start: March 31, 2021 End: April 6, 2021

Docker命令汇总

Q.E.D.


在等花开,等春天来.