一、Deocker简介
docker是类似于虚拟机的容器,可以通过docker搭建应用环境(通过docker安装比如:mysql,nginx,应用程序等)。环境在迁移、扩容时,可以将deocker和已经安装的程序打包成一个镜像文件。该文件包括了所有打包得应用程序的所有依赖;直接运行改文件,就可以让程序跑起来,从而不用再去考虑环境问题。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。和虚拟机的主要区别是,docker是和服务共用操作系统,虚拟机是单独的操作系统,运行docker就像是运行在真实的物理机上一样。
镜像(image)
镜像是一种轻量级、可执行的独立软件包,用来打包运行坏境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件。共用可以远程库下载镜像,自己开发微服务,也可以打包成镜像,然后通过docker安装。
容器(Container)
Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。一般一个应用对应一个容器(如:nginx,redis,tomcat)
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
仓库(Repository)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
*注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
二、CentOS7安装Docker
2.1、安装前准备工作
docker安装要求: Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker。
更新系统软件: yum update
安装依赖工具包: yum install -y yum-utils device-mapper-persistent-data lvm2
2.2、卸载已经安装的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.3、配置阿里云yum源仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #将docker下载地址加入到yum管理仓库中
# 若是找不到yum-config-manager就经过命令yum -y install yum-utils 安装就能够使用yum-config-manager命令
官网地址
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
阿里云地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4、查看能够安装的docker版本
yum list docker-ce --showduplicates | sort -r #查看能够安装的版本并倒序排序
2.5、安装最新版本Dockerj
sudo yum install -y docker-ce #注意:安装Docker最新版本,无需加版本号;或者选择你须要的版本安装
sudo yum install -y docker-ce-20.10.6-3.el7 #指定安装版本20.10.6-3
2.6、设Docker阿里云加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lkq3q0he.mirror.aliyuncs.com"]
}
EOF
2.7、启动Docker
sudo systemctl daemon-reload #从新加载服务配置文件
sudo systemctl enable docker.service && systemctl restart docker.service #设置开机启动与重启docker服务
2.8、查看Docker版本
[root@CentOS7-0002 ~]# docker
[root@CentOS7-0002 ~]# docker version //查看docker版本
三、CentOS7卸载 Docker
卸载命令:
a.查询docker安装过的包:yum list installed | grep docker
b.删除安装包:yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y
c.删除镜像/容器等:rm -rf /var/lib/docker
四、Docker常用命令
4.1、虚拟网络命令
docker network create #创建新的Docker网络
语法:– docker network create [OPTIONS] NETWORK
–docker network create my_net
–docker network create --driver bridge --subnet 172.30.1.0/24 --gateway 172.30.1.1 my_net
docker network rm #删除一个或多个Docker网络
语法:–docker network rm NETWORK [NETWORK...]
–docker network rm my_net
–docker network rm 2a7ec206c4ef
docker network prune #删除所有未使用的Docker网络
语法:–docker network prune [OPTIONS]
–docker network prune
–docker network prune -f
docker network ls #查看所有Docker网络
语法:–docker network ls [OPTIONS]
–docker network ls
–docker network ls --no-trunc
docker network inspect #显示一个或多个Docker网络的详细信息
语法:–docker network inspect [OPTIONS] NETWORK [NETWORK...]
–docker network inspect my_net
–docker network inspect 6dedababaa65
docker network connect #将容器连接到网络
语法:–docker network connect [OPTIONS] NETWORK CONTAINER
–docker network connect my_net my_container--docker network connect --ip 10.10.36.122 multi-host-network container2
docker network disconnect #断开容器的网络
语法:–docker network disconnect [OPTIONS] NETWORK CONTAINER
–docker network disconnect my_net my_container
4.2、基础命令
systemctl status docker #查看docker运行情况
systemctl start docker #启动命令
systemctl stop docker #关闭命令
systemctl restart docker #重启命令
systemctl enable docker #设置开机自启动docker
docker version #查看docker版本
docker info #查看docker信息
4.3、镜像命令
镜像命令
docker images #查看服务器中docker镜像列表
docker search 镜像名 #搜索镜像
docker pull 镜像名:tag #拉取镜像,tag指定版本,默认是最新--docker pull mysql:5.7
--docker pull mysql:latest
docker rmi -f 镜像名/镜像ID #删除一个镜像
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部镜像,-a显示全部 -q只显示ID
docker image rm 镜像名/镜像ID #强制删除镜像--sudo docker image rm redis
docker save 镜像名/镜像ID -o 镜像保存的位置与名字 #保存镜像,将我们的镜像保存为tar压缩文件,然后在任意一台安装了docker服务上加载这个镜像
--sudo docker save tocmcat -o /opt/software/tomcat.tar
docker load -i 镜像保存的位置 #任何安装了docker的地方加载保存的镜像文件,将其复制成一个镜像到当前服务器--sudo docker load -i /opt/software/tomcat.tar
4.4、容器命令
docker ps #查看正在运行的容器列表
docker ps -a #查看所有容器,包含正在运行和已停止的
docker sotp 容器名/容器ID #停止容器
docker start 容器名/容器ID #启动容器
docker restart 容器名/容器ID #重启容器
docker kill 容器名/容器ID #kill 容器docker rm 容器名/容器ID #删除容器
docker cp 容器名/容器ID 容器内路径 容器外路径 #从容器内烤出
docker cp 容器外路径 容器名/容器ID 容器内路径 #从外部拷贝文件到容器内
docker logs -f --tail=要查看末尾多少行默认all 容器ID #查看容器日志---docker logs -f --tail=500 6dedababaa65
---docker logs --since 30m 6dedababaa65
docker exec -it 容器名/容器ID /bin/bash #修改容器配置需要进入容器内部,
--docker exec -id redis001 /bin/bash
docker container update --restart=always 容器名/者容器ID #更改容器随docker启动而启动
--sudo docker update mysql --restart=always
docker rename 容器名或者容器ID 新的容器名 #容器重命名--sudo docker rename mysql tars-mysql
docker inspect 容器名或者容器ID #查看容器详细信息
--sudo docker inspect myredis
4.5、运维命令
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 '<none>’|aek 'print $3'' #查看名称或标签未none的镜像
docker system prune -a #清除所有无容器使用的镜像
4.6、docker rum命令详解
每个Docker容器都是独立和安全的应用平台(可以理解为:每个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间,也可以理解为服务器)
Docker每个容器之间都是隔离的。我们甚至可以在一个服务器上,使用docker镜像,跑出N个mysql示例,(尽管他们默认端口都是一样的,但容器间环境是隔离的,A容器中3306和B容器中的3306毫无关系,因为其不在一个世界)
默认情况下,我们无法通过宿主机(安装docker的服务器)端口来直接访问容器,因为docker容器自己开辟的端口与宿主机端口没有关系。如果外部想要访问容器,必须让容器中的端口与宿主机的端口简历关联绑定关系,正式概念叫做:容器端口映射,有了端口映射,我们就可以将宿主机端口与容器端口绑定起来,
比如:我们简历宿主机的6379端口与容器redis6379的端口绑定,那么访问宿主机ip的6379就可以访问到对应的容器docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
docker start:是重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
docker run:创建新容器的时候使用,相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。docker run -p 3307:3306 \
--net=tars \
--ip="192.168.179.2" \
--name tars-mysql \
-v /opt/software/dmysql/conf:/etc/mysql/conf.d \
-v /opt/software/dmysql/logs:/logs \
-v /opt/software/dmysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=thinkive \
-d mysql:5.7
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"
使用普通用户运行docker,通过 root命令执行sudo chmod a+rw /var/run/docker.sock,再切换普通用户即可