docker是类似于虚拟机的容器,可以通过docker搭建应用环境(通过docker安装比如:mysql,nginx,应用程序等)。环境在迁移、扩容时,可以将deocker和已经安装的程序打包成一个镜像文件。该文件包括了所有打包得应用程序的所有依赖;直接运行改文件,就可以让程序跑起来,从而不用再去考虑环境问题。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。和虚拟机的主要区别是,docker是和服务共用操作系统,虚拟机是单独的操作系统,运行docker就像是运行在真实的物理机上一样。
镜像(image)
镜像是一种轻量级、可执行的独立软件包,用来打包运行坏境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件。
容器(Container)
Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
仓库(Repository)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
*注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
2.1、卸载已经安装的Docker
[root@CentOS7-0002 ~]# sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
2.2、配置阿里云yum源仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 若是找不到yum-config-manager就经过命令yum -y install yum-utils 安装就能够使用yum-config-manager命令
2.3、查看能够安装的docker版本
yum list docker-ce --showduplicates | sort -r #查看能够安装的版本并倒序排序
2.4、安装最新版本Dockerj
sudo yum install -y docker-ce #注意:安装Docker最新版本,无需加版本号;或者选择你须要的版本安装
2.5、设Docker阿里云加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lkq3q0he.mirror.aliyuncs.com"]
}
EOF
2.6、启动Docker
sudo systemctl daemon-reload #从新加载服务配置文件
sudo systemctl enable docker.service && systemctl restart docker.service #设置开机启动与重启docker服务
2.7、查看Docker版本
[root@CentOS7-0002 ~]# docker
[root@CentOS7-0002 ~]# docker version //查看docker版本
3.1、基础命令
systemctl status docker #查看docker运行情况
systemctl start docker #启动命令
systemctl stop docker #关闭命令
systemctl restart docker #重启命令
systemctl enable docker #设置开机自启动docker
docker version #查看docker版本
docker info #查看docker信息
3.2、镜像命令
镜像命令
docker images #查看服务器中docker镜像列表
docker search 镜像名 #搜索镜像
docker pull 镜像名:tag #拉取镜像,不加tag就是最新,tag指定版本。如:docker pull mysql:5.6
docker rmi -f 镜像名/镜像ID #删除一个镜像
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部镜像,-a显示全部 -q只显示ID
docker image rm 镜像名/镜像ID #强制删除镜像
docker save 镜像名/镜像ID -o 镜像保存的位置与名字 #保存镜像,将我们的镜像保存为tar压缩文件,然后在任意一台安装了docker服务上加载这个镜像
如:docker save tocmcat -o /opt/software/tomcat.tar
docker load -i 镜像保存的位置 #任何安装了docker的地方加载保存的镜像文件,将其复制成一个镜像到当前服务器
3.3、容器命令
docker ps #查看正在运行的容器列表
docker ps -a #查看所有容器,包含正在运行和已停止的
docker sotp 容器名/容器ID #停止容器
docker start 容器名/容器ID #启动容器
docker restart 容器名/容器ID #重启容器
docker kill 容器名/容器ID #kill 容器
docker cp 容器名/容器ID 容器内路径 容器外路径 #从容器内烤出
docker cp 容器外路径 容器名/容器ID 容器内路径 #从外部拷贝文件到容器内
docker logs -f --tail=要查看末尾多少行默认all 容器ID #查看容器日志docker exec -it 容器名/容器ID /bin/bash #修改容器配置需要进入容器内部,如:docker exec -id redis001 /bin/bashdocker container update --restart=always 容器名/者容器ID #更改容器随docker启动而启动
docker rename 容器名或者容器ID 新的容器名 #容器重命名ocker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
docker start:是重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
docker run:创建新容器的时候使用,相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
4.4、运维命令
sudo docker info |grep "Docker Root Dir" #查看docker工作命令
du -sh /var/lib/docker/ #查看docker的磁盘占用总体情况
docker system df #查看docker的磁盘使用具体情况
docker rm 'docker ps -a |grep Exited |awk '{print $1}'' #删除无用的容器和镜像
docker rmi -f ‘docker images |grep '’|aek 'print $3'' #查看名称或标签未none的镜像
docker system prune -a #清除所有无容器使用的镜像
4.5、docker rum命令详解
每个Docker容器都是独立和安全的应用平台(可以理解为:每个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间,也可以理解为服务器)
Docker每个容器之间都是隔离的。我们甚至可以在一个服务器上,使用docker镜像,跑出N个mysql示例,(尽管他们默认端口都是一样的,但容器间环境是隔离的,A容器中3306和B容器中的3306毫无关系,因为其不在一个世界)
默认情况下,我们无法通过宿主机(安装docker的服务器)端口来直接访问容器,因为docker容器自己开辟的端口与宿主机端口没有关系。如果外部想要访问容器,必须让容器中的端口与宿主机的端口简历关联绑定关系,正式概念叫做:容器端口映射,有了端口映射,我们就可以将宿主机端口与容器端口绑定起来,
比如:我们简历宿主机的6379端口与容器redis6379的端口绑定,那么访问宿主机ip的6379就可以访问到对应的容器
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
示例:
#将redis的6379端口映射到服务器的8888,运行容器redis002
docker rum -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
#启动容器时加上--restar=always参数,表示容器随docker服务的启动启动
docker run -itd --name redis002 -p 8888:6379 --restar=always redis:5.0.5 /bin/bash
#就是容器内的数据和外部宿主机文件绑定,类似一个双持久化,当容器删除时,宿主机文件目录任在,下次启动主要数据目录指向宿主机所在位置即可恢复
命令:-v 宿主机文件存储位置:容器内文件位置 #多个挂载中间空格隔开
docker rum -d -p 6379:6379 --name redis505 --restar =always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --r equirepass "password"