如存在问题 或有更好建议 请联系 作者QQ: 2940500
Docker的安装使用 并不难 之前 就会的 但是也是很久没有用过 最近回忆起来发现好多地方都已经记得不是很清楚 模模糊糊 整理这个笔记也是 加深印象,重新巩固一下
本文是一些个人的学习总结和粗浅理解 如有错误或描述模糊的地方欢迎指正或指出
本文从在Windows环境使用virtualbox安装CentoOS虚拟机开始
===============================正文开始=============================
文中使用到的一些工具:
链接:https://pan.baidu.com/s/1S9Se5z8bqd-2ixjLpUK9EA
提取码:stn3
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ,简单来说就是虚拟机 但是又和虚拟机有很大的不同
1.虚拟机是在宿主机的基础上虚拟出自己的一套硬件信息,而Docker使用的还是原宿主机的硬件信息,对进程进行隔离,封装成容器 (比较绕,有更好的解释的小伙伴请回复一下)
2.虚拟机占用资源多,运行效率低 ,Docker占用资源少 效率高
在开发过程中 我们一般都是把写好的代码打包然后交给 运维人员来进行项目的部署
开发人员 -----war包(jar包)-------> 运维人员 -------war包(jar包)-----> 部署到服务器
但是!
经常会存在(时有发生) 项目在开发人员这里是可以正常运行 没有异常问题的, 但是当运维人员部署到服务器后 就会出现异常或其他不应该出现的问题,
在开发人员没有给错包 运维人员没有变动包的情况下 出现这个问题的原因就很显然: 开发环境 \ 生产环境的不同导致的(如果环境也一样 还是出现问题 建议以下步骤 关机 --> 拔电源 --> 拿出锤子 --> ...)
那么怎么统一开发环境和生产环境的不同呢?
1. 将开发环境的所有版本信息(JDK,Mysql,Tomcat ,操作系统,软件信息,甚至是配置,等等等)告诉运维人员 然后由运维人员 来对所有服务器进行一一配置 (如果集群环境的话那就不敢想象工作量)
2. 将生产环境版本信息告诉开发人员 由开发人员来配置自己的开发环境
但是这两种方式 好像都不怎么和谐
于是 Docker 出现了
开发人员可以将自己开发环境 进行打包成一个镜像, 然后发布到Docker仓库 运维人员 通过Docker运行镜像就可以获得和开发人员相同的软件环境 从而避免环境问题导致的错误异常
Docker可以实现 ''一次构建 处处运行''
在Windows上使用Linux 可以使用Oracle 提供的免费的虚拟机 VirtualBox( 直接Windows环境也可以安装Docker )
CentOS操作系统下载:https://www.centos.org/download/
Docker 中文官网:https://www.docker-cn.com
文档地址:https://docs.docker-cn.com/
(一般Docker CE版(社区版)就能正常的满足需求) 专业版和付费版差别不大
Docker 支持的操作系统:
拿CentOS来说:
Docker CE版 在CentOS 的操作系统要求是 必须是64位操作系统 Docker对不同系统要求不同 可以再上边的官网了解一下
常用命令:
cat /proc/cpuinfo # 查看cpu信息
cat /proc/meminfo # 查看内存信息
uname -r # 查看内核信息,Docker要求CentOS必须是64位,且内核是3.10及以上
sudo reboot # 重启,sudo表示以管理员root身份执行
sudo halt # 关机
我是使用的windows系统然后在本系统上装了一个Linux的虚拟机
开始:
官网地址:https://www.virtualbox.org/
我使用的是VirtualBox Windows 5.2.20版本
安装步骤略过无脑下一步即可无特殊注意的地方
下载成功后打开:
选择镜像文件
如果自己创建的主机 最后在主机里 使用 ip addr 命令 不给显示192.xx.xx.xx 这样的端口 就退出虚拟机重新进一下 再使用 ip addr命令查看 是否被分配了 ip 如果还没有!!! 就使用我给的CentoOS系统文件吧
要让其重新初始化网卡不然会导致虚拟机无法外部访问 无法联网的问题
( 如果是使用的我给的 CentoOS系统文件 导入后就直接打开然后 会弹出一个让你修改网络的窗口 然后修改就行了)
安装好后进入系统:
使用 ip addr命令查看网络环境
# 设置yum源
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加yum源(官方)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 添加yum源(阿里) 推荐使用这一条 官方的太慢了
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 生成缓存 更新yum软件包索引
yum makecache fast
# 安装Docker-CE
yum -y install docker-ce
使用 docker version命令查看版本
docker version # 查看版本
systemctl start docker # 启动
systemctl stop docker # 停止
systemctl status docker # 查看状态
systemctl restart docker # 重启
systemctl enable docker # 设置开机自动启动
# 验证,运行hello-world
docker run hello-world # 下载hello-world镜像并运行
(1).登陆阿里云开发者平台
http://dev.aliyun.com
(2). 查看专属加速地址
收藏之后就会在左侧导航栏展示方便下次进入查看
操作 | 命令 | 说明 |
---|---|---|
查找 | docker search 关键字 | 可以在Docker Hub网站查看镜像的详细信息,如镜像的tag标签 |
抽取 | docker pull 镜像名:tag | :tag表示软件的版本,如果不指定默认是latest |
列表 | docker images | 查看所有本地镜像 |
获取元信息 | docker inspect 镜像id | 获取镜像的元信息,详细信息 |
删除 | docker rmi -f 镜像id或镜像名:tag | 删除指定的本地镜像,-f表示强制删除 |
不使用 (docker search 关键字) 命令 也可以在https://hub.docker.com/search 来搜索所需要的docker镜像
操作 | 命令 | 说明 |
---|---|---|
运行 | docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像id或镜像名称:tag | --name 指定容器名,名称自定义,如果不指定会自动命名; -i 以交互模式运行,即以交互模式运行容器;-t 分配一个伪终端,即命令行,通常组合使用-it ;-p 指定端口映射,将主机端口映射到容器内的端口;-d 表示后台运行,即守护式运行容器;-v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读 |
列表 | docker ps -a -q | 查看正在运行的容器,-a表示显示所有容器,-q表示只显示容器id |
启动 | docker start 容器id或容器名称 | 启动容器 |
停止 | docker stop 容器id或容器名称 | 停止正在运行的容器 |
删除 | docker rm -f 容器id或容器名称 | 删除容器,-f表示强制删除 |
日志 | docker logs 容器id或容器名称 | 获取容器的日志 |
在容器中执行 | docker exec -it 容器id或容器名称 /bin/bash | 进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作 |
拷贝文件 | docker cp 主机中的文件路径 容器id或容器名称:容器路径;docker cp 容器id或容器名称:容器中的文件路径 主机路径 | 将文件中的文件拷贝到容器中;将容器中的文件拷贝到主机中 |
获取元信息 | docker inspect 容器id | 获取容器的元信息 |
1. 拉取tomcat容器
2. 启动tomcat
启动成功:
然后在宿主机地址进行访问: 发现还是无法访问
停止Tomcat 然后重新启动tomcat
docker run -p 8888:8080 -d tomcat
(-d 是设置该容器后台运行 )
这里的tomcat是镜像的名字 也可以是id
然后再通过docker地址进行访问进行访问(网上有很多人是通过宿主机(我是在windows上装的Linux虚拟机 这里的宿主机指的我的windows主机)地址来进行访问) 而我是通过宿主机的ip就是访问不了 要通过 Linux环境的地址来进行访问 (可能是网络环境等等一系列的问题导致吧,出现这个原因有很多,这个不一定别人的一定是对的 也不一定我的一定是对的 应该说两个都是对的 建议在访问时 两个都试一下)
(1)先基于镜像创建一个容器
docker run --name mytomcat -p 8080:8080 -d tomcat
(2) 查看镜像ID
docker ps -a
(3) 编辑镜像
eb3257561d9e 为我的容器id
docker exec -it eb3257561d9e /bin/bash
cd webapps/ROOT
rm -f index.jsp
echo 这是一个Docker Demo > index.html
exit
(4) 提交镜像 语法:docker commit -m="描述消息" -a="作者" 容器id或容器名 镜像名:tag
docker commit -m="自定义Tomcat镜像Demo" -a="QSSSYH" eb3257561d9e qsssyh/tomcat:v1
看到返回自定义的镜像信息即为创建成功
(5)测试自定义更新的镜像
docker run --name tomcat_v1 -p:8888:8080 -d qsssyh/tomcat:v1
(6) 访问(id还是docker的远程连接地址 和上边的不一样是因为这段文字是在公司弄得 网络环境变了 又重新分配了一个静态ip给我):
根据Dockerfile文件来自动构建镜像
Dockerfile是一个包含创建镜像所有命令的文本文件,使用docker build命令可以根据Dockerfile的内容创建镜像
(1) 在根目录创建 Dockerfile 文件
vi Dockerfile
(2) 编辑Dockerfile 文件 文件中以#开头为注释
# 基础镜像
FROM tomcat
# 作者
MAINTAINER qq2940500
# 执行命令
RUN rm -f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html
(3) 构建新镜像,语法:docker build -f Dockerfile文件的路径 -t 镜像名:tag 命令执行的上下文
最后的 . 符号是执行上下文的语法 必须要有的
docker build -f Dockerfile -t qsssyh/tomcat:v2 .
可以看到镜像已经构建完成
(4)启动 并测试是否启动成功
(1) 登陆阿里云控制台 打开Docker镜像服务
dev.aliyun.com
(2)创建命名空间和镜像仓库
选择为本地仓库 然后创建
点击管理可以查看进行操作指示
(3)将镜像推送到阿里云
输入完指令之后
会让你输入阿里云的镜像仓库管理密码 注意这里的密码不是阿里云登录密码
(4) 推送镜像到阿里云 [ImageId] 为tomcat 在Docker仓库中的 ID
# 1 将指定镜像归入阿里云的某个仓库中
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:[镜像版本号]
# 例:
docker tag af513fea93fb registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:v2
# 2 推送到阿里云
docker push registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:[镜像版本号]
# 例: 这个v2版本号 不一定要和本地一致
docker push registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:v2
可以看到推送完成:
然后到阿里云镜像管理这边就可以搜索到刚刚上传的镜像文件
有两个是因为 之前执行这个命令生成的 docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:[镜像版本号]
(为了测试 我把原来这些自己创建的颈项全部删除 可以选做)
(5)关闭运行的主机 如果出现这个异常 可以使用 docker rm -f $(docker ps -aq) 命令删除所有正在运行的容器的命令
(7) 加载刚刚我们上传到阿里云的镜像
# pull后的地址 是阿里云生成的镜像地址 可以到阿里云看自己的镜像地址
docker pull registry.cn-shanghai.aliyuncs.com/qsssyh/tomcat:v2
(9)访问
Docker命令汇总:
docker version # 查看版本
systemctl start docker # 启动
systemctl stop docker # 停止
systemctl status docker # 查看状态
systemctl restart docker # 重启
systemctl enable docker # 设置开机自动启动
# 验证,运行hello-world
docker run hello-world # 下载hello-world镜像并运行
操作 | 命令 | 说明 |
---|---|---|
查找 | docker search 关键字 | 可以在Docker Hub网站查看镜像的详细信息,如镜像的tag标签 |
抽取 | docker pull 镜像名:tag | :tag表示软件的版本,如果不指定默认是latest |
列表 | docker images | 查看所有本地镜像 |
获取元信息 | docker inspect 镜像id | 获取镜像的元信息,详细信息 |
删除 | docker rmi -f 镜像id或镜像名:tag | 删除指定的本地镜像,-f表示强制删除 |
操作 | 命令 | 说明 |
---|---|---|
运行 | docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像id或镜像名称:tag | --name 指定容器名,名称自定义,如果不指定会自动命名; -i 以交互模式运行,即以交互模式运行容器;-t 分配一个伪终端,即命令行,通常组合使用-it ;-p 指定端口映射,将主机端口映射到容器内的端口;-d 表示后台运行,即守护式运行容器;-v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读 |
列表 | docker ps -a -q | 查看正在运行的容器,-a表示显示所有容器,-q表示只显示容器id |
启动 | docker start 容器id或容器名称 | 启动容器 |
停止 | docker stop 容器id或容器名称 | 停止正在运行的容器 |
删除 | docker rm -f 容器id或容器名称 | 删除容器,-f表示强制删除 |
日志 | docker logs 容器id或容器名称 | 获取容器的日志 |
在容器中执行 | docker exec -it 容器id或容器名称 /bin/bash | 进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作 |
拷贝文件 | docker cp 主机中的文件路径 容器id或容器名称:容器路径;docker cp 容器id或容器名称:容器中的文件路径 主机路径 | 将文件中的文件拷贝到容器中;将容器中的文件拷贝到主机中 |
获取元信息 | docker inspect 容器id | 获取容器的元信息 |
阿里云Docker安装文档:https://yq.aliyun.com/articles/110806