文章目录
前言:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一、Docker基本概念
1.1 Docker概述
- Docker是一个用于开发,交付和运行应用程序的开放平台,Docker可以将应用程序和基础架构分开,从而快速的交付软件,借助Docker,可以以与管理应用程序相同的方式来管理基础架构,通过利用Docker的快速交付、测试和部署代码的方法,可以大大减少编写代码和在生产环境中运行代码之间的延迟
1.2 Docker 平台
-
Docker以容器的方式实现了应用程序的隔离,隔离和安全性可以给主机上同时运行多个容器。容器时轻量级的,因为不需要要管理撑的额外负担,而时直接在主机的内核中运行。
-
与vm虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在虚拟机的主机中运行docker,以下为Docker与VM之间部分区别
-
docker提供了工具和平台来管理容器的生命周期:
- ① 使用容器开发应用程序及其支持组件
- ② 容器称为分发和测试应用程序的单元
- ③ 准备就绪后,可以将应用程序作为容器或协调服务器部署到生产环境中,无论生产环境是本地数据数据中心,云提供商还是两者的混合,其工作原理都相同
1.3 Docker引擎
- Docker Engine是具有以下主要组件的客户端—服务器应用程序
- ① 服务器是一种长期运行的程序,称为守护进程(dockerd 命令)
- ② REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
- ③ 命令行界面(CLI)客户端(docker命令)
- CLI使用Docker REST API通过脚本或直接CLI命令控制,或者与Docker守护程序交互。许多其他Docker应用程序都使用基础API和CLI
- 守护程序创建和管理Docker对象,例如 图像、容器、网络和卷
二、Docker应用
2.1 快速交付应用程序
- Docker通过允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发声明周期。容器非常适合持续集成和持续交付(CI/CD) 工作流程
2.2 响应式部署和扩展
- Docker基于容器的平台允许高读可移植的工作负载。Docker容器可以在开发人员的笔记本电脑、数据中心的物理或虚拟机、云提供商或混合环境中运行
- Docker的可移植性和轻量级的特性还可以让运维人员轻松的动态管理工作负载,并根据业务需求指示实时扩展或关闭应用程序和服务
2.3 更多工作负载
- Docker轻巧快速,它为基于虚拟机管理程序的虚拟机提供了可行且经济高效的替代方案,因此可以利用更多的计算能力来实现业务目标,Docker非常适合高密度环境和中小型部署。
三、Docker 架构
- Docker 使用客户端—服务器架构,Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在统一系统上运行,或者可以将Docker客户端连接到远程Docker守护程序。Docker客户都安和守护程序在UNIX套接字或网络接口上使用REST API进行通信
- Docker 主要组成
- ① Docker Client :客户端
- ② Docker Daemon :守护进程
- ③ Docker Images:镜像
- ④ Docker Container:容器
- ⑤ Docker Registry:镜像仓管
-
Docker守护进程
Docker守护程序倾听Docker API请求并管理Docker对象,例如图片、容器、网络和卷,守护程序还可与其他守护程序通信以管理Docker服务
-
Docker 客户端
Docker 客户端是许多Docker用户与Docker交互的主要方式。当使用诸如 docker run此类命令的适合,客户端会将这些命令发送到dockerd(守护进程命令) 以执行这些命令,该docker命令使用Docker API。Docker 客户客户端可以与多个守护进程通信
-
Docker 注册表
Docker 注册表存储Docker镜像。Docker Hub是所有人都可以使用的公共注册表,并且Docker配置为默认在Docker Hub上查找镜像。甚至可以建立自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)
-
底层技术
Docker使用GO语言编写,并利用Linux内核的多个功能来交付其功能
-
命名空间
Docker使用 namespace 提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建以组名称空间
这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间内运行,并且其访问仅限于该名称空间
Docker Engine在Linux上使用以下名称空间:
- pid 名称空间:进程隔离(PID:进程ID)
- net 名称空间:管理网络接口(NET:网络)
- ipc 名称空间:管理访问IPC资源(IPC:进程间通信)
- mnt 名称空间:管理文件系统挂载点(MNT)
- uts 名称空间:隔离内核和版本标识符 (UTS:Unix时间共享系统)
-
对照组
Linux上的Docker引擎还依赖于另一种控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许 Docker Engine 将可用的硬件资源共享给容器,并由选择的实施限制和约束,例如:限制特定容器可用的内存
-
联合文件系统
联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
-
容器格式
Docker Engine 将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中,默认容器格式为libcontainer。
四、Docker 基础命令
4.1 Docker 安装
- 实验环境部署
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
#永久关闭核心功能
[root@localhost ~]# sed -i "7s/enforcing/disabled/" /etc/selinux/config
[root@localhost ~]# cat /etc/selinux/config
#第七行
SELINUX=disabled
- 安装Docker引擎依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#在阿里云的yum源点中下载repo配置文件
#生成的为置在本机的/etc/yum.d/目录下
#只有在下载完docker-ce.repo配置文件后,才可以正常安装Docker-CE(社区版Docker引擎)
- 安装Docker-CE引擎
[root@localhost ~]# yum install -y docker-ce
- 开启Docker,并设置为开启自启
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
4.2 常用命令
4.2.1 查询Docker版本
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
4.2.2 镜像加速、网络优化
-
这里我使用的镜像加速地址是在阿里云官方申请的:https://help.aliyun.com/document_detail/60750.html,此处不再赘述
需注意:镜像加速加载完成后需要重启进程和docker
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker
- 网络优化
[root@localhost docker]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@localhost docker]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@localhost ~]# systemctl restart docker
4.2.3 镜像基本操作命令
-
镜像搜索
格式:dcoker search 关键字
示例:
[root@localhost docker]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12946 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1767 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 764 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 102 .....省略部分内容
-
下载nginx镜像
格式 :docker pull 关键字
示例:
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c499e6d256d6: Pull complete
74cda408e262: Pull complete
ffadbd415ab7: Pull complete
Digest: sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#下载后存放在以下路径
root@localhost overlay2]# cat /var/lib/docker/image/overlay2/repositories.json
{"Repositories":{"nginx":{"nginx:latest":"sha256:ed21b7a8aee9cc677df6d7f38a641fa0e3c05f65592c592c9f28c42b3dd89291","nginx@sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596":"sha256:ed21b7a8aee9cc677df6d7f38a641fa0e3c05f65592c592c9f28c
-
查看镜像
格式:docker images
示例:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ed21b7a8aee9 8 days ago 127MB
-
查看镜像信息
借助IMAGE ID标签 详细查看镜像信息
格式: docker inspect 镜像ID
示例:
[root@localhost ~]# docker inspect ed21b7a8aee9
[
{
"Id": "sha256:ed21b7a8aee9cc677df6d7f38a641fa0e3c05f65592c592c9f28c42b3dd89291",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596"
],
"Parent": "",
"Comment": "",
"Created": "2020-03-31T03:19:30.487069362Z",
"Container": "5c86b143cf5caec0aed5c331922c243f00600152ec0e9ecbe8531771562e72b8",
"ContainerConfig": {
.....省略部分内容
-
添加镜像标签
格式:docker tag 镜像标签 新标签
示例:
[root@localhost ~]# docker tag nginx:latest nginx:web
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ed21b7a8aee9 8 days ago 127MB
nginx web ed21b7a8aee9 8 days ago 127MB
-
删除镜像
格式:docker rmi 镜像标签
示例:
[root@localhost docker]# docker rmi nginx:web
Untagged: nginx:web
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ed21b7a8aee9 8 days ago 127MB
#因为此处有两个相同的镜像,所以删除的只是别名,如果把最后一个也删除,那镜像也会被删除
-
镜像输出
格式:docker save -o 导出的文件名 镜像标签
示例:
[root@localhost opt]# docker save -o nginx nginx:latest
[root@localhost opt]# ls
containerd nginx rh
-
镜像导入
格式:docker load < 镜像文件
示例:
#删除镜像
[root@localhost opt]# docker rmi ed21b7a8aee9
Untagged: nginx:latest
Untagged: nginx@sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596
Deleted: sha256:ed21b7a8aee9cc677df6d7f38a641fa0e3c05f65592c592c9f28c42b3dd89291
Deleted: sha256:8a305f371a6c3c445a1dfc500c1364743868a269ab8cdaf95902692e82168352
Deleted: sha256:d079ef06ec1f10a8050887365f9a940b39547ba6bcc46b16a463e740984f3223
Deleted: sha256:c3a984abe8a88059915bb6c7a1d249fd1ccc16d931334ac8816540b0eb686b45
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
#镜像导入
[root@localhost opt]# docker load < nginx
c3a984abe8a8: Loading layer [==================================================>] 72.48MB/72.48MB
99134ec7f247: Loading layer [==================================================>] 58.11MB/58.11MB
d37eecb5b769: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image: nginx:latest
#导入成功
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ed21b7a8aee9 8 days ago 127MB
4.2.4 容器操作基本命令
-
容器列表查询
格式:docker ps -a (-a 列出最近一次启动的容器)
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-
创建容器
格式:docker create -it 选项 /bin/bash
- -i 让容器的标准输入保持打开
- -t 让Docker分配一个伪终端
示例:
[root@localhost ~]# docker create nginx:latest /bin/bash
d06e458309eb57052e833e92f92b35d8098ddae77815b8501b5ec5a4c5543725
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d06e458309eb nginx:latest "/bin/bash" 13 seconds ago Created magical_sinoussi
#/bin/bash 指定终端
#statys :created 创建状态,暂时还未开启
#container id 容器ID
-
启动容器
格式:docker start 容器ID
示例:
[root@localhost ~]# docker start d06e458309eb
d06e458309eb
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d06e458309eb nginx:latest "/bin/bash" 14 minutes ago up 6 seconds magical_sinoussi
-
一次性执行容器操作
格式:docker run 镜像名称 操作指令
示例:
#docker run 一次性运行centos:7镜像(如在本地未发现镜像会自动在容器仓库中下载该镜像) -c (command指令,进入到centos:7容器) ls / (执行ls /命令)
[root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
Unable to find image 'centos:7' locally
7: Pulling from library/centos
ab5ef0e58194: Pull complete
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for centos:7
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
- 如果不希望执行完命令后结束进程,可以给一条循环语句命令,如下:
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
-
进入容器
格式:
- ① docker run -it 容器名 容器环境
- ② 在容器为运行状态下:docker e’x’ec -it 容器ID 容器环境
示例:
[root@localhost ~]# docker run -it nginx:latest /bin/bash
root@3e7df5d269b0:/#
root@3e7df5d269b0:/#
root@3e7df5d269b0:/# exit
[root@localhost ~]#
-
容器导出、导入
格式:
docker export 容器ID > 导出的容器名 (容器导出)
cat 容器名 | docker import - 镜像名 (生成镜像,不会生成容器)
示例:
[root@localhost ~]# docker export 4bd65131ba09 > centos_c
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg 公共 文档 模板 音乐
centos_c 下载 图片 桌面 视频
-
容器删除
格式:docker rm 容器ID (必须先停止再删除)
示例:
[root@localhost ~]# docker rm d06e458309eb
d06e458309eb
- 如果想批量删除容器,可借助正则表达式
docker ps -a | awk '{print "docker rm" $1}' | bash
#遍历容器ID,依次删除,但如果有UP状态的容器则会报错
五、命令小结
5.1 常用镜像命令
###镜像基本命令
#镜像搜索
docker search 关键字(nginx)
#镜像下载
docker pull 关键字(nginx)
#镜像查询
docker images
#查看镜像详细信息
docker inspect 镜像ID
#添加镜像标签
docker tag 镜像标签 新标签
docker tag nginx:latest nginx:web
#删除镜像
docker rmi 镜像标签(nginx:latest)
#镜像输出
docker save -o nginx_img nginx:latest
#镜像导入
docker load <镜像文件(nginx_img)
5.2 容器常用命令
##容器基本操作命令
#容器列表查询
docker ps -a
#创建容器
docker create -it nginx:latest /bin/bash
#启动容器
docker start 容器ID
#一次性容器操作
docker run 镜像名称 操作指令
docker run centos:7 /usr/bin/bash -c ls /
#进入容器
docker run -it 容器名 环境
docker run -it nginx:latest /bin/bash
#容器导入
cat 容器ID | docker import -镜像名 (会生成镜像,不会生成容器)
#容器导出
docker export 容器ID > 导出的容器名
#容器删除
docker rm 容器ID (必须先停止再删除)
总结:
本篇博客简单介绍了Docker的常用命令,之后会继续更新Docker的数据管理等其他内容