Docker
简介
什么是docker?A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.
简而言之docker就是一个容器,将代码、依赖、环境配置等打包,打包好的容器可以发布到任何流行的linux上,能做到一次配置,到处运行。
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
docker 中主要有两个概念 image (镜像)、container (容器),镜像是只读的,可移植;容器是可写的,可执行的,我们运行的都是容器,在容器里配置我们的服务并启动,配置完整的容器可以 commit 成为新的镜像。举个例子说明,镜像就像是 redis 的官方压缩包,里面有它自己的一些默认配置,这些配置都是制作镜像的人自己配置的,而容器就是解压以后的 redis ,我们可以对其做定向修改并启动它,同时我们可以将修改了配置以后的 redis 再次压缩成为一个压缩包,它便成了一个新的镜像。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux
容器解决方案。
而 Linux
容器是 Linux
发展出了另一种虚拟化技术,简单来讲, Linux
容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker
将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker
,就不用担心环境问题。
总体来说, Docker
的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
最常用的包括Images和Container,
Images中存放下载的环境,仅可读。
Container(容器),可读可写,主要操作是在部份进行。Repository (仓库) 集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry
(仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository)
和仓库注册服务器 (Registry)
混为一谈,并不严格区分。Docker
仓库的概念跟 Git
类似,注册服务器可以理解为 GitHub
这样的托管服务。实际上,一个 Docker Registry
中可以包含多个仓库 (Repository)
,每个仓库可以包含多个标签 (Tag)
,每个标签对应着一个镜像。所以说,镜像仓库是 Docker
用来集中存放镜像文件的地方类似于我们之前常用的代码仓库(Github)。
Docker
使用 C/S
结构,即客户端/服务器体系结构。 Docker
客户端与 Docker
服务器进行交互,Docker服务端负责构建、运行和分发 Docker
镜像。 Docker
客户端和服务端可以运行在一台机器上,也可以通过 RESTful
、 stock
或网络接口与远程 Docker
服务端进行通信。
这张图展示了 Docker
客户端、服务端和 Docker
仓库(即 Docker Hub
和 Docker Cloud
),默认情况下Docker
会在 Docker
中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于 Git
,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。
1、开始安装,整起:
删除有关docker的旧版本依赖:
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2
设置docker仓库:
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
启用docker仓库:
sudo yum-config-manager --enable docker-ce-nightly
安装最新的docker ce:
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker服务:
sudo systemctl start docker
测试docker是否安装好:
docker run hello-world
执行该命令以后会出现以下的提示:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
2、常用指令
image 命令:
- docker images : 查看docker镜像
- docker build :由Dockerfile构建镜像
- docker rmi :删除镜像
- docker create : 由镜像构建容器
- docker search : 搜索镜像
- docker pull : 拉取镜像
container 命令:
- docker ps : 查看容器
- docker rm : 删除容器
- docker attach: 连接正在运行的容器
- docker exec : 在容器中执行命令
- docker commit : 由容器构建新的镜像
- docker stop : 关闭容器
- ctrl + p + q : 退出容器(不会关闭容器)
- exit : 退出容器(会关闭容器)
info 显示 Docker 系统信息,包括镜像和容器数
version 显示 Docker 版本信息
search 从Docker Hub查找镜像
登陆操作
和github有点类似,可以再阿里云上建立自己的docker仓库:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
login 登陆到一个 Docker 镜像仓库
docker login -u 用户名 -p 密码
logout 退出Docker 镜像仓库
pull 从镜像仓库中拉取或者更新指定镜像
OPTIONS说明
参数 | 解释 |
---|---|
-a |
拉取所有 tagged 镜像 |
--disable-content-trust |
忽略镜像的校验,默认开启 |
样例docker pull hub.c.163.com/library/mysql:latest
push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
build
使用Dockerfile创建镜像
OPTIONS说明
参数 | 解释 |
---|---|
--build-arg=[] |
设置镜像创建时的变量 |
--cpu-shares |
设置 CPU 使用权重 |
--cpu-period |
限制 CPU CFS 周期 |
--cpu-quota |
限制 CPU CFS 配额 |
--cpuset-cpus |
指定使用的 CPU id |
--cpuset-mems |
指定使用的内存 id |
--disable-content-trust |
忽略校验,默认开启 |
-f |
指定要使用的 Dockerfile 路径 |
--force-rm |
设置镜像过程中删除中间容器 |
--isolation |
使用容器隔离技术 |
--label=[] |
设置镜像使用的元数据 |
-m |
设置内存最大值 |
--memory-swap |
设置 Swap 的最大值为内存 +swap,"-1"表示不限 swap |
--no-cache |
创建镜像的过程不使用缓存 |
--pull |
尝试去更新镜像的新版本 |
-q |
安静模式,成功后只输出镜像 ID |
--rm |
设置镜像成功后删除中间容器 |
--shm-size |
设置 /dev/shm 的大小,默认值是 64M |
--ulimit |
Ulimit 配置 |
样例
从已经创建的容器中更新镜像,并且提交这个镜像
OPTIONS说明
参数 | 解释 |
---|---|
-m |
提交的描述信息 |
-a |
指定镜像作者 |
ede0be5f1842 |
容器 ID (通过docker ps -a 查看) |
mysql:v2 |
mysql 镜像的仓库源名 v2 镜像的标签 |
样例
使用 Dockerfile 指令来创建一个新的镜像
我们使用命令 docker build
,从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
OPTIONS说明
参数 | 解释 |
---|---|
-t |
指定要创建的目标镜像名 |
imagesname:2.0 |
imagesname 镜像的仓库源名 2.0 镜像的标签 |
/home/shitao/file/ |
dockerfile 路径 |
tag
标记本地镜像,将其归入某一仓库
OPTIONS说明
参数 | 解释 |
---|---|
9e64176cd8a2 |
镜像 id (镜像名) |
mysql163:2.0.1 |
mysql163 镜像的仓库源名 2.0.1 镜像的标签 |
使用 docker images
命令可以看到,ID为 9e64176cd8a2
的镜像多个标签
save
将指定镜像保存成 tar 归档文件
将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
OPTIONS说明
参数 | 解释 |
---|---|
9e64176cd8a2 |
镜像 id (镜像名) |
/home/shitao/Downloads/mysql.tar |
保存的地址 |
import
从归档文件中创建镜像
OPTIONS说明
参数 | 解释 |
---|---|
mysql:0.2 |
mysql 镜像的仓库源名 0.2 镜像的标签 |
/home/shitao/Downloads/mysql.tar |
归档文件地址 |
inspect
获取容器/镜像的元数据
OPTIONS说明
参数 | 解释 |
---|---|
-f |
指定返回值的模板文件 |
-s |
显示总的文件大小 |
--type |
为指定类型返回JSON |
样例
docker inspect 9e6
容器生命周期管理
run
docker run -it hub.c.163.com/library/mysql /bin/bash
OPTIONS说明
参数 | 解释 |
---|---|
-i |
以交互模式运行容器,通常与 -t 同时使用 |
-t |
为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
hub.c.163.com/library/mysql |
镜像名 |
-P |
将容器内部使用的网络端口映射到我们使用的主机上 |
-d |
后台运行容器,并返回容器ID |
start
启动一个或多少已经被停止的容器
stop
停止一个运行中的容器
restart
重启容器
kill
杀掉一个运行中的容器
rm
删除一个或多少容器
OPTIONS说明
参数 | 解释 |
---|---|
-f |
通过 SIGKILL 信号强制删除一个运行中的容器 |
-l |
移除容器间的网络连接,而非容器本身 |
-v |
删除与容器关联的卷 |
删除指定容器
删除所有容器
exec
在运行的容器中执行命令
OPTIONS说明
参数 | 解释 |
---|---|
-d |
分离模式: 在后台运行 |
-i |
即使没有附加也保持 STDIN 打开 |
-t |
分配一个伪终端 |
样例
容器操作
ps
查看正在运行的容器
OPTIONS说明
参数 | 解释 |
---|---|
-a |
显示所有的容器,包括未运行的 |
-f |
根据条件过滤显示的内容 |
--format |
指定返回值的模板文件 |
-l |
显示最近创建的容器 |
-n |
列出最近创建的n个容器 |
--no-trunc |
不截断输出 |
-q |
静默模式,只显示容器编号 |
-s |
显示总的文件大小 |
样例
docker ps
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
5a0ec27520c6 | hub.c.163.com/library/mysql | "docker-entrypoint..." | 12 seconds ago | Up 9 seconds | 3306/tcp | amazing_ardinghelli |
各个项目说明:
项目 | 解释 |
---|---|
CONTAINER ID |
容器ID |
IMAGE |
镜像名称 |
COMMAND |
命令 |
CREATED |
容器创建时间 |
PORTS |
端口 |
NAMES |
容器名称 |
inspect
获取容器/镜像的元数据
OPTIONS说明
参数 | 解释 |
---|---|
-f |
指定返回值的模板文件 |
-s |
显示总的文件大小 |
--type |
为指定类型返回JSON |
样例
docker inspect 9e6
top
查看容器中运行的进程信息,支持 ps 命令参数
logs
获取容器的日志
OPTIONS说明
参数 | 解释 |
---|---|
-f |
跟踪日志输出 |
--since |
显示某个开始时间的所有日志 |
-t |
显示时间戳 |
--tail |
仅列出最新N条容器日志 |
样例
Docker与宿主机相互拷贝文件:
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 (可相互变化即实现文件的相互拷贝)
批量删除Docker中已经停止的容器
方法一:
#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,
sudo docker ps -a|grep Exited|awk '{print $1}'
#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器
sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`
方法二:
#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
sudo docker rm $(sudo docker ps -a -q)
方法三:
#根据容器的状态,删除Exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)
方法四:
#Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。
sudo docker container prune