目录
以前环境配置相当麻烦,换一台机器就要重来一次,费时费力;因此就有人想要从根本上解决问题——软件可以带环境安装(把原始环境一模一样的复制过来,这样开发人员利用docker可以消除协作编码时在自己的机器上可正常工作的问题)
docker的主要目标:通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户app(可以是web应用或数据库应用等)及运行环境做到“一次镜像、处处运行”

理解:linux容器技术的出现解决了这样一个问题,而docker就是在他的基础上发展过来的。他将应用打成镜像,通过镜像成为运行在docker容器上面的实例,而docker容器在任何操作系统上都是一致的,这就实现了跨平台,跨服务器。只需要一次配置好的环境,换到别的机子上就可以一键部署好,大大的简化了操作。

总结:docker是基于go语言实现的云开源项目,其解决了运行环境配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
含义:虚拟机就是带环境安装的一种解决方案,传统虚拟机是安装在主操作系统上的,创建虚拟机(虚拟出各种硬件),在虚拟机上安装操作系统,后再虚拟机中的操作系统中安装和部署各种应用。
含义:linux容器是与系统其他部分隔离的一系列进程,从另一个镜像中运行,并由该镜像提供支持进程所需的全部文件.容器提供的镜像包含了应用的所有依赖项,因而从开发到测试再到生产过程中,他都具有可移植性(可移植的其他操作系统)和一致性(移植后的内容与运行状态一致)

docker官网:https://www.docker.com/
docker镜像仓库:https://hub.docker.com/
docker三要素:镜像、容器、仓库
总结:docker镜像就相当于一个root文件系统,把我们能够运行的源代码、配置环境、第三方依赖包打包成一个镜像,通过镜像在docker容器中创建docker实例,而docker镜像可以从docker仓库中获取

理解:
docker是一个client-server结构的系统,docker的守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。(容器是一个运行时环境,就类似于集装箱)
首先确定是Centos7及以上版本
cat /etc/redhat-release
卸载docker旧版本
- yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-engine
安装gcc依赖
yum -y install gcc
安装gcc-c++ 语言
yum -y install gcc-c++
安装需要的软件包
yum install -y yum-utils
设置stable镜像仓库(国内仓库)
- yum-config-manager \
- --add-repo \
- http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件索引
yum makecache fast
安装最新版本的 Docker Engine、containerd 和 Docker Compose
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
查看docker 版本
docker version
启动docker
systemctl start docker
使用 status查看运行状态
systemctl status docker
停止docker运行
systemctl stop docker
运行hello-world镜像
docker run hello-world
卸载docker
卸载 Docker Engine、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
- 开机启动docker:systemctl enable docker
- 禁止开机自启docker:systemctl disable docker
- 查看docker概要:docker info
- docker总体帮助文档:docker --help
- 列出本地的镜像:docker images(-a:列出本地所有镜像、-q:只显示镜像id)
- 仓库中查询镜像:docker search [--limit n] 镜像名
- 仓库中下载镜像:docker pull 镜像名[:TAG](注意:tag代表版本号)
- 查看镜像/容器/数据卷所占的空间:docker system df
- 删除镜像(镜像容器运行则删除失败):docker rmi 镜像名1/镜像id1 镜像名2/镜像id2
- 强制删除镜像:docker rmi -f 镜像名1/镜像id1 镜像名2/镜像id2
- 强制删除所有docker镜像:docker rmi -f $(docker images -qa)
- 查看镜像文件详情:docker inspect 镜像名
- 查看镜像使用历史:docker history 镜像名
- 当前文件夹下导出镜像文件:docker save 镜像名 | gzip > 镜像名.tar.gz
- 当前文件夹下导入镜像操作:docker load < 镜像名.tar.gz
命令:docker run [options] 镜像名[:版本号] [command]
注意:如果不写版本号则默认使用最新版本
options属性
注意:-P参数中容器与主机端口的映射可以用docker inspect 容器id命令查看
command属性

注意:这两种方式退出容器后,容器均不停止
命令:docker ps [options]
options属性
重新启动容器:docker [container] start 容器id的前几位(通常用前3位)
停止运行容器:docker [container] stop 容器id的前几位
强制停止容器:docker kill 容器id的前几位/容器名
注意:可以同时启动或停止多个容器
删除不运行的容器:docker [container] rm 容器id1 容器id2
删除容器(包括运行的):docker [container] rm -f 容器id1 容器id2
清理所有终止掉的容器:docker container prune
注意:
查看容器启动运行日志:docker [container] logs 容器id
查看容器内运行的进程:docker top 容器id
查看容器内部细节:docker inspect 容器id
前言:exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止
命令:docker exec -it 容器id bash
命令:docker cp 容器id:容器内路径 目标主机路径
命令:docker cp 主机路径 容器id:容器内路径
注意:在主机的环境下执行(容器id改为容器名也可)
导出容器到目标主机:docker export 容器id > 文件名.tar(可以是已经停止运行的容器)
从目标主机中导入容器:cat 镜像名.tar | docker import - 镜像名:镜像版本号
含义:其是一种轻量级的,可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码,运行时所需要的库,环境变量和配置文件等),这个打包好的运行环境就是image镜像文件
前言:docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为UnionFS(联合文件系统)

docker容器内执行
apt-get update(更新包管理工具)
apt-get install net-tools(安装我们需要的net-tools)
docker容器内执行
apt-get update(更新包管理工具)
apt-get -y install vim(安装我们需要的vim)
如今,我们的ubuntu镜像已经具备vim与ifconfig命令
提交镜像:docker commit -m="描述信息" -a="作者" 容器id 创建的镜像名:版本号
注意:提交镜像与导出镜像到主机的区别是提交镜像并不会生成压缩文件,只会将镜像提交到本地,其中可以用docker images命令查看本地镜像

登录:docker login --username=阿里云账号名称 registry.cn-hangzhou.aliyuncs.com
重命名:docker tag 容器id registry.cn-hangzhou.aliyuncs.com/cjcnamespace/发布的镜像名:[镜像版本号]
提交:docker push registry.cn-hangzhou.aliyuncs.com/cjcnamespace/发布的镜像名:[镜像版本号]
拉取:docker pull registry.cn-hangzhou.aliyuncs.com/cjcnamespace/镜像名:[镜像版本号]
拉取registry镜像:docker pull registry
eg:docker run -d -p 5000:5000 -v /root/myregistry/:/tmp/registry --privileged=true registry
docker tag 镜像名:版本号 虚拟机ip:5000/镜像名:版本号
进入:vim /etc/docker/daemon.json
- {
- "registry-mirrors": ["https://wiowcbi1.mirror.aliyuncs.com"],
- "insecure-registries": ["192.168.126.129:5000"]
- }
重启docker:systemctl restart docker
命令:docker push 虚拟机ip:5000/镜像名:版本号
命令:curl -XGET http://虚拟机ip:5000/v2/_catalog
命令:docker pull 虚拟机ip:5000/镜像名:镜像版本号
概念:卷就是目录或文件,存在于一个或多个容器当中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过联合文件系统提供一些用于持续储存或共享数据的特性
理解:卷设计的目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会再容器删除时删除挂载的数据卷
数据卷的作用:映射目录以后,完成敏感数据的持久化和备份到主机目录
创建数据卷:docker volume create 数据卷名
查看数据卷:docker volume ls
查看指定数据卷信息:docker volume inspect 数据卷名
[ { "CreatedAt": "2022-10-03T16:28:21+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/datavol/_data", "Name": "datavol", "Options": {}, "Scope": "local" } ]挂载数据:docker run -it --mount source=数据卷名,target=主机目录 镜像名 bash
挂载数据简写形式:docker run -it -v 数据卷名:主机目录 镜像名 bash
删除容器没有使用的数据卷:docker volume rm 数据卷名
清除所有没有使用的数据卷:docker volume prune
例子:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
注意:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
(默认)等同于
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
注意:这种方式使用容器卷则在对应容器卷内进行修改操作是不被允许的
命令:docker run -it --volumes-from 父容器名字 --name=容器名字 镜像名
结果:该容器继承了父容器的数据卷的规则
