Docker基础学习
Docker概述
Docker为什么出现?
问题:①我在我的电脑上是可以运行的!②版本更新,导致服务器无法使用!
环境配置是十分麻烦的,每一台机器都要部署环境,费时费力。
传统:开发jar,运维来部署
现在:开发打包部署上线,一套流程做完。
Docker给出了解决方案
隔离:Docker的核心思想,打包装箱,每个箱子相互隔离。
Docker通过隔离机制,可以将服务器利用到极致
Docker历史
Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。
2014年4月9日,Docker1.0发布。
在Docker容器技术之前,都是虚拟机技术
虚拟机:属于虚拟化技术,在Windows中装一个VMWare,通过这个软件可以虚拟出一台甚至多台电脑!笨重!
Docker容器技术,也是一种虚拟化技术,轻巧。
官网:Empowering App Development for Developers | Docker
文档:Docker Documentation | Docker Documentation
仓库地址:Docker Hub
Docker能干嘛
虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
-
传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
-
Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
-
每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运用
更快捷的升级和扩缩容
使用Docker后部署应用像搭积木一样!
项目打包为一个镜像,通过水平扩展
更简单的系统运维
在容器化后,开发测试环境高度一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,将服务器性能压榨到极致
Docker安装
Docker的基本组成
镜像(Image):
docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像-》run-》tomcat01容器
通过这个镜像可以创建多个容器,最终服务运行或项目运行就是在容器中
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建
基本命令:启动,停止,删除等
仓库(repository):
存放镜像的地方,分为公有,私有
DockerHub(默认为国外的)
阿里云(配置镜像加速)
安装Docker
环境准备
CentOS 7、Xshell连接远程服务器进行操作
环境查看
#系统内核是3.10以上的
uname -r
3.10.0-1160.36.2.el7.x86_64
#系统版本
# 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、卸载旧版本
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
#3、设置镜像的仓库(二选一)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo#默认国外的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#阿里云(推荐)
#更新软件包索引
yum makecache fast
#4、安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io
#一路y下去
#5、启动docker
systemctl start docker
#6、docker version查看是否安装成功
#7、使用hello-world测试
docker run hello-world
#8、查看下载的镜像
docker images
#9、卸载docker
yum remove docker-ce docker-ce-cli containerd.io #删除依赖
rm -rf /var/lib/docker #删除资源
rm -rf /var/lib/containerd
阿里云镜像加速
1、登录阿里云找到容器服务
2、找到镜像加速地址
3、配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g8h9tnqk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾HelloWorld流程
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
1、Docker有着比VM更少的抽象层
2、Docker利用的是宿主机的内核,vm需要的是Guest OS。
docker不需要像虚拟机一样重新加载一个操作系统内核。
Docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档地址:Reference documentation | Docker Documentation
镜像命令
docker images :查看所有本地主机上的镜像
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的ID
docker search:搜索镜像
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11526 [OK]
mariadb MariaDB Server is a high performing open sou… 4373 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 851 [OK]
percona Percona Server is a fork of the MySQL relati… 558 [OK]
#可选项
-f, --filter
eg:--filter=STARS=3000:搜索3000星以上的
doucker pull:下载镜像
docker pull 镜像名[:tag]
docker rmi:删除镜像
docker rmi-f 镜像ID #删除指定镜像
docker rmi-f 镜像ID 镜像ID 镜像ID... #删除多个镜像
docker rmi-f ${docker images -aq} #删除全部镜像
容器命令
新建容器并启动
docker run {可选参数} image
# 参数说明
--name="name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
#测试,启动并进入容器
docker run -it centos /bin/bash
列出所有运行中的容器
docker ps
#参数
#列出所有正在运行的容器
-a #列出所有正在运行的容器,带出历史运行过的容器
-n=? #显示最近创建的n个容器
-q #只显示容器的编号
退出容器
exit #直接容器停止并退出
ctrl + P + Q #容器不停止并退出
删除容器
docker rm 容器ID #删除指定容器
docker rm -f #{docker ps -aq} #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#参数
-f 强制删除
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
常用其它命令
后台启动容器
#命令 docker run -d 镜像名
docker run -d centos
#问题:docker ps发现centos被停止了
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs
-tf #显示日志
--tail n #显示n条日志
查看容器中的进程信息
docker top 容器ID
查看镜像的元数据
docker inspect 容器ID
进入当前正在运行的容器
#方式一 进入容器后开启一个新的终端,可在里面操作
docker exec -it 容器ID bashShell
#方式二 进入容器正在执行的终端,不会启动新的进程
docker attach 容器ID
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
可视化
- portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true potainer/potainer
- Rancher(CI/CD)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板!
Docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,方便扩展和部署。
如何得到镜像:
- 从远程仓库下载
- 拷贝
- 自己制作镜像DockerFile
Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
Commit镜像
docker commit #提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
容器数据卷
什么是容器数据卷
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!就是卷技术!
实现容器的持久化与同步操作。
使用容器数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
docker run -it -v /home/ceshi:/home centos /bin/bash
具名挂载和匿名挂载
#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有卷的情况
docker volune ls
#具名挂载
docker run -d -P --name nginx02 -v xxxxxx:etc/nginx nginx
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
#通过 -v 容器内路径:ro/rw 改变读写路径
ro:只读
re:可读可写
docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:ro nginx
docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:rw nginx
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
方式二:
dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
构建镜像
docker build -f /home/docker-test/dockerfile1 -t xxx/centos:1.0 .
数据卷容器
可以使两个mysql甚至多个mysql同步数据
--volumes-from
#例子
docker run -it --name docker02 --volumes-from docker01 xxx/centos:1.0
多个mysql实现数据共享
#启动mysql01
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v
/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXX --name mysql01 mysql:5.7
#启动mysql02
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=XXXX --name mysql02 --volumes-from mysql01 mysql:5.7
容器的生命周期一直持续到没有容器使用为止。
持续化到了本地,本地数据不会被删除。
DockerFile
DockerFile介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都必须大写
2、指令从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件
DockerFile指令
FROM #基础镜像,一切从这开始构建
MAINTAINER #镜像作者,一般姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容
WORKDIR #镜像的工作目录 /bin/bash等
VOLUME #挂载的目录位置
EXPOSE #指定暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,会被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承的DockerFile时,会运行该指令,触发指令。
COPY #将文件拷贝到镜像中
ENV #构建的时候设置环境变量
发布自己的镜像
发布到DockerHub
地址:Docker Hub
1、在官网注册账号并在服务器上登录
#登录
docker login
-p --password
-u --username
2、在服务器上提交自己的镜像
#打tag
docker tag 镜像id 辨识名/镜像名:[标签]
#上传
docker push 辨识名/镜像名:[标签]
发布到阿里云镜像上
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览其中信息,根据指示上传
Docker网络
理解Docker0网络
清空所有环境
查看网络地址
ip addr
三个网络
#创建一个容器并查看内部网络地址
#docker run -d -P --name [新建容器名] [镜像名] 创建容器
#docker exec -it [镜像名/ID] ip addr 查看网络地址
10: eth0@if11: <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
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# Linux 能 ping 通容器内部
ping 172.17.0.2
#结果:
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.382 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.120 ms
原理:
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,并有一个网卡docker0,桥接模式,使用的技术是 veth-pair 技术!
2、再启动一个容器会再多一对网卡
#evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段连着彼此
#正因为该特性,veth-pair用来充当一个桥梁,连接各种虚拟网络设备
#OpenStac,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术
3、测试tomcat01与tomcat02之间ping,可以ping通
容器之间是可以互相ping通的!
–link
解决项目不重启但ip更换了无法连通的问题,使可以通过明在来访问容器。
目前使用Docker时,不建议使用–link
#docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
#如果出现报错:OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
#表示容器内没有这个命令,需要先安装
#docker exec -it tomcat02 /bin/bash
#apt-get update 更新
#apt install net-tools 安装相关工具
#apt -y install iputils-ping 安装ping命令
#通过--link可以解决无法ping通的问题
#docker run -d -P --name tomcat03 --link tomcat02 tomcat
#docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.2): icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=3 ttl=64 time=0.079 ms
#若p2 ping p3则无法ping通
本质:–link 就是再hosts配置中增加一个tomcat02的映射
自定义网络
查看所有docker网络
网络模式
bridge:桥接 docker(默认,常用)
none:不配置网络
host:和宿主机共享网络
container:容器内网络联通!(用得少!局限大!)
#我们直接启动时也有默认参数 --net bridge ,就是我们的docker0
docker run -d -P --name tomcat01 --net bridge tomcat
#docker0特点,默认,域名不能访问,通过--link可以打通
#自定义网络
[root@iZbp1hwila2m3ijtql6hikZ /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
4735d093a9c777ca7490aaf94cfa71e2252a009395fa4b1286c1ddcc3632e623
[root@iZbp1hwila2m3ijtql6hikZ /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fa37657c6867 bridge bridge local
ffdfa5e65f23 host host local
4735d093a9c7 mynet bridge local #创建出来的网络
aadc5938d23b none null local
#创建自定义网络中的容器
docker run -d -P --name tomcat01 --net mynet tomcat
#且不使用--link,互相之间也可以ping通
好处:
不同集群可以使用不同网络,可以保证集群的安全与健康
网络连通
docker network connect [选项] [网络名] [容器名]