一、容器和虚拟机的区别
虚拟机我们都知道,可以在一种操作系统里面运行另一种操作系统。但是虚拟机占用资源较多,而且启动较慢,不适合快速部署项目。
基于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。可以简单的认为容器就是轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
下图是两者的详细区别:
二、什么是Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 的主要用途,目前有三大类:
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker由以下几部分组成:
-
Docker daemon:在宿主机上运行,Docker守护进程 -
Dokcer client:Docker命令行工具,用户通过docker client与docker deamon通信。也可以使用本地的docker client与远程的docker daemon进行通信 -
Docker image:镜像是只读的,镜像中包含由需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载 -
Docker container:Docker容器,是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环节,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。 -
Docker hub/registry:共享和管理Docker镜像,用户可以上传或下载镜像,也可以搭建自己私有的Docker registry
官方文档地址:Reference documentation | Docker Docs
三、安装Docker
ubuntu安装docker
-
更新包索引:
sudo apt update -
安装必要的依赖项:
sudo apt install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common -
添加
Docker官方GPG密钥:# 官方密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 阿里云密钥(二者选其一即可) # curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - -
设置稳定版仓库:
# 官方地址 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 阿里云地址(二者选其一即可) # sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" -
再次更新包索引以包含新添加的Docker仓库:
sudo apt update -
安装Docker Engine、CLI和containerd:
sudo apt install -y docker-ce docker-ce-cli containerd.io -
启动并启用Docker服务:
sudo systemctl start docker sudo systemctl enable docker -
(可选)将当前用户添加到
docker组,以便无需使用sudo就能运行Docker命令:sudo usermod -aG docker $USER注意: 重新登录或者执行以下命令以使用户组更改生效:
su - $USER -
验证
查看安装的版本:
docker -v
四、常用命令
docker命令官方文档:Use the Docker command line | Docker Docs
4.1 docker系统相关命令
- 运行Docker守护进程:
sudo systemctl start docker - 停止Docker守护进程:
sudo systemctl stop docker - 重启Docker守护进程:
sudo systemctl restart docker - 设置Docker开机自启动:
sudo systemctl enable docker - 查看Docker的运行状态:
sudo systemctl status docker - 重新加载
docker配置文件:sudo systemctl daemon-reload - 查看
docker版本:docker -v - 查看
docker信息:docker info
4.2 docker镜像相关命令
1)查找docker镜像
docker search image_name
2)从远程仓库拉取镜像
docker pull image_name[:TAG]
默认远程仓库为registry.hub.docker.com/。不指定`TAG`时,…
后续凡涉及到镜像名称的都会有TAG,如果未指定则默认为latest
3)查看本地所有镜像
docker images
参数说明:
-q:查询结果只返回镜像idimage_id
4)查看指定镜像元数据
docker inspect image_id/image_name[:TAG]
查看镜像构建历史:docker history image_id/image_name[:TAG]
5)构建镜像
docker build -f dockerfile_path -t image_name[:TAG] .
.表示在当前目录下执行,也就是说dockerfile_path是相对于当前目录的路径
参数说明:
-
-f:指定dockerfile文件位置 -
-t:指定构建的镜像名称 -
--no-cache:构建镜像时不使用缓存
6)上传镜像到远程仓库
docker push image_name
7)删除镜像
需要保证要删除的镜像没有对应的容器,否则需要先删除容器
docker rmi image_id/image_name[:TAG]
删除所有镜像
先查询所有的镜像id,然后删除
docker rmi $(docker images -q)
删除所有未使用镜像
docker image prune
8)运行镜像
docker run image_id/image_name[:TAG]
参数说明:
-d:后台运行容器,并返回容器ID-i:让容器的标准输入保持打开-t:让docker分配一个伪终端并绑定到容器的标准输入上,一般情况下-it一起使用-p:指定端口映射,格式为:host_port:container_port,将本机的端口映射到指定的容器端口-v:创建一个数据卷挂载到容器中,可以通过此参数将宿主机目录挂载到容器中,格式为:host_directory:contaioner_directory。如-v /root/maven:/maven表示将宿主机中的根目录下root目录中的maven目录挂载到容器里的根目录下的maven目录中。-e:指定环境变量,如-e TZ="As1a/shangha1"指定时区–-name:指定镜像运行后的容器的名称
9)进入镜像
不可以通过命令直接进入镜像,必须先运行镜像,然后进入相关容器。
可以通过如下命令运行镜像并进入容器:docker run -it image_id/image_name bash
exit :停止退出容器
Ctrl+P+Q:不停止退出容器
10)修改镜像
-
先启动容器,如将宿主机的某一目录挂载到容器中
docker run -it -v /root/maven:/maven image_id/image_name[:TAG] bash -
进入容器,可以进行一系列操作,操作修改后exit退出
-
然后使用commit命令来提交更改
docker commit -m '提交的描述信息' container_id new_image_name[:TAG]container_id为1中运行镜像生成的容器idnew_image_name为新的生成的镜像名称
-
执行成功后会返回生成的新的镜像ID,可以使用
docker images查看改镜像ID、仓库名和tag信息
4.3 docker容器相关命令
1)查看运行中的容器
docker ps
参数说明:
-a:查看所有容器,包括未运行的-q:只返回容器id
2)查看所有容器
docker ps -a
3)启动、停止、重启容器
docker start container_id/container_name
docker stop container_id/container_name
docker restart container_id/container_name
4)查看容器状态
docker stats
5)进入容器
docker attach:进入容器正在执行的终端,可以看下容器的实时日志
docker exec -it container_id/container_name bash:进入容器后开启新的终端,可以在里面执行各种操作
6)查看容器日志
docker logs container_id/container_name
参数说明:
-f:跟踪日志输出
7)删除容器
docker rm container_id/container_name
参数说明:
-f:强制删除,即使容器正在运行
8)删除所有未运行的容器
docker rm $(docker ps -aq)
加上-f就是删除所有容器了
9)拷贝容器文件
将容器中的文件拷贝到主机
docker cp 容器id:container_path host_path
五、Dockerfile文件
Dockerfile文件详细用法参照官方文档:Dockerfile reference | Docker Docs
这里简单给出部分常用命令的用法
FROM # 指定从那个镜像开始构建
MAINTAINER # 镜像作者:姓名+邮箱
RUN # 镜像构建是执行的命令
ADD # 给镜像添加内容
WORKDIR # 指定镜像的工作目录,是镜像内部的目录,不是宿主机的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定镜像运行时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定镜像运行时要运行的命令
COPY # 类似ADD,将文件拷贝到镜像中
ENY # 构建时设置环境变量