Docker三剑客介绍
官方定义1:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。
官方定义2:k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
传统的虚拟技术,在将物理硬件虚拟成多套硬件后,需要再每套硬件上都部署一个操作系统,接着在这些操作系统上运行相应的应用程序。而Docker容器内的应用程序进程直接运行在宿主机(真实物理机)的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于未经虚拟化的宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。
每个集群有多个节点,每个节点可创建多个容器,kuberbete就是管理这些应用程序所在的小运行环境(container)而生。
docker-machine是解决docker运行环境问题。docker技术是基于Linux内核的cgroup技术实现的,那么问题来了,如果在非Linux平台上使用docker技术需要依赖安装Linux系统的虚拟机。docker-machine就是docker公司官方提出的,用于在各种平台上快速创建具有docker服务的虚拟机的技术。你可以把它理解为virtualbox或者vmware,最开始在win7上用得比较多,但是win10开始自带了hyper-v虚拟机,已经不再需要docker-machine了,docker可以直接运行在安装了Linux系统得hyper-v上。
dcoker-compose主要是解决本地docker容器编排问题。一般是通过yaml配置文件来使用它,这个yaml文件里能记录多个容器启动的配置信息(镜像、启动命令、端口映射等),最后只需要执行docker-compose对应的命令就会像执行脚本一样地批量创建和销毁容器。
docker-swarm是解决多主机多个容器调度部署得问题。swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。swarm技术相当不成熟,很多配置功能都无法实现,只能说是个半成品,目前更多的是使用Kubernetes来管理集群和调度容器。
总结:如果你是在非Linux环境下考虑使用docker-compose,当然我更推荐使用hyper-v或者virtualbox。如果你需要同时操作多个容器,或者希望使用配置文件记录容器启动命令参数,那么推荐使用docker-compose。如果你需要在多台主机上部署docker容器,并对其进行调度,那么swarm是一种选择,当然更推荐Kubernetes。
Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器
Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的
Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,当然也有自己一些不一样的特点。这个就像是Eclipse和IDEA一样,也是一个跨主机的容器管理平台。它是谷歌公司根据自身多年运维经验研发一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。
既然这两个东西是一样的,那就面临选择的问题,应该学习哪一个技术呢?实际上这两年Kubernetes已经成为了很多大公司的默认使用的容器管理技术,而Docker Swarm已经在这场与Kubernetes竞争中已经逐渐失势,如今容器管理领域已经开始已经逐渐被Kubernetes一统天下了。所以建议大家学习的时候,应该多考虑一下这门技术在行业里面是不是有很多人在使用。需要注意的是,虽然Docker Swarm在与Kubernetes的竞争中败下阵来,但是这个跟Docker这个容器引擎没有太大关系,它还是整个容器领域技术的基石,Kubernetes离开他什么也不是。
总结Docker是容器技术的核心、基础,Docker Compose是一个基于Docker的单主机容器编排工具,功能并不像Docker Swarm和Kubernetes是基于Dcoker的跨主机的容器管理平台那么丰富。
Docker环境安装
安装yum-utils:
yum install -y yum-utils
安装依赖
yum install -y device-mapper-persistent-data lvm2
##yum install -y device-mapper-persistent-data lvm2 net-tools vim lrzsz tree screen lsof tcpdump wget ntpdate
为yum源添加docker仓库位置:
yum repolist
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker:
yum install -y docker-ce
启动docker:
systemctl start docker
Docker镜像常用命令
docker search java
docker pull java:8
由于docker search命令只能查找出是否有该镜像,不能找到该镜像支持的版本,所以我们需要通过docker hub来搜索支持的版本。
进入docker hub的官网,地址:https://hub.docker.com
然后搜索需要的镜像:
查看镜像支持的版本:
进行镜像的下载操作:
docker pull nginx:1.17.0
docker images
指定名称删除镜像
docker rmi java:8
指定名称删除镜像(强制)
docker rmi -f java:8
删除所有没有引用的镜像
docker rmi `docker images | grep none | awk '{print $3}'`
强制删除所有镜像
docker rmi -f $(docker images)
Docker容器常用命令
docker run -p 80:80 --name nginx -d nginx:1.17.0
-d选项:表示后台运行
--name选项:指定运行后容器的名字为nginx,之后可以通过名字来操作容器
-p选项:指定端口映射,格式为:hostPort:containerPort
列出运行中的容器:
docker ps
列出所有容器
docker ps -a
# $ContainerName及$ContainerId可以用docker ps命令查询出来
docker stop $ContainerName(或者$ContainerId)
比如:
docker stop nginx
#或者
docker stop c5f5d5125587
docker kill $ContainerName(或者$ContainerId)
docker start $ContainerName(或者$ContainerId)
先查询出容器的pid:
docker inspect --format "{{.State.Pid}}" $ContainerName(或者$ContainerId)
根据容器的pid进入容器:
nsenter --target "$pid" --mount --uts --ipc --net --pid
删除指定容器:
docker rm $ContainerName(或者$ContainerId)
按名称删除容器
docker rm `docker ps -a | grep mall-* | awk '{print $1}'`
强制删除所有容器;
docker rm -f $(docker ps -a -q)
查看当前全部日志
docker logs $ContainerName(或者$ContainerId)
动态查看日志
docker logs $ContainerName(或者$ContainerId) -f
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $ContainerName(或者$ContainerId)
docker container update --restart=always $ContainerName
docker cp /etc/localtime $ContainerName(或者$ContainerId):/etc/
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-d nginx:1.17.0
查看指定容器情况:
docker stats $ContainerName(或者$ContainerId)
查看所有容器情况:
docker stats -a
docker system df
docker exec -it $ContainerName /bin/bash
docker exec -it --user root $ContainerName /bin/bash
docker network create -d bridge my-bridge-network
查看Docker镜像的存放位置:
docker info | grep "Docker Root Dir"
关闭Docker服务:
systemctl stop docker
移动目录到目标路径:
mv /var/lib/docker /mydata/docker
建立软连接:
ln -s /mydata/docker /var/lib/docker
Docker-compose环境安装
下载Docker Compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改该文件的权限为可执行
chmod +x /usr/local/bin/docker-compose
查看是否已经安装成功
docker-compose –version
使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用;
使用docker-compose.yml定义需要部署的应用程序服务,以便执行脚本一次性部署;
使用docker-compose up命令将所有应用服务一次性部署起来。
Docker-compose常用命令
指定运行的镜像名称
#运行的是mysql5.7的镜像
image: mysql:5.7
配置容器名称
#容器名称为mysql
container_name: mysql
指定宿主机和容器的端口映射(HOST:CONTAINER)
#将宿主机的3306端口映射到容器的3306端口
ports:
- 3306:3306
将宿主机的文件或目录挂载到容器中(HOST:CONTAINER)
#将外部文件挂载到myql容器中
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql
配置环境变量
#设置mysqlroot帐号密码的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root
连接其他容器的服务(SERVICE:ALIAS)
#可以以database为域名访问服务名称为db的容器
links:
- db:database
Docker compose常用命令
# -d表示在后台运行
docker-compose up -d
docker-compose -f docker-compose.yml up -d
docker-compose stop
docker-compose ps
Docker Compose将所管理的容器分为三层,工程、服务及容器。docker-compose.yml中定义所有服务组成了一个工程,services节点下即为服务,服务之下为容器。容器与容器直之间可以以服务名称为域名进行访问,比如在mall-tiny-docker-compose服务中可以通过jdbc //db:3306这个地址来访问db这个mysql服务。
version: '3' services: # 指定服务名称 db: # 指定服务使用的镜像 image: mysql:5.7 # 指定容器名称 container_name: mysql # 指定服务运行的端口 ports: - 3306:3306 # 指定容器中需要挂载的文件 volumes: - /mydata/mysql/log:/var/log/mysql - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql # 指定容器的环境变量 environment: - MYSQL_ROOT_PASSWORD=root # 指定服务名称 mall-tiny-docker-compose: # 指定服务使用的镜像 image: mall-tiny/mall-tiny-docker-compose:0.0.1-SNAPSHOT # 指定容器名称 container_name: mall-tiny-docker-compose # 指定服务运行的端口 ports: - 8080:8080 # 指定容器中需要挂载的文件 volumes: - /etc/localtime:/etc/localtime - /mydata/app/mall-tiny-docker-compose/logs:/var/logs |
注意:如果遇到mall-tiny-docker-compose服务无法连接到mysql,需要在mysql中建立mall数据库,同时导入mall.sql脚本。具体参考使用Dockerfile为SpringBoot应用构建Docker镜像中的运行mysql服务并设置部分。
使用maven插件构建mall-tiny-docker-compose镜像
注意:构建有问题的可以参考使用Maven插件为SpringBoot应用构建Docker镜像
先将docker-compose.yml上传至Linux服务器,再在当前目录下运行如下命令:
docker-compose up -d
访问接口文档地址http://192.168.3.101:8080/swagger-ui.html: