此文为Docker概念篇,是自己学习Docker的小笔记。随后会更新一篇部署篇,包含Docker部署MySQL/Tomcat/NGINX/Redis,创建自己的私有Docker hub,镜像上传私有仓库以及镜像的使用。
快速理解docker
本地做好项目之后,在本地打一个镜像放到远程自己的private hub上,这样就可以在服务器上拉远程的镜像到服务器本地,通过docker进行创建一个以镜像为依据的的容器。然后在容器中执行项目启动的指令。在这个容器中包含了你的项目以及项目的依赖包和相关的运行环境。比虚拟机更省资源,项目容错率也会更高。
Docker概念
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中。然后发布到任何流行的Linux机器上。有CE(社区版)和EE(企业版),是一种容器技术,解决项目迁移问题;
优点:
容易完全沙箱机制,相互隔离
性能开销极低
Docker架构
镜像(image):Docker镜像 就相当于是一个root文件系统。比如官方镜像ubuntu就包含了完整的一套ubuntu16.04最小系统的root文件系统
容器(container): 镜像和容器的关系,就像是面向兑现程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建,启动,停止,删除,暂停等。
仓库(Registries):仓库可看成一个代码控制中心,用来保存镜像的
配置Docker镜像加速器
默认情况下,将来从docker hub上下载docker镜像,太慢。一般我们都用阿里云进行镜像加速器,阿里云的控制台进行配置docker。具体的配置流程可以Google一下~
Docker命令
Docker服务相关命令:
启动 停止 重启 开启启动等(Linux Docker可以通过指令在进程中查看是否有Docker进程运行)
Docker镜像相关命令:
查看镜像:
# 列出本地主机上的镜像
docker images
#显示的选项说明:
#REPOSITORY:表示镜像的仓库源
#TAG:镜像的标签
#IMAGE ID:镜像ID
#CREATED:镜像创建时间
#SIZE:镜像大小
docker images -q 查看所有镜像的ID
搜索镜像(远程):
docker search redis
拉取镜像(远程):
docker pull redis
删除镜像:
docker rmi [images ID] ---删除某个id
docker rmi 'docker images -q' #删除所有本地镜像
Docker 容器相关命令(构建好的镜像实例)类似于对一个应用程序的操作:
docker run 命令在一个容器内运行一个程序
docker run ubuntu:15.10 /bin/echo "hello world"
查看容器指令
# 查看当前运行的容器
docker ps
# 查看所有容器,包括停止
docker ps -a
# 查看最新创建的容器,只列出最后创建的
docker ps -l
# 查看网络端口
docker port [容器ID|容器名]
# 查看容器内部的标准输出
docker logs [容器ID|容器名]
# 查看容器内部运行的进程
docker top [容器ID|容器名]
# 查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
docker inspect [容器ID|容器名]
创建容器:
docker run -it --name=c1 centos:7 /bin/bash
#centos 镜像名 7 是版本号
docker run -id --name=c2 centos:7
#--name 容器名字
-i #保持容器运行,通常于-t同时使用。加入it这两个参数之后,容器创建后会自动进入容器中,退出容器后,容器会自动关闭。
-t #为容器重新分配一个伪输入终端,通常与-i同时使用;
-d #以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it #创建的容器一般称为交互式容器,-id创建的为守护示容器;
--name #为创建的容器命名;
进入容器:
docker exec -it c2 /bin/bash
#通过--id 方式创建的容器 当你exit退出之后,容器的运行是不会停止的
停止容器:
docker stop [容器|容器名]
启动容器:
docker start [容器ID|容器名]
docker restart [容器ID | 容器名]
删除容器:
# 删除容器,删除容器时,容器必须是停止状态
docker rm [容器ID|容器名]
# 删除所有的容器
docker rm $(docker ps -aq)
查看容器信息:
docker inspect [容器名]
所有的指令中,docker容器的指令由为重要!!! 因为容器才是实例
docker容器的数据卷
数据卷是什么和作用?思考为什么需要数据卷?
1,Docker容器删除后,在容器中产生的数据还在吗?不在
2,docker容器和外部机器可以直接交换文件吗? 不能
3,容器之间想要进行数据交互?就用到了数据卷
数据卷的概念:
宿主机中的一个目录或文件,在react中相当于context,当容器和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个数据卷同事挂载,一个容器中也可以被挂载多个数据卷。
数据卷的作用:
容器数据的持久化;
外部机器和容器间接通信;
容器之间数据交换;
如何配置数据卷
创建启动容器时,使用-v参数设置数据卷;
docker run ... -v [宿主机目录(文件):容器内目录(文件)] ...
docker run -it -v ~/Desktop/data:/root/data_container --name=c3 centos:7 /bin/bash #适合mac电脑
参数一定要注意:目录必须是绝对路径;如果目录不存在,会自动进行创建;可以挂载多个数据卷;
一个容器挂载多个数据卷:
docker run -it --name=c4 \
-v ~/Desktop/data1:/root/data1 \
-v ~/Desktop/data2:/root/data2 \
centos:7 /bin/bash
两个容器链接同一个数据卷:
#创建连个容器
docker run -it --name:c5 -v ~/Desktop/data:/root/data centos:7
docker run -it --name:c6 -v ~/Desktop/data:/root/data centos:7
#这样c5和c6中的data就都和宿主机的data数据卷相同。这样就可以共享一份数据卷了
数据卷容器
如果想多容器进行数据交换:
方案1:多个容器挂载在同一个数据卷;
方案2: 数据卷容器;
容器卷容器和宿主机直接进行数据通信,专门的数据容器
#1 创建启动c3数据卷容器,使用-v参数数据卷 c3就是一个数据卷容器了 此刻的目录是容器目录 没有容器卷的目录 docker会在宿主机上自动分配一个目录进行同步
docker run -it --name=c3 -v /volume centos:7 /bin/bash
#2 创建启动c1 c2 容器,使用--volumes-from参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c3 --volumes-from c3 centos:7 /bin/bash
问题:这里为什么要用专门一个容器去存放数据呢,而不是一个个容器去配置同一个外部数据卷呢?
一般docker管理的Linux服务器上面,可以通过创建一个数据卷容器来专门保管数据和进行数据通信,宿主机此刻的作用就是一个备份数据的作用。这样所有的操作都变成了容器化操作,更加统一。