Docker
docker vs VMware
VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;
Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。
什么是docker?
docker是一个开源的应用容器引擎,基于go语言开发并遵从Apache2.0协议开源。
docker可以让开发者打包他们的应用到一个可移植的容器中,然后发布到任何linux机器上。
容器之间使用沙箱机制,相互没有任何接口(类iphone的app),并且容器开销极低。
docker优势
1、更快速的交付和部署
2、更高效的虚拟化
3、更轻松的迁移和扩展
4、更简单的管理
docker相关概念
Docker是CS架构,主要有两个概念:
1.Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与 Docker daemon交互
2.Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker
daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的
Docker daemon
Docker的三个主要概念:
镜像(image)
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,Tomcat镜像\=\=》Run\=\=》Tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container)
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动、停止、删除、基本命令!
目前就可以把这个容器理解为就是一个简易的Linux系统
境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
仓库(repository)
仓库就是存放镜像的地方!
仓库分为共有仓库和私有仓库!
Docker Hub
阿里云都有容器服务器(配置镜像加速)
docker常用命令
帮助命令
docker version # 显示Docker的版本信息`
docker info # 显示Docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令,可以查看Docker的所有命令
镜像命令
docker pull 镜像名 #下载镜像
docker push 镜像名 #推送镜像到仓库
docker images #列出镜像
dockers rmi 镜像名/镜像id #删除镜像 -f 强制
dockers rmi -f $(docker images -aq) #一键删除所有镜像
docker search 镜像名 #搜索镜像
docker image inspect 镜像名 #查看镜像分层的方式
容器命令
docker run [可选参数] image # 新建容器并启动
参数说明:
--name="Name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 随机映射端口号
-v #卷挂载
-e # 环境配置
docker ps #列出正在运行的容器 -a 列出所有容器
exit # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出
docker rm 容器id # 删除指定的容器
docker rm -f $(docker ps -aq) # 删除所有的容器
docker start 容器id # 启动容器 docker restart 容器id # 停止容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前容器
docker logs -f -t --tail # 查看容器日志
docker top 容器id #查看容器中的进程信息
docker inspect 容器id #查看容器的元数据
docker cp 容器id:容器内路径 目的的主机路径 # 从容器内拷贝文件到主机上
进入容器命令
docker exec -it 容器id /bin/bash
docker attach 容器id
exec与attach的区别:
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach # 进入容器正在执行的终端,不会启动新的进程!
Docker图形化界面管理工具!
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true\
portainer/portainer
Commit镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG] #把一个容器提交镜像
容器数据卷
容器数据卷的用途
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地
这就是卷技术,目录的挂载,将容器内的目录,挂载到Linux上面
==容器的持久化和同步操作,容器间可以数据共享==
使用数据卷
通过-v实现数据卷
eg: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=123456 --name mysql01 mysql:5.7
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
v /宿主机路径:容器内路径 # 指定路径挂载
通过-v 容器内路径:ro/rw 改变读写权限
ro:readonly 只读
rw:readwrite 可读可写
一旦这个设置了容器权限,容器对我们挂载出来的就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
只要看到ro就说明这个路径只能通过宿主机操作,容器内部无法操作
Dockerfile
Dockerfile就是用来构建Docker镜像的构建文件,命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层
docker bulid -f dockerfile1 -t /candy/centos #构建镜像
dockerfile指令
FROM # 基础镜像,一切从这里开始构建 CentOS MAINTAINER # 镜像是谁写的,姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤,tomcat镜像,tomcat压缩包,添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBULID # 当构建一个被继承 DockerFile 这个时候就会运行 ONBULID 指令,触发指令 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量
CMD 和 ENTRYPOINT 区别 :
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
发布镜像
docker login -u anygts #登录hub.docker账号
docker tag httpd:latest docker账号名称/httpd:v1 #打标签 ,必须的!
docker push docker账号名称/httpd:v1 #上传
docker logout #登出
docker网络
所有的容器不指定网络的情况下,都是Docker0路由的,Docker会给我们的容器分配一个默认的可用IP
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥
—link就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 6846b34d8575
的映射,但是现在学习Docker已经不建议使用 —link 了,自定义网络不适用于Docker0!!!
通过 --link 就可以解决网络连通问题
eg: docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker network ls #查看所有的docker网络
网络模式
-
Bridge:桥接模式,Docker上搭桥
-
None:不配置网络
-
Host:和宿主机共享网络
-
Container:容器内网络连通
直接启动的命令 --net bridge,这个就是docker0
[root@localhost ~]# docker run -d -P --name tomcat01 --net bridge tomcat
docker0特点:默认,域名不能访问,--link可以打通连接
自定义一个网络!
--driver bridge
--subnet 192.168.0.0/16 192.168.0.2-->192.168.255.255
--gateway 192.168.0.1
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet