一、Docker的简单介绍
一、什么是Docker
docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。
二、Docker的三个概念
一、镜像(Image):
类似于虚拟机中的镜像。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
二、容器(Container):
类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
三、仓库(Repository):
类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
三、Docker的安装卸载
四、Docker的基本命令
[root@localhost ~]# docker version # 查看docker的版本信息,包括客户端、服务端
[root@localhost ~]# docker info # 查看docker的系统信息,包括镜像和容器的数量
[root@localhost ~]# docker --help # 帮助命令
[root@localhost ~]# systemctl start docker # 启动docker服务
[root@localhost ~]# systemctl status docker # 查看docker服务状态
五、Docker的镜像命令
[root@localhost ~]# docker images # 查看所有本地主机上的镜像。
[root@localhost ~]# docker images -a # -a:列出所有镜像,-q:只显示镜像的id。如:docker images -aq
[root@localhost ~]# docker images centos # 查看centos镜像的信息
[root@localhost ~]# docker search imagename # 查询docker hub可拉取镜像列表, 搜索镜像。
[root@localhost ~]# docker search mysql --filter=STARS=3000 # 搜索出来的镜像就是STARS大于3000的
[root@localhost ~]# docker pull imagename<imageid> # 下载镜像:从远端docker hub下载拉取镜像
[root@localhost ~]# docker pull mysql # 下载mysql镜像,等价于:docker.io/library/mysql:latest。也可以指定版本:docker pull mysql:5.7
[root@localhost ~]# docker pull ubuntu:14.04 # 下载ubuntu指定版本的镜像
[root@localhost ~]# docker rmi imagename<imageid> # 删除镜像
[root@localhost ~]# docker rmi -f bf756fb1ae65 # 根据镜像id删除
[root@localhost ~]# docker rmi -f mysql # 根据镜像名称删除,也可以删除指定版本如:docker rmi -f mysql:5.7
[root@localhost ~]# docker rmi -f mysql ubuntu:14.04 # 删除多个镜像
[root@localhost ~]# docker rmi -f bf756fb1ae65 bc356fa1ae68 # 删除多个镜像
[root@localhost ~]# docker rmi -f $(docker images -aq) # 递归删除所有的镜像
[root@localhost ~]# docker inspect redis:latest # 查看镜像详细信息
[root@localhost ~]# docker image inspect redis:latest # 查看镜像详细信息
六、Docker的容器命令
[root@localhost ~]# docker pull centos # 有了镜像才可以创建容器,下载一个centos镜像来学习
[root@localhost ~]# docker run [可选参数] imagename(镜像名)
[root@localhost ~]# docker run -d centos /bin/bash # 后台方式运行容器。
[root@localhost ~]# docker run -it centos /bin/bash # 交互方式运行容器。启动并进入容器之后,可以使用命令查看容器内的centos。使用exit退出容器。
[root@localhost ~]# docker run -it --name='liu' centos /bin/bash # --name:容器名字。如:tomcat1,tomcat2,用来区分容器。
# -p 指定容器的端口(-p 容器端口 | -p 主机端口:容器端口 | -p ip:主机端口:容器端口)
# -P 随机指定端口
[root@localhost ~]# docker ps # 列出当前正在运行的容器
[root@localhost ~]# docker ps -a # 列出当前正在运行的容器 + 历史运行过的容器)
[root@localhost ~]# docker ps -aq # 只显示容器的编号(容器id)
[root@localhost ~]# docker ps -a -n=1 # 显示最近创建的容器
[root@localhost ~]# docker rm containerid<containernames> # 根据容器id删除指定的容器。不能删除正在运行的容器,如果要强制删除,使用rm -f。
[root@localhost ~]# docker rm -f 90aad472e7e8 # 方式一,删除单个容器
[root@localhost ~]# docker rm -f $(docker ps -aq) # 方式二,删除所有容器
[root@localhost ~]# docker ps -aq|xargs docker rm -f # 方式三,删除所有容器
[root@localhost ~]# docker kill containerid <containernames> # 强制停止当前容器
[root@localhost ~]# docker stop containerid <containernames> # 停止当前正在运行的容器,停止指定容器
[root@localhost ~]# docker start containerid <containernames> # 启动容器。注意与run的区别:run是镜像创建并运行容器,start是启动已经存在的容器,即再次运行容器。
[root@localhost ~]# docker restart containerid <containernames> # 重启容器(最好使用容器id来重启,上面三条也是)
[root@localhost ~]# docker exec -it 容器id command # 进入当前正在运行的容器,方式1:进入容器后开启一个新的终端,可以在里面操作(常用)。
[root@localhost ~]# docker exec -it a6e3963fd253 /bin/bash
[root@localhost ~]# docker attach 容器id或容器名 # 进入当前正在运行的容器,方式2:进入容器正在执行的终端,不会启动新的进程。
[root@localhost ~]# docker logs containername<containerid> # 查看容器的日志信息
[root@localhost ~]# docker logs -tf --tail 10 容器id # 显示10条日志。-t:显示时间戳,-f:动态显示,--tail:显示多少条。
[root@localhost ~]# docker cp 容器id:容器内路径 目的主机路径 # 从容器内拷贝文件到主机上
[root@localhost ~]# docker cp 容器id:/home/test.py /home
[root@localhost ~]# docker top 容器id # 查看容器中进程信息
[root@localhost ~]# docker inspect 容器id # 查看容器的元数据
七、Docker的镜像原理
一、镜像原理之联合文件系统
UnionFS(联合文件系统)是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
二、镜像原理之分层理解
1. 所有的docker镜像都起始于一个基础镜像层,当进行修改或者添加新的内容时,就会在当前镜像层之上,创建新的镜像层。
2. 假设基于centos创建一个新的镜像,centos就是新镜像的第一层,如果在该镜像中添加python包,就会在基础镜像层之上创建第二个镜像层,如果继续添加一个安全补丁,就会创建第三个镜像层。则该镜像当前已经包含3个镜像层。
3. 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。假设有三个镜像层,前两层镜像层都包含3个文件,第三层镜像层只有一个文件(假设第一个镜像层三个文件分别是:centos、mysql、tomcat。第二个镜像层三个文件分别是:redis、app1.0、es。第三个镜像层的文件是app2.0),如果把这三个镜像层打包成一个新的镜像(三层镜像),新的镜像在外部看来只有6个文件,这是因为最上层中的文件app2.0是app1.0的一个更新版本。这时候如果docker pull下载这个镜像,就会发现有6个layer(即6层)。
4. docker镜像都是只读的,当容器启动时(运行run命令),一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层。镜像层是从远程pull下来的。镜像层无法改变,所有操作都是基于容器层的。这时候可以通过commit命令将整个打包,如果原来的镜像(如redis)有6层,现在加上容器层就是7层了。
5. 镜像都是分层的,因此当pull一个镜像时,是分层下载的,如果已经下载过了,就直接复用,跳过这一层下载下一层的。
三、commit 命令生成新的镜像
如果你想要保存当前容器的状态,就可以通过commit命令来提交,获得一个镜像。就好比虚拟机的快照。将操作过的容器通过commit命令,提交成为一个镜像,我们以后就可以使用修改过后的镜像了(这个镜像是新生成的,原来的镜像不会变)。
[root@localhost ~]# docker commit -a='作者' -m='修改的信息' 容器id 镜像名称(可以加上版本)
[root@localhost ~]# docker commit -a -m='add webapps' 2958d9839b09 tomcat01:1.0
八、配置镜像加速
一、配置阿里云镜像加速
[root@localhost ~]# sudo mkdir -p /etc/docker
[root@localhost ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://sgp9zikk.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
二、配置腾讯云镜像加速
[root@localhost ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
三、检查加速器是否生效
[root@localhost ~]# docker info # 查看Registry Mirrors参数的值