我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情
docker概念
什么是docker
docker是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
docker的组成
- 镜像 (image)
镜像相当于一个模板,镜像可以用来创建Docker容器。
列如:镜像相当于应用安装包、安装包安装多个应用(容器实例) - 容器(containers)
docker利用容器来运行应用,容器是从镜像创建的运行实例。
每个容器都是相互隔离的,保证平台的安全。可以把容器理解为一个简易的Linux系统。 - 仓库(Registry)
仓库是用于集中存放镜像的场所
主要分为公有仓库、私有仓库。主要的公有仓库有:Docker Hub、 Docker Pool(国内)等。
docker安装
docker运行原理
Docker是一个cs系统(Client-Server)的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
centos系统下安装docker
# 查看Linux系统信息
cat /etc/os-release
# 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.按照yum-utils工具包
yum install -y yum-utils
# 3.设置镜像仓库
# 默认是国外的,很慢
yum-config-manager \--add-repo\https://download.docker.com/linux/centos/docker-ce.repo
#推荐使用国内的阿里云镜像
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件索引
yum makecache fast
# 4.安装docker docker-ce社区 ee企业版
yum install docker-ce docker-ce-cli containerd.io
# 5.使用 docker version 查看是否安装成功
docker version
# 6.启动docker
systemctl start docker
阿里云镜像加速配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://*****.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
删除docker容器
# 移除docker文件
yum remove docker-ce docker-ce-cli containerd.io
# 移除docker配置文件
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
docker镜像运行流程
docker常用命令
帮助启动类命令
# 启动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 images [OPTIONS]
# 表头说明:
# REPOSITORY: 表示镜像的仓库源
# TAG: 镜像的标签版本号
# IMAGE ID: 镜像ID
# CREATED: 镜像创建时间
# SIZE: 镜像大小
# 常用[OPTIONS]说明
# -a 列出本地所有的镜像(包括历史映像层)
# -q 只显示镜像ID
# 说明: 同一仓库源会有多个TAG版本, 代表这个仓库源的不同版本, 我们使用REPOSITORY:TAG来定义不同的镜像. 如果不指定一个镜像的版本标签, 例如你只使用ubuntu, docker默认使用ubuntu:latest镜像(即最新版)
# docker虚悬镜像: REPOSITORY和TAG都是<none>的镜像,俗称虚悬镜像dangling image.一般都会删掉
查找某个镜像
docker search [OPTIONS] 镜像的名称
# 表头说明:
# NAME: 镜像名称
# DESCRIPTION: 镜像说明
# STARS: 点赞数量
# OFFICIAL: 是否是官方
# AUTOMATED: 是否是自动构建
# 常用[OPTIONS]说明
# --limit 只列出指定N个镜像,默认25个
docker search --limit 5 redis
下载、上传镜像
# 下载镜像
docker pull 镜像名称[:TAG]
# 上传镜像
docker push 镜像名称[:Tag]
# 说明: 同一仓库源会有多个TAG版本, 代表这个仓库源的不同版本, 我们使用REPOSITORY:TAG来定义不同的镜像. 如果不指定一个镜像的TAG, 例如你只使用ubuntu, docker默认使用ubuntu:latest镜像(即最新版)
# 用于将自己的容器修改成Repository指定格式的镜像,方便后期commit
docker tag 镜像:Tag Host:port/Repository:Tag
查看空间
docker system df 查看镜像/容器/数据卷所占的空间
删除镜像
docker rmi [OPTIONS] 镜像名字/ID
# 常用[OPTIONS]说明
# -f 强制删除 f为forced
# 删除单个
docker rmi -f 镜像ID
# 删除多个
docker rmi -f 镜像名字1:TAG 镜像名字2:TAG
# 删除全部
docker rmi -f $(docker images -qa)
容器命令
新增启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 常用[OPTIONS]说明
--name="容器名称" # 为容器指定一个名称
-d # 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
# 以下两个即为启动交互式容器(前台有伪终端,等待交互)
-i # 以交互模式运行容器,通常与-t同时使用
-t # 为容器重新分配一个伪输入终端,通常与-i同时使用
-P # 随机端口映射,大写P
-p # 指定端口映射,小写p -p hostPort:containerPort -p 8080:80
# 举例:
# 运行docker里面的centos镜像,返回一个bash命令窗口
docker run -it --name=centos_now centos
列出运行中容器
docker ps [OPTIONS]
# 常用[OPTIONS]说明
-a # 列出当前所有正在运行的容器+历史上运行过的
-l # 显示最近创建的容器
-n 数量 # 显示最近n个创建的容器
-q # 静默模式,只显示容器编号
退出容器
# 方式一: run进去容器,exit退出,容器停止
exit
# 方式二: run进去容器,Ctrl + p + q退出,容器不停止
Ctrl + p + q
其他常用命令
# 启动已经停止运行的容器
docker start 容器ID或者容器名
# 重启容器
docker restart 容器ID或者容器名
# 停止容器
docker stop 容器ID或者容器名
# 强制停止容器
docker kill 容器ID或者容器名
# 删除已经停止的容器
docker rm 容器Id或者容器名
# 一次性删除多个容器实例(慎用)
docker rm -f ${docker ps -a -q}
docker pa -a -q | xargs docker rm
# 查看容器日志
docker logs 容器Id或者容器名
# 查看容器内运行的进程
docker top 容器Id或者容器名
# 查看容器内部细节
docker inspect 容器Id或者容器名
# 进入正在运行的容器并以命令行交换(推荐使用这个)
docker exec -it 容器Id或者容器名 /bin/bash
# 重新进入
docker attach 容器Id或者容器名
# 上面两个命令的区别
# attach直接进入容器启动命令的终端,不会启动新的进程.用exit退出会导致容器的停止
# exec是在容器中打开新的终端,并且可以启动新的进程.用exit退出不会导致容器的停止
# 一般是用-d后台启动,再用exec进入对应的容器实例
# 从容器内拷贝文件到主机上
docke cp 容器Id:容器内路径 目的主机路径
# 导入导出容器
# 导出
docker export 容器Id > 文件名.tar # 默认导出到当前路径
# 导入
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
docker镜像
docker镜像加载原理
UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker镜像分层原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为UnionFS.。docker镜像的最底层是引导文件系统bootfs。
好处:资源共享, 方便复制迁移。
提交镜像
docker commit 提交一个容器,成为一个新的版本
docker commit -m='提交的描述信息' -a='作者' 容器ID 目标镜像名:[TAG]
测试提交自定义tomcat镜像
# 启动一个默认的tomcat
docker run -it --rm -p 8888:8080 tomcat:9.0
# 发现这个Tomcat是没有webapps应用的,官方默认没有进入容器
# 查看webapps目录,将webapps.dist 目录的东西添加至webapps
cp -r webapps.dist/* webapps
# 返回主机,提交镜像
docker commit -a='lm' -m='add webapps' 容器ID 容器名称:版本号
# 查看自定义镜像
docker images