Docker 基础知识与常用命令汇总
什么是 docker
docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
docker 优点
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:您可以即时部署更新和升级。
- 便携式:您可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:您可以增加并自动分发容器副本。
- 可堆叠:您可以垂直和即时堆叠服务。
docker 应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
架构图如下所示:
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,例如VirtualBox。 |
PS:Docker Hub 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签。
Ubuntu 18.04 安装 Docker-ce
- 推荐更换ubuntu国内软件源为中科大的源(视服务器而定):
1
2
3sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update - 安装需要的包:
1
sudo apt install apt-transport-https ca-certificates software-properties-common curl
- 添加 GPG 密钥,并添加 Docker-ce 软件源,以中国科技大学的 Docker-ce 源为例:
1
2
3curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" - 添加成功后更新软件包缓存:
1
sudo apt update
- 安装docker-ce:
1
sudo apt install docker-ce
- 设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略):
1
2sudo systemctl enable docker
sudo systemctl start docker - 测试运行:终端显示以下内容时说明安装成功:
1
sudo docker run hello-world
PS:可以添加当前用户到docker
用户组,可以不用sudo
运行 docker(可选):sudo groupadd docker
sudo usermod -aG docker $USER
镜像使用
基础命令
docker images
:列出本地主机上的镜像。参数说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签。同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本;使用REPOSITORY:TAG 来定义不同的镜像。
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
docker search name
:在Docker Hub中查找镜像。参数说明:
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- OFFICIAL: 是否 docker 官方发布
- AUTOMATED: 自动构建。
docker pull name
:从Docker Hub中下载镜像。docker rmi name
:删除镜像。前提是基于该镜像的容器已不再处于使用状态。
创建镜像
- 从已经创建的容器中更新镜像,并且提交这个镜像。
更新镜像之前需要使用镜像来创建一个容器:
例如用ubuntu镜像创建的容器中进行apt update
更改,然后exit
退出容器。
此时容器ID为04f3b433a4a9
。可以通过命令 docker commit 来提交容器副本,提交后可以再次查看本地镜像文件:docker commit -m="update" -a="dreamhomes" 04f3b433a4a9 dreamhomes/ubuntu
docker tag IMAGE_ID dreamhomes/ubuntu:version
:设置镜像标签- 使用 Dockerfile 指令来创建一个新的镜像。
镜像保存和导入
docker save IMAGE > PATH/IMAGE.tar.gz
: 导出镜像到本地;docker load < PATH/IMAGE.tar.gz
: 导入镜像到docker镜像库;更新:
1
2
3
4
5
6
7
8
9# 保存 container 为归档文件
docker export -o test.tar container-name/ID
# 对应的导入镜像
docker import test.tar image-name
# 保存 image 为归档文件
docker save -o test.tar image-name
# 对应的导入镜像
docker load --input test.tar 或 docker load < test.tar
镜像容器重命名
1 | # 镜像 |
复制文件
1 | docker cp ./test.txt container-name[or ID]:/root/path |
容器使用
docker run -it --name ubuntu-test ubuntu bash
:创建容器;参数说明:
- -i: 交互式操作。
- -t: 终端。
- –name:容器名字。
- ubuntu: ubuntu 镜像。
- /bin/bash:在镜像名后的是命令,交互式 Shell为 /bin/bash。
要退出终端,直接输入 exit;
docker ps -a
:查看所有容器(包括已停止的)docker start ID
:启动一个已停止的容器(加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec)docker stop ID
:停止运行的容器;docker run -d --name ubuntu-test ubuntu /bin/bash
:容器后台运行;docker exec -it ID /bin/bash
:进入运行的容器;docker attach ID
:进入容器后退出会导致容器停止!docker export ID > name.tar
:导出容器快照到本地文件;cat docker/ubuntu.tar | docker import - test/ubuntu:v1
:从本地快照文件导入为镜像;docker import http://example.com/exampleimage.tgz example/imagerepo
:从URL或目录导入镜像;docker rm -f ID
:删除运行的容器;docker container prune
:清理掉所有处于终止状态的容器;
容器连接
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
或 -p
参数来指定端口映射。也可通过-v
参数将主机文件映射到容器中。
端口映射
docker run -d -P training/webapp python app.py
-P
:是容器内部端口随机映射到主机的高端口。docker run -d -p 5000:5000 training/webapp python app.py
-p
: 是容器内部端口绑定到指定的主机端口。(前面是主机端口,后面是容器端口)docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
指定容器绑定的网络地址。
数据卷
sudo docker run -d -P --name test -v /home/dreamhomes:/home/dreamhomes:ro ubuntu bash
挂载一个主机目录作为数据卷,本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它;:ro
表示文件只读。($PWD
当前目录中增加前缀)sudo docker run -it --rm -v /home/v-smj19:/home/v-smj19 ubuntu bash
--rm
参数表示在容器退出时自动清理容器内部的文件系统。等价于:docker rm -v
了解上述命令后即可满足基础的需求了,如果有更复杂的需求可以参考官网哦!https://docs.docker.com/engine/reference/run/