Docker理论知识
Docker是容器管理系统,也是一个进程,而容器是Linux内核的一个功能模块,不过Docker使用的时候和虚拟机差不多,但不是虚拟机。
工作原理: 在磁盘网络等资源中取出一部分进行隔离,在这规定的范围里面进行特定的操作,其所有操作依然是使用的是真机的Linux操作系统,只不过是真机开启一个进程,而Docker就是以这个进程为上帝进程进行后续的操作。
和虚拟机的区别:
Docker其实实质上是一个进程,还是一个运行在操作系统上的一个程序,也就是说管理员可以查看到Docker里面的进程
KVM虚拟机不是进程,他是内核做的一个虚拟化,它是完全获取一部分资源的支配权,而其操作系统也是独立的,所以可以和真实机的系统不同,并且管理员不能查看虚拟机的进程
Docker只能是Linux操作系统,因为其操作系统是真机的,只有Linux有Docker;KVM操作系统不限,都可以
Docker的优点:
使得容器更加方便管理,而容器相对于虚拟化简洁高效,并且不需要安装操作系统
Docker的缺点:
共用Linux内核使得其安全性有先天缺陷,而且不能很好的监控和派错
容器技术的核心由以下三个内核技术组成: Cgroups-资源管理、NameSpace-进程隔离、SELinux-安全
安装docker软件包
条件:1. 需要64为操作系统 2. 内核需要3版本以上 3. 最好是Linux7版本以上 4. 最好关闭防火墙
安装软件包:
yum install -y docker-engine docker-engine-selinux
基本命令
docker version | 查看docker信息 |
docker images | 查看当前拥有的镜像 |
docker search 关键字 | 搜索镜像,查找(自动前往官网查找) |
docker pull 镜像名 | 下载(连接互联网后会自动前往官网下载) |
docker push 镜像名 | 上传(连接互联网后会自动前往官网上传) |
docker save 镜像名 > 文件名.tar | 导出镜像 |
docker load < 文件名.tar | 导入镜像 |
docker run 参数 镜像名:标签名 执行的命令 | 启动镜像 |
这里写的执行的命令是指容器中的命令,不知道怎么写可以用两个方法 | |
1. 猜测一个,一般都是用 bash,也有的用 sh | |
2. 不写使用默认命令启动(有的镜像默认命令是开启一个服务,启动后会控制端down死,比如nginx) | |
参数:1. -it 是拿镜像生成一个容器,然后交互式的进行操作,并且exit退出后就会关闭容器 | |
2. -itd 启动镜像并把命令放在后台运行 | |
3. -v 物理机的目录:容器中的目录 指定将某个物理目录映射到容器中 | |
4. --network=网桥名 指定容器进入的虚拟网络 | |
5. -p 真机端口:容器端口 端口转发,将访问真机的请求转发给容器 | |
docker history 镜像名 | 查看镜像历史 |
docker inspect 镜像|容器|网络 | 查看底层信息 |
docker rmi 镜像名 | 删除镜像 |
启用过容器的镜像不能删除,如果要删除,必须先删除容器再删镜像 | |
docker tag 镜像名:标签 新镜像名:新标签 | 为一个镜像制作一个软连接 |
docker ps [参数] | 查看正在运行的容器 |
参数有:-a 查看所有容器(包括没启动的) | |
-q 只显示容器的ID | |
docker stop 容器ID号 | 关闭容器 |
docker start 容器ID号 | 启动容器并放入后台 |
docker attach 容器ID号 | 进入某个容器(exit,ctrl+c导致容器关闭) |
docker exec -it 容器ID号 | 进入某个容器(exit不会导致容器关闭) |
docker rm 容器ID号 | 删除容器(只能删除没有开启的容器,如果开启了先stop再删除) |
docker top 容器ID号 | 查看容器中的进程信息 |
docker commit 容器ID号 自定义新镜像的命名:标示 | 把容器打包成一个镜像,为后端盘,以后可以以这个新镜像创建容器 |
docker build -t 自定义新镜像的命名:标示 Dockerfile所在的目录 | 执行Dockerfile文件内容生成镜像 |
docker network list | 查看Docker已经创建的网络模型 |
docker network create --driver 指定的格式(bridge) --subnet=网段信息/子网掩码简写 自定义的名字 | 创建一个网络网桥 |
docker network inspect 网络名字 | 查看一个网络的信息 |
注意点:
1. 使用run是其参数中没有d的话,退出会关闭容器,但是容器依然存在,可以用docker ps -a查看到
2. 使用run是重新创建 一个新的容器,attach或者exec是进入一个已经创建的容器
3. 使用attach或者exec只能进入开启的容器
4. 在写容器ID的时候,可以简写,只需要这个ID号可以唯一标示一个容器,可以理解为Docker会自己完成Tab补全操作
5. 使用attach后退出会导致容器关机,如果不想关机,其解决方案 ctrl+p再按ctrl+q,这样就不会关闭容器了
6. 使用attch或者exec,界面可能down死,因为如果这个容器的默认命令不是bash这种交互的命令程序,那么就会卡在那里,比如一些服务像nginx等
特例:
删除所有没有开机的容器 | docker rm $(docker ps -qa) |
删除所有容器,包括没有开机的 | docker rm $(docker stop `docker ps -qa`) |
查看所有机器的进程情况 | for i in $(docker ps -q); do echo "#-----${i}------#"; docker top $i; done |
Docker原理细则
Docker具体执行过程如下,如果是用run打开docker,那么就是根据镜像生成一个新的容器,再进入容器进行操作,其进入的方式和attach一样;如果是用attach或exec打开一个容器,那么前提是这个容器是存在且打开了的,然后进入进行继续的操作;如果使用的attach那么登陆进入的时候用户使用的就是容器的上帝进程,也就是说,如果用户退出就会关闭上帝进程,那么所有进程都会被杀死;如果用户使用的是exec,那么会在容器的上帝进程后创建一个进程然后进行其他操作,这样用户退出就不会影响Docker容器的运行。
进入docker后,会有六个方面的数据信息发生变化: 网络、存储、主机名、进程、信号(对进程进行操作的具体参数)、用户。
因为进入docker就是通过进程进入一个容器,在docker中不能查看容器外的内容,而外面可以查看到容器里的进程。
这六方面的数据会变化,和真机的相关数据变得不同,从而变成容器中的部分。
简析Linux两个版本的区别
基本操作都一样,服务的配置等等都是一样的,只有安装使用的命令有部分不同
系列 | redhat | debian |
操作系统系列 | rhel centOS | debian ubuntu |
安装程序 | yum | apt-get |
管理软件包 | rpm | bpkg |
使用dockerfile创建一个镜像
1. 创建一个工作目录,所有相关文件都要创建在这个目录下
2. 在工作目录下创建一个文件,命名必须是 Dockerfile ,在文件中书写脚本,语法如下
3. 用dockerfile创建镜像
docker build -t 自定义新镜像的命名:标示 Dockerfile所在的目录(也就是我们创建的工作目录)
Dockerfile语法格式
FROM 镜像名 | 指定基础镜像 |
ADD 一个本地文件 添加到容器中的文件位置和名字 | 复制文件(文件必须是创建的工作目录下的文件)到镜像 |
RUN 命令 | 制作镜像时执行的命令,这后面会成为在容器中执行的命令 |
不过不宜运行设置变量、cd等命令,因为这些命令run结束后就失效了,下面有专门的命令 | |
MAINTAINER | 镜像创建者信息 |
EXPOSE 端口号 | 标示开放的端口 |
ENV 变量定义 | 设置变量,可以理解为前往容器设置一个全局变量 |
WORKDIR 目录 | 定义容器默认工作目录,就是在容器中执行cd命令 |
CMD 数组 | 容器启动时执行的命令,仅可以有一条CMD |
如果有参数需要写成数组的格式! |
附注:
1. 如果写脚本的时候,制作的镜像需要启两个服务,就写一个脚本,这个脚本中执行多个服务的启动命令,然后以这个脚本为启动程序,不过记得添加权限。
2. 查看怎么开启一个服务,可以前往下面这个目录读取相关服务的信息:/etc/systemd/system/multi-user.target.wants/
3. 真机连接互联网后,可以使用公网yum,不过占用带宽,建议还是使用本地制作在局域网网络yum。 Dockerfile示例:
创建一个镜像,运行了httpd和sshd服务,并修改yum源仓库(如果连接了真机连接了外网就可以不修改)
[root@docker ~]# vim /root/docker/Dockerfile
FROM centos:latest
MAINTAINER Lyu [email protected]
RUN rm -f /etc/yum.repos.d/*.repo
ADD centos.repo /etc/yum.repos.d/centos.repo
RUN yum install -y iproute bash-completion vim net-tools psmisc openssh-server initscripts httpd
ENV EnvironmentFile=/etc/sysconfig/sshd
RUN echo '123456' | passwd --stdin root
RUN sshd-keygen
ADD index.html /var/www/html/index.html
ADD lyu /etc/rc.d/lyu
CMD ["/etc/rc.d/lyu"]
EXPOSE 22
EXPOSE 80
EXPOSE 443
[root@docker ~]# vim /root/docker/centos.repo
[centos]
name=centos
baseurl=ftp://网络Yum的IP地址/centos
enabled=1
gpgcheck=0
[root@docker ~]# vim /root/docker/index.html
hello world
[root@docker ~]# vim /root/docker/lyu && chmod 755 /root/docker/lyu
#!/bin/bash
/usr/sbin/sshd -D &
/usr/sbin/httpd -DFOREGROUND
自定义搭建一个镜像仓库
装包(docker的安装包) 配置(新建一个配置文件) 启服务
1. 在镜像仓库装包
2. 对服务进行配置操作
vim /etc/docker/daemon.json
{
"insecure-registries" : ["docker镜像仓库服务器的真实IP:5000"]
}
3. 启动docker服务
systemctl restart docker
docker pull registry
docker run -d -p 5000:5000 registry
4. 上传镜像信息(给镜像打标签后上传)
docker tag 镜像:标示 镜像仓库服务器的IP:5000/镜像:标示
docker push 镜像仓库服务器的IP:5000/镜像:标示
使用镜像仓库
1. 装包配置启服务(和搭建差不多)
vim /etc/docker/daemon.json
{
"insecure-registries" : ["docker镜像仓库服务器的真实IP:5000"]
}
2. 使用镜像仓库创建容器
docker run -it 镜像仓库服务器的IP:5000/镜像:标示
3. 查看有哪些镜像的内容
# 查看镜像名字
http://192.168.1.3:5000/v2/_catalog
# 查看指定镜像的标签
http://192.168.1.3:5000/v2/镜像名字/tags/list
注意点:
1. 如果tag复制的时候创建了一个已经存在的名字标示,两个值一模一样但是ID不同,会出现旧的镜像的标示变成none
2. 如果自己当前的镜像库中有一个命名为: docker镜像仓库服务器的真实IP:5000/镜像:标示 ,那么使用的时候会使用自己本机的这个镜像而不是从自定义的镜像库中下载
主机卷的映射
原理:把一个真实机的一个目录映射到容器中的一个目录上,然后真实机可以修改自己的目录来控制容器内的服务,提高操作的简易性,而容器也可以把自己的数据存储在真实机中,提高数据的安全性
使用命令:
docker run -v 物理机的目录1:容器中的目录1 -v 物理机的目录2:容器中的目录2 -v 物理机的目录n:容器中的目录n -it 镜像:标示 命令
注意点:
1. 这里面的两个目录(物理机和容器内的)可以不存在会自动创建,其父目录等不存在也可以;但是一般而言物理机中的目录最好是真实的,这样才有数据,当然没有也可以,等容器运行后进行修改操作,这样用于保证数据的安全性
2. 如果容器的指定目录下有文件,则会覆盖容器的指定目录下的所有文件。
可以和共享存储连用,形成统一部署与修改
1. 让多个Docker主机通过共享存储的方法挂载到统一的存储服务器上
2. 把挂载在存储服务器上的目录映射到容器中
这样,修改存储服务器内的数据,就可以同步修改所有docker服务器的容器数据;而任何一个docker容器中的数据也会存储在存储服务器中。
搭建网桥
默认Docker会创建一个默认网络docker0,其是172.17.0.0/16网段的一个虚拟网络,默认所有的容器都是使用这个网络,不过可以自己修改创建
查看当前网桥的信息:
brctl show
创建网桥:
docker network create --driver 指定的格式(bridge) --subnet=网段信息/子网掩码简写 自定义的名字
容器调用网桥:
docker run --network=网桥名 -itd 镜像
端口映射
让外界访问真机的某个端口的时候把请求转发给容器的指定端口,这是容器的比较核心的技术点,让容器能和外部进行服务的交互
命令:
docker run -p 真机的端口:转发给容器的端口 -itd 镜像
举例:
docker run -p 80:80 itd nginx
# 把访问真机网页的信息内容转发给容器的nginx服务器上
注意: 网络的选择、目录映射、端口的映射必须在创建的时候就决定好