Docker概念、作用、术语
一张超级形象的图
看到这张图,大家会想到什么?
可以这么理解:大海是操作系统,鲸鱼是Docker,集装箱是在Docker 运行的容器!
概念
百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
作用
Docker简化了环境部署和配置,实现“一次构建,处处运行”,避免了因运行环境不一致而导致的异常
常用术语
Docker主机(Host):安装了Docker程序的主机,运行Docker守护进程
Docker镜像 (Image)--类似面向对象中的类:将软件环境打包好的模板,用来创建容器的,一个镜像可以创建多个容器
Docker容器(Container)--类似面向对象中的实例:运行镜像后生成的实例称为容器,每运行一次镜像就会产生一个容器,容器可以启动、停止或删除;容器使用是沙箱机制,互相隔离,是独立是安全的;可以把容器看作是一个简易版的Linux环境,包括用户权限、文件系统和运行的应用等;
Docker仓库 (Repository):用来保存镜像的,仓库中包含许多镜像,每个镜像都有不同的标签Tag<版本>,官方仓库: https://hub.docker.com/
使用Docker的步骤
1.安装Docker 2.从Docker仓库中下载软件对应的镜像 3.运行这个镜像,此时会生成一个Docker容器 4.对容器的启动/停止
下面进入实操,建议通过云服务器来练习:https://www.cnblogs.com/uncleyong/p/12694334.html
Docker安装及配置
环境要求
Docker要求CentOS7,必须是64位, 且内核是3.10及以上
或者看这里:http://www.docker.org.cn/book/install/rhel-docker-dependance-28.html
安装centos7(安装文件加Q群获取):https://www.cnblogs.com/uncleyong/p/10739997.html
查看内核信息,满足docker安全要求
uname -r
安装
卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
另外,还要删除镜像/容器等:rm -rf /var/lib/docker
否则,已有的镜像/容器删除不掉
另外,如果误删了目录rm -rf /var/lib/docker
systemctl restart docker,重启docker后会生成目录
否则拉取镜像报错
安装docker-ce
https://docs.docker.com/install/linux/docker-ce/ubuntu/
安装所需软件包
设置镜像仓库
如果报错
改为
生成缓存
安装
查看版本
可以看到是go语言写的
docker version
启动
systemctl start docker
查看状态
systemctl status docker
docker info
停止
systemctl stop docker
重启
systemctl restart docker
设置开机启动
systemctl enable docker
验证
验证是否正确安装了docker,方法是运行hello-world镜像
本地没有hello-world镜像,就从远程拉
docker run
配置镜像加速器
登录阿里云获取镜像加速器地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
配置自己的docker加速器
最后执行重启命令:
Docker操作(镜像、容器、更新构建镜像)
镜像操作
查找
docker search 镜像名
参数说明: NAME: 镜像仓库源的名称 DESCRIPTION: 镜像的描述 OFFICIAL: 是否 docker 官方发布 stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。 AUTOMATED: 自动构建。
也可以通过docker官网搜索mysql
点击查看详情
查看可以标签
拉取
docker pull 镜像名:版本,如果版本不指定,默认就是latest
拉取完成
查看所有本地镜像
docker images
各个选项说明: REPOSITORY:表示镜像的仓库源 TAG:镜像的标签(版本) IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小
查看完整镜像id,可以加--no-trunc参数
获取镜像详细信息
docker inspect 镜像id
上面id才是镜像的完整id
版本
端口
msyql数据文件
删除指定的本地镜像
docker rmi -f 镜像id或者镜像名:tag,rmi全英文是remove image,-f表示强制删除
容器操作
运行容器
只有200M,是精简版centos(linux),只包含系统运行最基本的内核和库
@后面是容器的id
退出并关闭容器
容器中,很多命令没有,比如ifconfig,可以这样安装:yum install -y net-tools
查看容器
docker ps -a
可以看到状态是Exited
-q,只显示容器id
docker ps -aq
启动容器
docker start
只显示运行的,docker ps
停止容器
docker stop
删除容器
docker rm
一个镜像可以生成多个容器,启动时不指定名称,名称是是随机定义的
批量删除容器
docker rm -f $(docker ps -aq)
示例(含docker commit方式更新镜像)
不能访问,因为tomcat不是直接跑在虚拟机上的,而是跑在虚拟机上docker里面容器里的
192.168.0.105:8080
删除容器
docker rm
运行容器
可以访问,但是报404
192.168.0.105:9999
加入容器
如果报错,可能版本是1.13.1 ,升级到ce版本可以解决,详见:本文安装docker部分
也可以根据docker官方文档配置yum源,重新安装,https://docs.docker.com/install/linux/docker-ce/centos/
下面两个图就是我之前安装的docker
如果是ce版本,就没问题,如下图
进入webapps文件夹,是空的(tomcat默认的欢迎页面实际上放在的路径应该是webapps/ROOT/index.jsp或者index.html),旁边还有个webapps.dist的文件,进入才发现原本应该在webapps文件中的文件都在webapps.dist文件中。所以将webapps.dist重命名为webapps。
改名后
更新镜像:docker commit
将修改后的容器提交生成一个新镜像
-m是描述,-a是作者
通过新镜像,运行容器
加上版本
访问,成功
192.168.0.105:8888
tomcat后台运行,-d
先删除容器
返回了完整容器id
查看,docker ps
只显示12位容器id
停止
启动
查看日志
docker logs 容器id或者容器名称
下面看到的就是tomcat的启动日志
拷贝
宿主机拷贝到容器中
docker cp
可以访问到
192.168.0.105:8888
容器拷贝到宿主机
拷贝到当前目录
在宿主机中可以看到
挂载
共享目录,运行下面的命令
docker run --name mytomcat2_con -p 8888:8080 -v /root/docker_test/tomcat/mydata:/usr/local/tomcat/mydata -d mytomcat2:v2
mydata目录在容器中会自动创建,可以看到宿主机对应目录下的文件
容器中新增2.txt,3.txt
宿主机中可以看到容器中新增的文件
获取元信息
docker inspect 容器id
默认是rw,表示读写,如果容器中不能改,可以改为只读ro
-v /root/docker_test/tomcat/mydata:/usr/local/tomcat/mydata:ro
包含了jdk
创建镜像(含Dockerfile讲解、自定义镜像)
创建镜像的方式
更新镜像:使用docker commit命令,详见本文容器操作部分,可以文中搜索commit
构建镜像:使用docker build命令,需要创建Dockerfile文件,下面讲解
Dockerfile
Dockerfile是用来构建Docker镜像的文件,是由一系列指令和参数构成的脚本,从FROM命令开始,紧接着各种命令、参数等,最终会生成一个新的镜像。
第一条指令必须是FROM,指定Base Image基础镜像,指令按从上往下的顺序,依次执行,每条指令都会创建一个新的镜像层并提交
常用指令
FROM:指定基础镜像,即当前新镜像是基于哪个镜像的 MAINTAINER:指定作者 RUN:指定镜像构建过程中要运行的命令 ENV:设置环境变量 WORKDIR:指定默认的工作目录,即进入容器后默认进入的目录 VOLUME:创建挂载点,也称容器数据卷,用于数据共享和持久化 CMD:指定容器启动时要运行的命令,与RUN不同的是, 这些命令不是在镜像构建过程中执行的 ENTRYPOINT:指定容器启动时要运行的命令 COPY:拷贝文件/目录到镜像中 ADD:拷贝文件到镜像中,且会自动解压缩 EXPOSE:指定对外暴露的端口
我们来看下官方tomcat的Dockerfile是如何写的
指定基础镜像、环境变量
暴露端口8080
运行容器,就把tomcat启动起来
自定义tomcat镜像
有时候,官方提供的镜像不一定满足我们的需求,我们想用自己期望的jdk、tomcat版本,那么,我们可以基于一个精简版centos来制作
FROM centos MAINTAINER qzcsbj # 拷贝文件 ADD jdk-8u211-linux-x64.tar.gz /usr/local ADD apache-tomcat-9.0.19.tar.gz /usr/local # 配置环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_211 ENV CLASSPATH .:$JAVA_HOME/lib ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.19 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin WORKDIR $CATALINA_HOME EXPOSE 8080 # 镜像运行容器就把tomcat启动起来 CMD ["catalina.sh", "run"]
运行容器
docker run --name qzcsbj_tomcat -p 8181:8080 -d qzcsbj/tomcat:1.0
192.168.0.105:8181
把自定义镜像推送到镜像仓库
创建命名空间
创建镜像仓库
镜像推送到阿里云
下面给了login、push、pull的命令
1. 登录阿里云Docker Registry $ sudo docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com 用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。您可以在访问凭证页面修改凭证密码。 2. 从Registry中拉取镜像 $ sudo docker pull registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[镜像版本号] 3. 将镜像推送到Registry $ sudo docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[镜像版本号] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:[镜像版本号] 请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
设置登录阿里云的docker仓库密码
登录
docker login --username=qzcsbj registry.cn-hangzhou.aliyuncs.com
指定镜像tag归入仓库
docker tag ab8ba635b677 registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
将镜像推送到仓库
docker push registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
push成功
push的镜像
层信息
搜索镜像
镜像信息
也可以修改信息
实战1:使用Docker搭建环境
安装tomcat,部署war包
拉取刚刚push的tomcat镜像
docker pull registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
war包在Q群文件
运行容器
docker run --name qzcsbj_tomcat4 -p 8184:8080 -v /root/my_docker/qzcsbj_springboot_war.war:/usr/local/apache-tomcat-9.0.19/webapps/qzcsbj_springboot_war.war -d registry.cn-hangzhou.aliyuncs.com/qzcsbj/tomcat:v1.0
192.168.0.105:8184/qzcsbj_springboot_war/test
war包对应的代码:
安装mysql、nginx、redis
安装方式都差不多(创建挂载目录,拷贝并修改配置文件)
详细步骤略,如有问题,请联系作者。
建议通过云服务器来练习:https://www.cnblogs.com/uncleyong/p/12694334.html
实战2:Docker+JMeter+Grafana+Influxdb搭建可视化性能测试监控平台
详见:
https://www.cnblogs.com/uncleyong/p/11885192.html
常用命令回顾
具体含义见下图官方解释。
docker version
docker info
docker search
docker pull
docker images
docker rmi
docker run
docker logs
docker ps
docker exec
docker start
docker restart
docker stop
docker status
docker rm
docker commit
docker build
docker inspect
docker cp
docker login
docker tag
docker push
更多:
最后记录一个问题
运维角度用docker:https://www.cnblogs.com/uncleyong/p/10069429.html
参考资料:https://www.runoob.com/docker/docker-tutorial.html