Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
Docker以容器的方式实现了应用程序的隔离,隔离和安全性可以给主机上同时运行多个容器。容器时轻量级的,因为不需要要管理撑的额外负担,而时直接在主机的内核中运行。
与vm虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在虚拟机的主机中运行docker,以下为Docker与VM之间部分区别
docker提供了工具和平台来管理容器的生命周期:
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上使用以下名称空间:
对照组
Linux上的Docker引擎还依赖于另一种控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许 Docker Engine 将可用的硬件资源共享给容器,并由选择的实施限制和约束,例如:限制特定容器可用的内存
联合文件系统
联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式
Docker Engine 将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中,默认容器格式为libcontainer。
[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
[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引擎)
[root@localhost ~]# yum install -y docker-ce
[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.
[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
这里我使用的镜像加速地址是在阿里云官方申请的: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
镜像搜索
格式: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
容器列表查询
格式:docker ps -a (-a 列出最近一次启动的容器)
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
创建容器
格式:docker create -it 选项 /bin/bash
示例:
[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"
进入容器
格式:
示例:
[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状态的容器则会报错
###镜像基本命令
#镜像搜索
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)
##容器基本操作命令
#容器列表查询
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的数据管理等其他内容