docker入门
type
date
status
slug
summary
tags
password
category
icon
docker学习网站
Docker文档
菜鸟教程
Docker 资源 Docker 官方主页: https://www.docker.com
Docker 官方博客: https://blog.docker.com/
Docker 官方文档: https://docs.docker.com/
Docker Store: https://store.docker.com
Docker Cloud: https://cloud.docker.com
Docker Hub: https://hub.docker.com
Docker 的源代码仓库: https://github.com/moby/moby
Docker 发布版本历史: https://docs.docker.com/release-notes/
Docker 常见问题: https://docs.docker.com/engine/faq/
Docker 远端应用 API: https://docs.docker.com/develop/sdk/
Docker 国内镜像 阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
官方中国加速器:https://registry.docker-cn.com
ustc 的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
docker命令
docker基础命令
其他linux命令
设置镜像仓库
更新yum软件包索引
yum makecache fast
安装docker的包
daemon.json配置
配置镜像加速器
镜像命令
docker run 运行原理图
# 查看docker镜像
docker images REPOSITORY TAG IMAGE ID CREATED SIZE 镜像的仓库源 标签 镜像id 创建事件 大小 ----常见命令 -a/--all # 列出全部镜像
-q/--quiet # 只显示镜像id
# 删除镜像
# 下载拉去一个镜像
docker pull 镜像名[:tag]] 默认是最新版latest docker pull mysql:5.7 --下载mysql为5.7的版本
# 打包提交拉取
docker tag kafka-monitor:0.2 10.0.23.11:5000/kafka-monitor:0.2
docker push xxx.xxx.xxx.xxx:5000/kafka-monitor:0.1
docker pull xxx.xxx.xxx.xxx:5000/kafka-monitor:0.1 # 停止所有容器
docker ps |grep holiday |awk '{print $1}' |xargs -i docker stop {} # 提交一个镜像 docker commit 1a442630f4a9 test/javaweb:0.0 # 搜索镜像 docker search docker docker search mysql --filter=STARS=300 --搜索出镜像的关注 度大于3000的mysql镜像
容器命令
有了镜像才可以创建容器,下载centos镜像测试学习
docker pull centos --下载最新的centos
docker run [可选性] image -- 新建容器并启动
#参数说明 --name="Name" --容器名字,用来区分容器 --name name01 -d --后台方式运行 -it --使用交互方式运行,进入容器查看内容 -p(小) --指定容器的端口 (下图为端口暴露的概念) -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用) -p 容器端口 容器端口 -P(大) --随机端口
docker run -it centos /bin/bash -- 启动并进入容器,如下 docker ps --查看正在运行的容器 docker ps -a --查看正在运行的容器和运行过的全部容器 -n=? --显示最近?个创建的容器 n为数组 -q --只显示容器的编号 exit --从容器中退出
ctrl + p + q --容器不停止退出
docker rm 容器id --删除指定的容器,不能删除正在运行的容器,如要强制删除加 -f docker rm -f $(docker ps -aq) --删除所有容器
docker ps -a -q|xargs docker rm --删除所有容器
docker start 容器id --启动容器
docker restart 容器id --重启容器
docker stop 容器id --停止当前正在运行的容器
docker skill 容器id --强制停止当前容器
常见其他命令
# 查看日志 docker logs 2f2de065fd05 docker logs -ft --tail 10 87dbfcbd76e7 --查看镜像指定条数日志 # 查看容器的进程信息 docker top 容器id UID(用户id) PID(父级id) PPID C STIME TTY TIME CMD root 4117 4096 0 13:07 pts/0 00:00:00 /bin/bash # 查看容器的信息 docker inspect 87dbfcbd76e7 # 进入正在运行的容器 方式一:docker exec -it 容器id /bin/bash --进入正在运行的容器,开启一个新的终端 方式二:docker attach 容器id --进入正在运行的容器,并非开启新的终端 # 查看容器内进程信息 ps -ef # 从容器内拷贝文件到主机上 docker cp 87dbfcbd76e7:/home/test.java /ysgtest/ --从容器中的/home/讲将test.java文件拷贝到主机的ysgtest目录下
将docker容器设为自启动和取消容器自启动
- -restart参数= no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3 在容器非正常退出时重启容器,最多重启3次 always 在容器退出时总是重启容器 #开机自启 unless-stopped 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 # 一般推荐使用always参数 --restart=always 将正在运行的容器设为自启动 # docker update --restart=always 容器名或容器ID docker update --restart=always <CONTAINER ID> # 例如将tomcat设为自启动 docker update --restart=always tomcat 将自启动的容器取消自启动 # docker update --restart=no 容器名或容器ID docker update --restart=no <CONTAINER ID> # 例如取消tomcat的自启动 docker update --restart=no tomcat
安装常用软件
启动mysql
启动redis
安装nginx
安装tomcat
安装elasticsearch
安装rabbitmq
可视化
portainer(先用)
1,Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。 而且完全免费,基于容器化的安装方式,方便高效部署。 官方站点:https://www.portainer.io/ 官方安装说明:https://www.portainer.io/installation/ 2,安装 docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --privileged=true portainer/portainer 3,查看安装情况 curl localhost:9000
ip:9000查看如下,admin/yanwei0623
Rancher(CI/CD再有)
Docker镜像原理
镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容, 包括代码、运行时、库、环境变量和配置文件
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层件 系统加载起来,这样最终的文件系统会包含所有的底层文件和目录
Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs。对以一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
为什么Docker镜像要采用这种分层的结构
最大一个好处就是——共享资源
特点:
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下都叫“镜像层
commit 镜像
docker commit -m="提交的内容描述信息" -a="作者" 容器id 目标镜像名:[TAG] --容器id改动前的 docker commit -m="add webapp apps" -a="ysg" dedbbab60c88 tomcat02:1.0 --提交自己修改过的容器
深入docker
容器数据卷
什么是容器数据卷
数据卷就是数据(一个文件或者文件夹)。数据卷是特殊的目录,可以绕过联合文件系统,为一个或多个容器提供访问。
数据卷设计的目的是数据的永久化,是完全独立于容器的生命周期,不会在容器删除时删除其挂载的数据卷,也不会存在类似垃圾收集机制,对容器引用的数据卷进行处理。
容器数据卷的特征:
1.数据卷在容器服务启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
2.数据卷可以在容器之间共享和重用,数据卷是宿主机中的一个目录,与容器生命周期隔离。
3.可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作。
4.对数据卷的更新不会影响镜像的更新,数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
5.数据卷会一直存在,即使挂载数据卷的容器已经被删除。
使用数据卷
docker run -it -v 主机目录:容器内目录 docker run -it -v /home/ceshi:/ysgtest contos /bin/bash --contos或者容器id
docker inspect 容器id --容器id 为docker ps 的CONTAINER ID
数据同步是双向的,即使容器关闭了也可以同步
安装mysql并同步数据
mysql数据持久化
新建test数据框,即使数据删除,本地的数据库依旧存在。
具名和匿名挂载
# 匿名挂载 -v 容器内路径 # 查看所有卷volums的情况 docker volume ls # 具名挂载(常用) -v 卷名:容器内路径 [root@localhost test]# docker volume ls DRIVER VOLUME NAME local portainer_data #如何区分具名、匿名和指定路径挂载 -v 容器内路径 --匿名挂载 -v 卷名:容器内路径 --具名挂载 -v /宿主机路径:容器内路径 --指定路径挂载 #权限操作 ro rw 改变读写权限 ro readonly #只读(只能通过宿主机来操作,容器内是无法操作的) rw readwrite #可读可写 #一旦设置容器的权限,容器对我门挂载出来的内容就有权限了 docker run -it -v /ysgtest contos /bin/bash --匿名 docker run -it -v ceshi:/ysgtest:ro contos /bin/bash --具名 docker run -it -v /home/ceshi:/ysgtest:rw contos /bin/bash --指定路径 注意:所有的docker容器内的卷,没有指定目录的情况下,都在/var/lib/daocker/volumes/XXXXX
像打包到本地或者上传
下载 docker save -o 镜像包名 镜像:版本 或者 docker save 镜像:版本 > 镜像包名 docker save contos > contos.tar 上传 docker load -i 镜像包名.tar 或者 docker load < 镜像包名 docker load contos < contos.tar
DockerFile
初始Dockerfile
Dockerfile就是用来构建docker镜像的构建文件,命令脚本,通过这个脚本可以生成镜像, 镜像是一层一层的,脚本一个个的命令,每个命令都是一层
#创建一个dockerfile文件,名字随机,建议用Dockerfile,文件中命令如下:
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----------end-----------"
CMD /bin/bash
#这里的每个命令,就是镜像的一层
#执行下面命令:
docker build -f /home/docker-test-volume/dockerfile01 -t ysg/centos[:1.0] .
注意:[]中标识可以去掉
VOLUME ["volume01","volume02"] 对应下面的挂载卷路径
数据卷容器
1,容器间的数据同步、共享
命令为:--volume-from
Docker网络
查看容器内ip地址
# linux可以用ping通docker容器内部 # ip addr 查看ip地址 docker exec -it tomcat01 ip addr docker启动容器时,会分配一个ip地址:eth0@if5。 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host loping valid_lft forever preferred_lft forever 4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # linux可以ping通docker容器内部:ping 172.17.0.2 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.352 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.072 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.069 ms 64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.076 ms 64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.059 ms
原理
每次启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker, 就会有一个网卡docker0 桥接模式,使用的技术就是evth-pair技术 evth-pair:
1,容器的网卡都是一对一对的,
2,evth-pair就是一对虚拟设备接口,他们都是成对出现的,一端链接协议,一端彼此相连
3,这个特性充当一个桥梁,连接各种网络设备。
docker exec -it tomcat01 ping 172.17.0.2 docker exec -it tomcat01 ping 172.17.0.3 --tomcat01,tomcat02可以互相ping通 结论: tomcat01和tomcat02是用的一个公用的路由器:docker0. 所有的容器不指定网络的情况下,都是docker0路由的, docker会给我们的容器分配一个默认的可用的ip
Docker中的所有网络接口都是虚拟的,因为虚拟的转发效率高。只要容器删除了,对应的网桥一对就没有了。
- -link
通过--link可以用服务名来ping通 --但是反向不能ping通 docker run -d -P --name tomcat03 --link tomcat02 tomcat [root@localhost ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.203 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.159 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.082 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.081 ms
查看全部容器网络
docker network ls --查看所有的docker网络 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE bdb55d2518b4 bridge bridge local f4a0513942e3 host host local
本质:--link即使在我们的hosts文件中配置了一个172.14.0.3 tomcat02 265c52867458
注意:实际中不建议--link,使用自定义网络。因为docker0不支持容器名连接访问(每次重启时,docker分配的ip会变动,但是docker0用--link比较麻烦)
自定义网络/容器互联
网络模式
bridge : 桥接(默认) none : 不配置网络 host : 和宿主机共享网络 # 我们启动的命令--net bridge就是docker0 docker run -d -P tomcat01 tomcat docker run -d -P tomcat01 --net bridge tomcat 与上一样
自定义网络命令
docker network create --driver bridge #设置为桥接模式 --subnet 192.168.0.0/16 #可以创建6553个 范围为(192.168.0.2~192.168.225.225) --gateway 192.168.0.1 #默认第一个为网关 mynet #名称
查看全部网络列表
[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 36c3449c1c4f bridge bridge local f4a0513942e3 host host local f3a6dfba295f mynet bridge local ea6d8079b28d none null local
查看自己网络详情
[root@localhost ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "f3a6dfba295fe5f1e2d8712a3d9eaf16cf0c8c8d6ca53ac6861c72c415047786", "Created": "2021-04-14T22:55:57.050404657+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]
容器到自定义网络
docker run -d -P --name tomcat-new-01 --net mynet tomcat docker run -d -P --name tomcat-new-02 --net mynet tomcat #查看自己网络
网络连通
不同网段的tomcat01与mynet打通
打通后,将tomcat01放到mynet网络下了,只有与mynet连通的才可以ping通 一个容器两个ip地址 docker network connect mynet tomcat01