Docker 概述
官网:https://www.docker.com/
文档:https://docs.docker.com/ 文档超级详细
docker github:https://hub.docker.com/ 可以git push git pull 一些自己的镜像
Docker镜像。基于Go语言开发,(运行+环境).来源于集装箱的思想。Docker 的核心思想是隔离。而且Docker可以将服务器利用到极致。
Docker的历史:
2010年dotCloud公司做的。2013年开源。2014年发行Docker1.0版本。
Docker 和Vmware区别:
Docker(几M) 相比vmware (几G)小巧。 都属于虚拟化技术。
虚拟机相当于kernel+lib+app 相当笨重麻烦。步骤复杂。操作系统+软件。
Docker 不是一个完整的操作系统。一个容器崩了,不影响其他的。 容器是运行在宿主上,没有内核。没有虚拟硬件。
DevOps(developer+运维)
Docker 是内核级别的虚拟化。可以在一台物理机上运行很多docker,服务器性能被压榨到极致。
Docker 安装
Docker 的基本组成:
镜像(image):docker镜像好比一个模版,可以通过这个创建容器。例如tomcat 服务,—>run—>tomcat01容器,提供服务。最终项目运行就是在容器中的。
容器(container):独立运行一个或一组应用。通过镜像来创建。启动,停止,删除基本命令。
可以理解为简易的linux系统。
仓库(repository):存放镜像的地方。分为共有仓库和私有仓库。
安装:
参考官方文档进行对应系统进行安装:
https://docs.docker.com/get-docker/
1.卸载老的版本
2.需要的安装包
3.安装镜像仓库(找阿里云的镜像地址)
4.更新yum 软件包索引:yum makecache fast
5.安装docker 相关 ce 是社区版 ee 是企业版
6.启动docker:systemctl start docker
docker version 查看docker version 判断是否安装成功。
docker run hello-world 如果展现hello from Docker 说明运行成功。
通过docker images 可以查看现有本机镜像。
卸载的话,就是yum remove 依赖,删除目录。rm -fr /var/lib/docker 这是默认工作路径。
systemctl restart docker 重启docker
docker run 的运行原理:
执行docker run 首先判断本机是否有这个镜像,有则使用这个镜像,run,没有则去docker hub 上下载。如果找不到,返回错误。 如果找到就下载到本地。
Docker 工作原理:
docker 是一个client-server 结构。Docker 有一个守护进程,运行在主机上。通过Socket进行客户端访问。
DockerServer 接收Docker-client的命令,就会执行这条命令。
Docker 常用命令:
在帮助文档中查看docker 的命令:https://docs.docker.com/reference/
docker version 显示版本信息
docker info 查看docker 系统信息包含镜像和容器数量
docker —help 帮助命令。万能命令。
镜像命令:
docker images 查看本地所有的镜像,也可以通过docker images —help
REPOSITY 镜像的仓库源
TAG 镜像标签
IMAGE ID 这是镜像的id
CREATE 镜像创建时间
SIZE 镜像大小
--all , -a 列出所有的镜像
--quiet , -q 只显示镜像的id
docker search <name>搜索镜像
docker search mysql —filter=STARS=3000 搜索出来收藏大于3000的
docker pull <name>下载镜像默认拉取最新的。 会进行分层下载。
docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
docker pull mysql:5.7 下载指定版本。
docker rmi -f id 删除指定镜像(remove image)。也可以通过空格删除多个。
docker rmi -f $(docker images -aq) 删除所有的
容器命令:
用docker pull centos 来学习,下载一个centos 的镜像
通过docker run 命令来启动。 也可以通过docer run —help 来查看帮助文档。
--name 起名字tomcat01 tomcat02
-d 后台启动
-i t 使用交互方式进入查看容器。
-p 指定容器端口 -p 8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口。
docker run -it centos /bin/bash 这个就是启动了centos ,并进入容器。
ls centos 就是个小型的os。
exit 是退出。
docker ps 查看运行的容器。
docker ps -a 查看曾经运行过的容器+正在运行的容器。
-n=? 显示最近运行的n个容器。
docker ps -a -n=1 查看1个。
docker ps -aq
退出容器:
ctrl+p+q 容器不停止退出。
exit 容器停止退出。
删除容器:
docker rm -f <容器id>删除指定容器。 这里是强制删除
docker rm -f $(docker ps -aq) 删除所有的容器。
启动 和停止
docker start <容器id> 启动
docker restart <容器id>重启
docker stop <容器id> 停止
docker kill <容器id> 杀掉
后台启动:
docker run -d centos
执行docker ps 发现centos 停止了。如果centos 要后台运行,就必须有一个前台进程。 就会自动停止。
查看日志:
docker logs --help
docker run centos /bin/sh -c “while true; do echo sheik; sleep 1;done”
docker ps
docker logs -tf --tail 10 <容器id>
查看docker 内部的进程信息:
docker top <容器id>
显示容器的信息:
docker inspect <容器的id> 显示容器的所有信息
进入当前正在运行的容器:
dockter exec -it <容器id> /bin/bash 进入后,打开一个新的终端。
docker attach <容器id> 正在执行当前的代码。终端
容器内的数据拷贝到目的主机上:
docker cp <容器id>:/home/test.java /home/
docker run -it --rm tomcat:9.0
--rm 用来测试,用完即删除。
docker pull tomcat
docker run -d -p 3355:8080 tomcat
docker exec <id> /bin/bash
把webapps.disk 中的内容全部copy 到webapps 目录下,可以通过http://localhost:3355/ 进行访问。
可以通过docker stop <id> 进行停止。
通过docker stats 来查看cpu 的状态。
如果硬件太慢,可以通过-e ES_JAVA_OPTS=“-Xms64m -Xmx512m”
curl localhost:3355
Protainer 可视化面板。
分层的原理: 就是记录一次,如果有的,就不会进行下载(pull)相当于UnioFS。
image 镜像层是不会改变的。容器是在镜像层新加了一层。所有操作都在容器层。
commit 自己的镜像
docker commit
docker commit -m=“提交的描述信息” -a=“作者” 容器id 容器镜像名[TAG]
timdeMBP:~ tim$ docker commit -a="sheik" -m="add webapps" 3262514243b0 sheiktomcat:1.0
sha256:0c63aa5e6c0b6aa65bd882585e2fe723a3e6a8bea06a564534450a6f8a1f272b
timdeMBP:~ tim$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sheiktomcat 1.0 0c63aa5e6c0b 4 seconds ago 673MB. —比下面大了一些。
tomcat 9 266d1269bb29 9 days ago 668MB
tomcat latest 266d1269bb29 9 days ago 668MB
docker/getting-started latest 083d7564d904 2 months ago 28MB
容器数据卷:
将应用以及环境打包成一个镜像。数据不会放到容器中,要进行持久化。这里可以使用挂载技术,把数据保存在linux 或者本地中。也就是容器的同步和持久化技术,数据进行共享。
docker run -it -v
docker run -it -v /Users/Tim/test:/home centos /bin/bash 这个可以挂载多个。 一般用于配置文件修改等。
主机地址 容器内地址
通过dockter inspect 来查看是否挂在成功。 这样其实就可以 让容器和本地保持一个同步。
好处,就是在本地修改,会自动进行同步。即使删掉容器,本地数据也不会丢失。
查看所有卷的情况:docker volume ls
匿名卷 和具名卷:
如果没有指明 本地名,那么就是匿名卷。 如果有名字就是具名卷。
docker run -it -v /Users/Tim/test:/home centos /bin/bash 这就是匿名挂载
docker run -it -v centos:/home centos /bin/bash 这就是具名centos挂载(常用)
-v 容器内路径 匿名挂载
-v 名称:容器内路径。具名挂载
-v 宿主机路径:容器内路径。指定路径挂载
如果没有指定目录,可以通过docker inspect 来查看, 一般来讲都会存在var/lib/docker/volumes/ 路径下
还有 容器内路径的权限限定。ro 只读 rw读写
docker run -it -v /Users/Tim/test:/home:ro centos /bin/bash
docker run -it -v /Users/Tim/test:/home:rw centos /bin/bash
docker File:
用来构建docker镜像文件创建。里面就是一些脚本命令。
1.首先在本地建一个路径。
2.在路径下创建一个文件,写脚本:指令+参数构成。指令都是大写。
FROM centos // 从哪里来的
MAINTAINER sheik111@163.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
VOLUME (“volume1”, “volume2”)// 挂载的数据卷目录
RUN yum -y install vim
RUN yum -y net -toos
CMD echo “_____end____”
CMD /bin/bash
然后执行 docker build -f /home/**/刚才创建的文件 -t 镜像名称 当前路径
通过这种方式进行直接进行挂载。如果没有挂载,后面就通过-v 进行挂载。
数据卷容器: 容器和容器进行同步。
--volumes-from 容器2 数据卷容器(容器1)
docker run —name 01 -it 容器1id
docker run —name 02 —volume-from 01 -it 容器1id 这样就实现了两个容器的同步
Dockerfile:
1.编写dockerfile 文件。
2.docker build
3.docker run
4.docker pull 发布
Docker file 命令:
FROM #基础镜像 一切都从这里构建。
MAINTAINER #谁写的,谁维护 一般是姓名+ 邮箱
RUN #构建的时候,需要运行的命令。
ADD # 添加组件,添加内容,自动解压
WORKDIR #工作目录
VOLUME #挂载目录
EXPOSE #暴露端口 -p 同理
CMD #指令,指定容器运行的命令。 替换。 只执行最后一个CMD。 docker run id -l ,那么-l 会替换CMD中的内容
ENTRYPOINT:#可以追加命令。 追加
ONBUILD:#当一个继承dockerfile的时候会被调用。
COPY:#类似add 命令。 文件copy到镜像中。
ENV:#设置环境变量。
Centos的dockfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL
org.label-schema.schema-version="1.0"
org.label-schema.name="CentOS Base Image"
org.label-schema.vendor="CentOS"
org.label-schema.license="GPLv2"
org.label-schema.build-date="20201113"
org.opencontainers.image.title="CentOS Base Image"
org.opencontainers.image.vendor="CentOS"
org.opencontainers.image.licenses="GPL-2.0-only"
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
hub.docker 99%的镜像都是从基础scratch开始的。
通过docker history 可以查看到某个docker 的构建步骤。
也可以通过压缩包进行构建镜像。例如制作tomcat,那么需要tomcat 压缩包和jdk 压缩包。
创建Dockerfile ,这是官方推荐命名。
ADD 都会自动解压。
设置环境变量。
暴露端口等。
发布镜像到dockerhub:
1.注册账号
2.账号可以登录
3.在服务器上提交。
首先要登录:
docker login -u * -p * 登录
docker logout 退出登录
docker push 作者名字/容器名字:version
通过docker tag 容器id 然后是新的TAG 名字。
例如:docker tag id aaaa:1.0
发布到阿里云镜像:
1.登录到阿里云
2.找到容器镜像服务。
3.创建命名空间。 指的是一个大项目。
4.创建镜像。
在阿里云界面会有各种上传/拉取的命令。
docker 网络:路由
docker0:docker 地址
lo:本机回环地址。
etho:公网地址
docker 如何处理网络访问的:
Linux 可以直接ping 通docker 的ip 地址。
root@be594b83e415:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft foreve
每启动一个容器,docker 就会给每一个容器分配一个ip,我们只要安装了docker,就会有一个docker0的网卡桥接模式。
使用的是evth-pair技术。
evth-pair 是连接网络虚拟设备的。
容器间也可以ping 通。 这种通信不是直接连接。而是通过docker0的evth-pair 技术,到docker0之后,再到容器2.
--link 解决ip地址变化,导致无法通信的问题。
通过名称无法ping 通
docker exec -it —name tomcat02 ping tomcat01
可以通过下面方式进行连接:
docker run -d -P —name tomcat03 —link tomcat02 tomcat
这时就可以ping 通
docker exec -it tomcat03 ping tomcat02
反向不可以ping 通
docker exec -it tomcat02 ping tomcat03
因为一旦用 --link之后,进入tomcat03的/etc/hosts 文件会写tomcat02的配置进去。
如果需要相互访问,那么就要启动相互绑定,但是要进行重启。
自定义网络:
使用docker network ls 查看所有的docker 网络。
timdeMBP:~ tim
bridge 桥接模式(默认)。
none 不配置网络
host 主机模式,和主机共享网络。
timdeMBP:~ tim$ docker network --hlep
unknown flag: --hlep
See 'docker network --help'.
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
创建自定义网络: 都已经创建好了各个容器对应关系。
docker network create --driver bridge --subnet 192.168.0.0 --gateway 192.168.0.1 mynet
docker network inspect mynet
启动容器的时候是: 这个时候就可以ping 通。
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
docker exec -it tomcat01 ping tomcat02
docker exec -it tomcat02 ping tomcat01
好处:不同的集群使用不同的网络
网络联通:
Docker0 和mynet 两个网络。
使用connect 命令。 基本原理是:把容器直接放到mynet 下,相当于一个容器两个ip,一个公网,一个私网。
docker network connect mynet tomcat01