1.docker简介
Docker使用客户端-服务器(C/S)构架模式,使用远程API来管理和创建Docker容器
(1)镜像:
Docker镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了Apache或者用户需要的其他应用程序。镜像可以用来创建Docker容器 ,一个镜像可以创建很多容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
(2)仓库:
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有(Private)两种形式。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括时速云、网易云等,可以提供大陆用户更稳定快速的访问。当然用户也可以在本地网络创建一个私有仓库。当用户创建了自己的镜像后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另一台机器上使用这个镜像的时候,只需要从仓库上pull下来就可以了。
(3)容器
Docher利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版本的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
如果我们使用面向对象的思想理解的话,镜像即为类,容器则是对象。
(4)Docker Machine
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker。Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用Docker Machine命令管理这个宿主机。使用docker-machine命令,可以启动、审查、停止、重启托管的docker,也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。Docher Machine也可以集中管理所有的docker主机。
2.docker部署
2.1 linux系统下部署docker
Step1:检查linux操作系统的版本及其内核版本,需要是centos7--64,内核版本3.10以上
Step2:检查是否有历史安装记录yum list installed |grep docker
Step3:安装依赖包:yum install -y yum-utils device-mapper-persistent-data lvm2
Step4:配置yum镜像源,增加国内镜像源:
yum -config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Yum makecache fast
Step5:安装docker:yum -y install docker-ce
Step6:启动docker服务:systemctl list-unit-files |grep docker或者systemctl start docker
Step7:查看docker是否开机自启动:systemctl list-unit-files |grep docker
systemctl enable docker #设置docker为开机自启动
Step8:关闭或者重启docker
Step9:优化docker的镜像,设置docker加速
vi /etc/docker/daemon.json
l 重载配置文件:systemctl deamon-reload
l 配置完后重启docker生效:systemctl restart docker
Step10:查看镜像:docker images
2.2 windows下部署docker
Step1:下载并安装docker官网下载地址:http://docker.p2hp.com/
Step2:开启windows虚拟化和linux子系统
docker想要正常启动需要开启windows虚拟化和linux子系统(WSL2),并且安装linux子系统。
搜索控制面板->进入控制面板->程序->启用或关闭Windows功能->开启Windows虚拟化和linux子系统(WSL2)
Step3:安装linux子系统
微软官方下载地址:https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
Step4: 配置docker镜像加速器
另一个比较头疼的问题就是,在国内通过Docker Hub下载Docker镜像是非常慢的,慢到你无法忍受,其中原因大家都心知肚明。一个解决方案是在Docker CE的配置文件中设定本地的Docker Registry镜像链接,比如可以使用阿里云提供的链接地址。此时,需要登录阿里云并创建一个个人账号,然后按照https://yq.aliyun.com/articles/29941一文中的介绍,登录容器Hub服务的控制台,然后点击“Docker Hub镜像站点”,拷贝专属加速器地址然后配置到/etc/docker/daemon.json文件中即可。具体方法可以按照上面的链接做。
配置镜像加速器:
针对安装了Docker Toolbox的用户,您可以参考以下配置步骤:
创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。
docker-machine create --engine-registry-mirror=https://xxxxx.mirror.aliyuncs.com -d virtualbox default
查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。
docker-machine env defaulteval "$(docker-machine env default)"docker info
针对安装了Docker for Windows的用户,您可以参考以下配置步骤:
在系统右下角托盘图标内右键菜单选择
{
xxxxx.mirror.aliyuncs.com"]
}
编辑完成后点击
2.3 docker 常用命令
(1)容器相关
- docker create --name 容器名 镜像 #创建容器
- docker container ls -a #查看所有容器
- docker ps -a #显示运行后的容器,使用-a显示全部,不使用-a只显示运行的容器
- docker start 容器名 #启动容器
- docker restart 容器名 #重启容器
- docker run --name 容器名 镜像 #启动并运行容器
- docker run --name mysql -d --restart=always --privileged=ture -p 3306:ss3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
run命令常用选项说明:
-d, --detach=false, 指定容器运行于前台还是后台,默认为false
-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-u, --user="", 指定容器的用户
-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="", 指定容器的工作目录
-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, --env=[], 指定环境变量,容器中可以使用该环境变量
-m, --memory="", 指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
-h, --hostname="", 指定容器的主机名
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[], 添加主机设备给容器,相当于设备直通
--dns=[], 指定容器的dns服务器
--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="", 覆盖image的入口点
--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
--link=[], 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge", 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no", 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
选项参数
- docker stop 容器名|容器ID 停止容器 #停止容器
- ldocker pause 容器名 #暂停容器
- ldocker unpause 容器名 #将处于暂停状态的容器恢复到运行状态
- docker logs 容器名 #查看容器的运行日志
- docker rm [-f] 容器名|容器ID #删除容器,-f强制删除容器,即使容器是运行状态
- docker export -o xxxx.tar 容器名 #把容器导出成tar包
- docker import xxxx.tar username/程序名:版本号 #把tar包导入成镜像
- docker container inspect 容器名 #查看容器详情
- docker top [options] 容器名 #查看容器内的进程信息
- docker commit -p -a “author” -m “镜像简介” 容器名|ID 镜像名:tag #提交镜像文件
- docker save -o 镜像名.tar 容器名 #将容器保存成镜像文件,放在本地仓库
- docker attach 容器名 #进入容器
- docker exec -it 容器名 /bin/bash #进入容器的操作系统
- docker cp 本地文件路径 容器id|容器名:容器目录 #复制本地文件到docker中
- docker cp 容器id|容器名:文件路径 本地目录 #复制容器文件到本地路径
- docker diff 容器名 #查看文件系统变更
- docker container port 容器名 #查看端口映射
- docker top 容器名 #查看容器内进程
(2)镜像相关命令
- docker rmi 镜像名|镜像ID:[标签] #删除镜像
当一个镜像拥有多个标签的时候,docker rmi 镜像名:tag 命令只是删除了多个标签中的指定标签而已,并不影响镜像文件,当镜像文件只有一个标签时,会删除这个镜像。
- docker image prune [-a ,-filter ,-f] #清理临时镜像
-a:删除所有无用镜像,不光是临时镜像
-filter:只清理符合给定过滤器的镜像
-f,-force:强制删除镜像,而不进行提示确认
- docker search 镜像文件名:版本 #搜索镜像文件
- docker pull 镜像文件名|ID #拉取镜像
- docker images -a #查看本地所有镜像
- docker image ls #查看本地所有镜像
- docker tag 原镜像:镜像标签 新镜像名:新标签 #添加镜像标签
#例子:docker tag ubuntu:latest myutuntu:latest
添加的新标签与原标签实际上指向的是同一个镜像文件,只是别名不同而已。docker tag命令添加的标签实际上起到了类似链接的作用。
- docker inspect 镜像名:标签 #获取镜像的详细信息,包括制作者、适应构架、各层的数字摘要等:
#例子docker inspect centos:latest
- docker history 镜像名:tag #查看镜像历史
- 创建镜像的三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建
(1) 基于已有的容器创建
命令格式:docker commit [options] container [repository[:tag]]
options包括:
-a,--author=””:作者信息
-c,--change=[]:提交的时候执行dockerfile指令,包括cmd|entrypoint|env|expose|lable|onbulld|user|volume|workir等;
-m,--message=””:提交消息
-p,--pause=ture:提交时暂停容器运行
例:
C:\Users\wu>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 18 months ago 231MB
C:\Users\wu>docker run -it centos:latest /bin/bash
[root@bb66946c9448 /]# touch test
[root@bb66946c9448 /]# exit
Exit
C:\Users\wu>docker commit -m "added a new file" -a "yan" bb66946c9448 test:0.1
sha256:6f84776f687aa9165fb2a5703e118181483ee2570b9e3893bae382234cb51588
C:\Users\wu>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 6f84776f687a 25 seconds ago 231MB
centos latest 5d0da3dc9764 18 months ago 231MB
(2) 基于本地模板导入
命令格式:docker import [options] file|url| -[repository[:tag]]
例#docker import E:/2022-5-16/2/centos.tar centos:test1
(3) 基于dockerfile创建 #docker build -t Python:3
创建镜像的三种方法
- docker save -o路径/ xxxx.tar 镜像文件 #导出本地镜像文件到目标目录
- docker load --input xxxx.tar #导入tar 文件到本地镜像库
- docker push 镜像文件 #把镜像文件上传到仓库,前提要提前docker hub账户
2.4 使用docker部署环境
1.3.1 部署MySQL镜像
Step1:下载MySQL镜像
Docker search mysql:5.7
docker pull idyci/mysql
Step2:启动MySQL容器
docker run -d --name mysql57 -p 3308:3306 --restart=always --privileged=ture -e MYSQL_ROOT_PASSWORD=’123456’ idyci/mysql
参数解释:
-d:后台启动 -it:前端启动,送一个命令行界面 --name:容器名,自定义
-p 宿主端口:容器端口
--restart=always :伴随docker一起启动
--privileged=true:进入容器使用root权限
-e 设置项:设置环境变量
镜像文件名:一般放到命令的最后,要和本地镜像仓库里的名字一致
Step3:检查容器运行状态
docker ps -a #-a显示所有状态的容器,缺省的话只能看到运行中的容器
1.3.2部署tomcat
Step1:拉取tomcat镜像
docker search tomcat:8.5
docker pull kingchdu/centos_tomcat
Step2:运行tomcat的容器
docker run -d --name tomcat8 -p 8090:8080 -v 宿主目录:容器目录 镜像名
-v 宿主目标:容器目录:挂载目录,这里的作用是把tomcat的webapps挂载到宿主目录,方便我们在宿主目录操作它。