Docker
概述?:
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
步骤:开发、部署、运维
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像
DockerContainer:容器就是镜像运行起来提供服务器
镜像
镜像是什么❓
镜像是一种轻量级的、可执行的独立的软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
如何得到镜像❓
1、从远程仓库下载 2、来自他人 3、自己制作一个docker镜像
Docker镜像加载原理
UnionFS(联合文件系统)
下载镜像的时候看到的一层层的就是这个!
UnionFS(联合文件系统):UnionFS是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统层是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker镜像加载原理
Docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统UnionFS。
参考文章地址:
docker镜像原理_yanyf的博客-CSDN博客_docker 镜像原理
Docker分层原理
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。
参考文章地址:
Docker镜像详解(分层理解)_myjess的博客-CSDN博客_docker镜像分层原理
运行镜像说明
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
:查看运行容器状态
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来指定文件
构建dockerfile
- 编写dockerfile文件
- docker build 构建镜像文件
- docker run 运行镜像
- 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
查看挂载文件的位置
构建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网络命令(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
:指定网关地址
创建及使用步骤:
- 通过
docker network create
命令创建自定义网络 - 启动时指定网络模式
网络连通(Network Connect)
网络连通是指将某个网络中的容器连接到另一个指定的网络下,这个容器同时拥有了两个网络IP地址。
代码实现:
[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 ~]#
此时查看网络信息
打包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的步骤
- 编写
Dockerfile
文件 - 编写
docker-composer.yml
文件 - 启动服务
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-test
或docker service scale 服务名=副本数量
(推荐) - 移除服务:
docker service rm 服务名
Swarm总结:
swarm用于集群的管理和编排。docker可以初始化swarm集群,其他节点可以加入(管理节点、工作节点)
节点工作:
服务、任务和容器:
- available:可获得的,可找到的
- replicas:复制品、副本
Docker Stack
与docker-compose 相识,不同的时docekr stack用于集群部署
Docker Secret
证书,安全、配置密码
Docker Config
参考文献
Docker常见单词
- volume :[ˈvɑːljuːm] n.体积;容积;容量;量;额;音量;响度
- inspect: [ɪnˈspekt] v.检查,查看,审视,视察
- command:命令,指令,控制,统治
- **repository:**仓库,存储库
- daemon:守护进程
- **attach:**贴上 (进入运行中容器的一种方式)
- gateway:网关
Start: March 31, 2021 End: April 6, 2021
Q.E.D.