为什么要用Docker
比较了Docker和传统虚拟化方式VM的不同之处:
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
安装
-
确定你是Centos7及以上版本
cat /etc/redhat-release # CentOS Linux release 7.6.1810 (Core) uname -r # 3.10.0-957.el7.x86_64
-
卸载旧版本
-
yum安装gcc相关
yum -y install gcc gcc-c++
-
安装需要的软件包
yum -y install yum-utils
-
设置stable镜像仓库
# 这里使用的是阿里云的镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
# 可以不设置,只是让软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度 yum makecache faster # 如果使用了,但是觉得占用磁盘空间,可以删除 yum clean all
-
安装Docker
# 安装Docker引擎等 yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
启动Docker
# 启动docker systemctl start docker # 查看是否启动 ps -ef | grep docker # 查看版本 docker version
-
测试
运行hello-world镜像,实例化一个Docker容器 docker run hello-world
-
卸载
# 关闭docker systemctl stop docker # 卸载Docker引擎、CLI、Containerd和Docker Compose软件包。 yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin 删除所有的镜像、容器等 rm -rf /var/lib/docker rm -rf /var/lib/containerd
阿里镜像加速器
- 登录
阿里云
,进入控制台
,依次找到弹性计算
→容器服务
→容器镜像服务
→镜像服务
→镜像加速器
- 按照
操作文档
配置镜像加速器
常用命令
帮助启动类命令
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
docker 具体命令 --help
镜像
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
- 命令
# 列出本地主机上的镜像 # -a:列出本地所有的镜像(含历史映像层) # -q:只显示镜像ID docker images [-a] [-q] # 搜索远程仓库内的镜像 # --limit 数量:只列出前多少个 docker search 某个镜像名称 [--limit 5] # 下载镜像 # TAG:版本号,没有TAG表示最新版本 docker pull 某个镜像名称[:TAG] # 查看镜像/容器/数据卷所占的空间 docker system df # 删除镜像 # -f:强制删除 docker rmi [-f] 镜像名称[:TAG]/镜像ID # 删除所有镜像(慎用) docker rmi -f $(docker images -qa)
- commit操作
提交容器副本使之成为一个新的镜像
示例:docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[版本]
# 从Hub上下载ubuntu镜像到本地并成功运行 docker pull ubuntu docker images docker run -it ubuntu /bin/bash # 此时原始的默认ubuntu镜像是不带着vim命令的 # 安装vim apt-get update apt-get install vim # 安装完成后,commit我们自己的新镜像启动我们的新镜像并和原来的对比 docker commit -m="vim cmd add" -a="jf" f6ee663ae207 custom/ubuntu_vim:1.0.0 docker images # 测试 # 停止所有正在运行的容器 docker stop $(docker ps -q) docker ps docker images docker run -it 镜像ID /bin/bash vim a.txt
容器命令
- 从面向对象角度:
Docker利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动/开始/停止/删除。每个容器都是相互隔离的、保证安全的平台。- 从镜像容器角度:
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用租序。
-
有镜像才能创建容器,所以我们先下载一个镜像,这里以ubuntu为例
docker pull ubuntu
-
新建+启动容器
# --name:"容器新名字",为容器指定一个名称 # -it:启动交互式容器 ## -i:以交互模式运行容器,通常与-t同时使用 ## -t:为容器重新分配一个伪输入终端,通常与-i同时使用;即启动交互式容器(前台有伪终端,等待交互) # -d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行) # -P:随机端口映射,大写P # -p:指定端口映射,小写p # 使用ubuntu镜像,以交互模式启动一个容器,命名为u1,并在容器内执行/bin/bash命令 docker run -it --name=u1 ubuntu /bin/bash
-
列出正在运行的容器
# -a:列出当前所有正在运行的容器+历史上运行过的 # -l:显示最近创建的容器 # -n:显示最近n个创建的容器 # -q:静默模式,只显示容器编号 docker ps
-
退出容器
- 输入
exit
:容器停止 - 按住
ctrl+p+q
:容器不停止
- 输入
-
进入正在运行的容器并以命令行交互
# exec 是在容器中打开新的终端,并且启动新的进程,用exit退出,不会导致容器的停止。推荐 docker exec -it 容器ID/容器名 /bin/bash # attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。 docker attach 容器ID/容器名
-
启动/停止/重启容器
# 启动已停止运行的容器 docker start 容器ID/容器名 # 重启容器 docker restart 容器ID/容器名 # 停止容器 docker stop 容器ID/容器名 # 强制停止容器 docker kill 容器ID/容器名
-
删除容器
# 1. 先停止容器,再删除 docker stop 容器ID/容器名 docker rm 容器ID/容器名 # 2. 强制删除 docker rm -f 容器ID/容器名
-
导入导出容器
# export 导出容器的内容留作为一个tar归档文件 docker export 容器ID > 文件名.tar # import 从tar包中的内容创建一个新的文件系统再导入为镜像 cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
-
其他一些方法
# 打印某个后台运行容器的日志 docker logs 容器ID/容器名 # 查看容器内运行的进程 docker top 容器ID/容器名 # 查看容器内部细节 docker inspect 容器ID/容器名 # 从容器内拷贝内容到本地主机 docker cp 容器ID:容器内路径 主机目录
Docker 私有仓库
Docker Registry
# 下载镜像
docker pull registry
# 运行私有库Registry,相当于本地有个私有Docker hub
# Docker挂载主机目录访问如果出现cannot open directory : Permission denied
# 解决办法:在挂载目录后多加一个--privileged=true参数即可
# CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
# 在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,即使用该参数,容器内的root拥有真正的root权限,否则,容器内的root只是外部的一个普通用户权限。
# -v 宿主机路径:容器内的路径 让宿主机和容器内容互通共享
docker run -d -p 5000:5000 -v /usr/local/registry/:/tmp/registry --privileged=true registry
# 案例演示创建一个新镜像,这里使用之前ubuntu上安装vim后提交的新镜像 ubuntu_vim:1.0.0
# curl验证私服库上有什么镜像
curl -XGET http://192.168.10.126:5000/v2/_catalog # 结果为:{"repositories":[]}
# 将新镜像custom/ubuntu_vim:1.0.0修改符合私服规范的Tag
docker tag 45273d785db7 192.168.10.126:5000/custom/ubuntu_vim:1.0.0
# 修改配置文件使之支持http
vim /etc/docker/daemon.json
# 原本的内容
# {
# "registry-mirrors": ["https://v1mdez00.mirror.aliyuncs.com"]
# }
# 修改为
{
"registry-mirrors": ["https://v1mdez00.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.10.126:5000"]
}
# 然后重启docker和Registry
systemctl restart docker
docker run -d -p 5000:5000 -v /usr/local/registry/:/tmp/registry --privileged=true registry
# push推送到私服库
docker push 192.168.10.126:5000/custom/ubuntu_vim:1.0.0
# curl验证私服库上有什么镜像
curl -XGET http://192.168.10.126:5000/v2/_catalog # 结果为:{"repositories":["custom/ubuntu_vim"]}
# 验证
# 删除已有的镜像
docker rmi -f 192.168.10.126:5000/custom/ubuntu_vim:1.0.0
docker rmi -f custom/ubuntu_vim:1.0.0
# 从私服库上拉取镜像
docker pull 192.168.10.126:5000/custom/ubuntu_vim:1.0.0