摘要

  • Docker 镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的 Linux/Unix 的引导文件系统。Docker 用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker 容器启动是需要一些文件的, 而这些文件就可以称为 Docker 镜像。
  • Docker 把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
  • image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Linux的image基础上,往里面加入 Apache 服务器,形成你的image。
  • image文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的image文件,而不是自己制作。即使要定制,也应该基于别人的image文件进行加工,而不是从零开始制作。
  • 为了方便共享,image文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。

一、Docker概述

1.1、Docker是什么

  • 是一种轻量级的“虚拟机”
  • 在Linux容器里运行应用的开源工具

1.2、Docker与虚拟机的区别

类型

Docker

虚拟机

占用资源

较少

较多

启动时间

短,毫秒

较长,几分钟

安全

共享内核,不安全

系统逻辑隔离,安全

服务

一个容器一般只运行一个服务

可以运行多个服务

是否安装系统

不需要

需要

镜像存储

GB-TB

KB-MB

高可用策略

备份、容灾、迁移

弹性、负载、动态

1.3、Docker的使用场景

  • 打包应用程序简化部署
  • 可脱离底层硬件任意迁移
  • 例:服务器从腾讯云迁移到阿里云

二、Docker的核心概念及安装方式

2.1、Docker核心概念

2.1.1、镜像

  • 一个面向Docker容器引擎的只读模板

2.1.2、容器

  • 从镜像创建的运行实例

2.1.3、仓库

  • 集中保存镜像的地方

2.2、CentOS安装Docker的两种方式

2.2.1、使用CURL获得Docker的安装脚本进行安装

2.2.2、使用YUM仓库来安装Docker

2.3、部署19版Docker-CE(使用yum仓库)

2.3.1、安装依赖包

1 [root@server1 yum.repos.d]# yum -y install yum-utils device-mapper-persistent-data lvm2
2 
3 #yum-utils 提供了 yum-config-manager
4 #device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
5 #device mapper 是 linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构

2.3.2、设置阿里云镜像源并重建元数据库

1 [root@server1 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2 
3 [root@server1 yum.repos.d]# yum clean all
4 
5 [root@server1 yum.repos.d]# yum makecache

2.3.3、安装docker-ce并设置环境

1 [root@server1 yum.repos.d]# systemctl stop firewalld.service 
2 [root@server1 yum.repos.d]# setenforce 0
3 [root@server1 yum.repos.d]# yum -y install docker-ce
4 [root@server1 yum.repos.d]# systemctl start docker.service 
5 [root@server1 yum.repos.d]# systemctl enable docker.service

2.3.4、网络优化

1 [root@server1 yum.repos.d]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf     #开启路由功能
2 [root@server1 yum.repos.d]# sysctl -p     #配置生效
3 net.ipv4.ip_forward = 1
4 [root@server1 yum.repos.d]# systemctl restart network
5 [root@server1 yum.repos.d]# systemctl restart docker

2.3.5、镜像加速(到阿里云官网寻找自己的加速器)

①打开阿里云官网登录,搜索“镜像加速器”

 

docker window 共享文件夹 docker 文件管理系统_docker

docker window 共享文件夹 docker 文件管理系统_Docker_02

②选择容器镜像服务 ACR

 

docker window 共享文件夹 docker 文件管理系统_Docker_03

 

③选择管理控制台

 

docker window 共享文件夹 docker 文件管理系统_docker_04

 

④选择镜像加速器

docker window 共享文件夹 docker 文件管理系统_Docker_05

 

 

⑤找到位置并将其运行到服务器中

docker window 共享文件夹 docker 文件管理系统_docker_06

1 [root@server1 yum.repos.d]# tee /etc/docker/daemon.json <<-'EOF' 
2 > {
3 > "registry-mirrors": ["https://......"]
4 > }
5 > EOF
6 
7 [root@server1 yum.repos.d]# systemctl daemon-reload 
8 [root@server1 yum.repos.d]# systemctl restart docker

三、Docker基础命令

3.1、镜像操作

3.1.1、查看docker版本

1 [root@server1 yum.repos.d]# docker version
 2 Client: Docker Engine - Community
 3  Version:           19.03.13
 4  API version:       1.40
 5  Go version:        go1.13.15
 6  Git commit:        4484c46d9d
 7  Built:             Wed Sep 16 17:03:45 2020
 8  OS/Arch:           linux/amd64
 9  Experimental:      false
10 
11 Server: Docker Engine - Community
12  Engine:
13   Version:          19.03.13
14   API version:      1.40 (minimum version 1.12)
15   Go version:       go1.13.15
16   Git commit:       4484c46d9d
17   Built:            Wed Sep 16 17:02:21 2020
18   OS/Arch:          linux/amd64
19   Experimental:     false
20  containerd:
21   Version:          1.3.7
22   GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
23  runc:
24   Version:          1.0.0-rc10
25   GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
26  docker-init:
27   Version:          0.18.0
28   GitCommit:        fec3683

3.1.2、搜索镜像(公有仓库)

1 [root@server1 yum.repos.d]# docker search nginx
2 NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
3 nginx                              Official build of Nginx.                        14063               [OK]                
4 jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   1912                                    [OK]
5 richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   795                                     [OK]
6 linuxserver/nginx                  An Nginx container, brought to you by LinuxS…   131                                     
7 jc21/nginx-proxy-manager           Docker container for managing Nginx proxy ho…   115                                     
8 tiangolo/nginx-rtmp                Docker image with Nginx using the nginx-rtmp…   105                                     [OK]
9 bitnami/nginx                      Bitnami nginx Docker Image                      90                                      [OK]

3.1.3下载nginx镜像

1 [root@server1 yum.repos.d]# docker pull nginx
 2 Using default tag: latest
 3 latest: Pulling from library/nginx
 4 852e50cd189d: Pull complete 
 5 571d7e852307: Pull complete 
 6 addb10abd9cb: Pull complete 
 7 d20aa7ccdb77: Pull complete 
 8 8b03f1e11359: Pull complete 
 9 Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
10 Status: Downloaded newer image for nginx:latest
11 docker.io/library/nginx:latest

AUFS(联合文件系统)若干层下载
下载后存放在/var/lib/docker
下载文件信息/var/lib/docker/image/overlay/repositories.json

3.1.4、查看镜像列表

1 [root@server1 yum.repos.d]# docker images
2 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
3 nginx               latest              bc9a0695f571        8 hours ago         133MB

3.1.5、为镜像添加新标签(打完标签的共享一个镜像ID)

1 [root@server1 yum.repos.d]# docker tag nginx:latest nginx:xin
2 [root@server1 yum.repos.d]# docker images
3 REPOSITORY 实例      TAG  标签           IMAGE ID   镜像ID    CREATED   创建时间   SIZE 大小
4 nginx               latest              bc9a0695f571        8 hours ago         133MB
5 nginx               xin                 bc9a0695f571        8 hours ago         133MB

3.1.6、两种方式删除镜像(注意:删除某一个镜像时,只要有容器在使用某一个镜像,必须先删除容器,才能删除镜像。)

1 删除所有镜像
2 docker rmi `docker images -q`

①删除镜像:标签名

1 [root@server1 yum.repos.d]# docker rmi nginx:latest 
2 Untagged: nginx:latest
3 [root@server1 yum.repos.d]# docker images | grep nginx
4 nginx               xin                 bc9a0695f571        8 hours ago         133MB

②删除镜像id(注意:只有当镜像id对应标签仅剩一个时,才能使用镜像id的方式进行删除;否则出现如下报错
或者也可以在最后加上-f选项,一次性删除)

1 [root@server1 yum.repos.d]# docker tag nginx:xin nginx:latest
 2 [root@server1 yum.repos.d]# docker images
 3 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 4 nginx               latest              bc9a0695f571        8 hours ago         133MB
 5 nginx               xin                 bc9a0695f571        8 hours ago         133MB
 6 [root@server1 yum.repos.d]# docker rmi bc9a0695f571          #删除一个报错
 7 Error response from daemon: conflict: unable to delete bc9a0695f571 (must be forced) - image is referenced in multiple repositories
 8 [root@server1 yum.repos.d]# docker rmi -f bc9a0695f571       #加上-f可以一次性删除两个
 9 Untagged: nginx:latest
10 Untagged: nginx:xin
11 Untagged: nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
12 Deleted: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
13 Deleted: sha256:a6862ade3b91fdde2aa8a3d77fdcc95b1eb6c606be079c11b7f97f249d0e731d
14 Deleted: sha256:32bcbe3740b68d0625744e774b404140366c0c4a2b2eadf32280d66ba001b4fb
15 Deleted: sha256:2dc5e43f496e41a18c016904b6665454a53be22eb4dcc1b468d864b4e2d1f311
16 Deleted: sha256:5fe6a7c579cd9fbcfa604810974c4c0c16893f4c40bc801545607ebd0accea74
17 Deleted: sha256:f5600c6330da7bb112776ba067a32a9c20842d6ecc8ee3289f1a713b644092f8

3.1.7、存出镜像并命名为nginx,存到/opt目录下

1 [root@server1 yum.repos.d]# docker pull nginx
 2 Using default tag: latest
 3 latest: Pulling from library/nginx
 4 852e50cd189d: Pull complete 
 5 571d7e852307: Pull complete 
 6 addb10abd9cb: Pull complete 
 7 d20aa7ccdb77: Pull complete 
 8 8b03f1e11359: Pull complete 
 9 Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
10 Status: Downloaded newer image for nginx:latest
11 docker.io/library/nginx:latest
12 [root@server1 yum.repos.d]# docker save -o /opt/nginx nginx:latest 
13 [root@server1 yum.repos.d]# ll /opt
14 总用量 133884
15 drwx--x--x. 4 root root        28 11月 25 15:57 containerd
16 -rw-------. 1 root root 137096704 11月 25 16:20 nginx
17 drwxr-xr-x. 2 root root         6 3月  26 2015 rh

3.1.8、载入镜像

1 [root@server1 yum.repos.d]# docker rmi nginx:latest 
2 [root@server1 yum.repos.d]# docker load < /opt/nginx
3 f5600c6330da: Loading layer  72.52MB/72.52MB
4 7ccabd267c9f: Loading layer  64.54MB/64.54MB
5 850c2400ea4d: Loading layer  3.072kB/3.072kB
6 f790aed835ee: Loading layer  4.096kB/4.096kB
7 7e914612e366: Loading layer  3.584kB/3.584kB
8 Loaded image: nginx:latest

3.2、容器操作

3.2.1、创建容器

1 [root@server1 yum.repos.d]# docker create -it nginx:latest /bin/bash
2 -i:让容器的标准输入保持打开
3 -t:让Docker分配一个伪终端

3.2.2、查看容器运行状态

1 [root@server1 yum.repos.d]# docker ps -a
2 CONTAINER ID 容器ID  IMAGE   镜像        COMMAND                  CREATED             STATUS              PORTS               NAMES
3 6b5740016e3c        nginx:latest        "/docker-entrypoint.…"   58 seconds ago      Created                                 stoic_pike
4 
5 -a:列出所有的容器,包括未运行的容器
6 Created:已创建
7 Up:运行中

3.2.3、启动容器

1 [root@server1 yum.repos.d]# docker start 6b5740016e3c(容器ID)
2 6b5740016e3c

3.2.3、容器网络原理图

  • docker0:各个容器之间通信的网关

docker window 共享文件夹 docker 文件管理系统_Docker_07

 

3.2.4、通过run命令启动:(先去查找现有的镜像中有没有,没有先下载,再启动)

1 [root@server1 yum.repos.d]# docker pull centos:7
 2 [root@server1 yum.repos.d]# docker create -it centos:7 /bin/bash
 3 [root@server1 yum.repos.d]# docker ps -a
 4 [root@server1 yum.repos.d]# docker start ff30ed7850a1
 5 [root@server1 yum.repos.d]# docker run centos:7 /bin/bash -c ls /
 6 anaconda-post.log
 7 bin
 8 dev
 9 etc
10 home
11 lib
12 lib64
13 media
14 mnt
15 opt
16 proc
17 root
18 run
19 sbin
20 srv
21 sys
22 tmp
23 usr
24 var
25 
26 [root@server1 yum.repos.d]# docker ps -a
27 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
28 16e017b29972        centos:7            "/bin/bash -c ls /"      33 seconds ago      Exited (0) 32 seconds ago                       elastic_wing
29 ff30ed7850a1        centos:7            "/bin/bash"              2 minutes ago       Up About a minute                               eager_taussig
30 6b5740016e3c        nginx:latest        "/docker-entrypoint.…"   19 minutes ago      Up 16 minutes               80/tcp              stoic_pike
31 执行完成会关闭,状态是Exited(容器可以做一次性的处理,处理完就释放资源,做到了最小成本控制)

3.2.5、容器持续在后台执行(通过执行死循环)

1 [root@server1 yum.repos.d]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done" 65f63938c9eae1eebe14ca1eb517f4d504ae8592f4f21113074e95673b3cea3f
2 [root@server1 yum.repos.d]# docker ps -a
3 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
4 65f63938c9ea        centos:7            "/bin/bash -c 'while…"   5 seconds ago       Up 3 seconds                                   clever_ptolemy
5 
6 使用 docker logs 容器id 命令,可以查看容器内的标准输出

3.2.6、终止容器运行

1 [root@server1 yum.repos.d]# docker stop 65f63938c9ea

3.2.7、进入容器(该容器一定要在Up状态)

1 [root@server1 yum.repos.d]# docker exec -it 6b5740016e3c /bin/bash
2 exit    #退出容器

3.2.8、导出容器

1 [root@server1 yum.repos.d]# docker export 6b5740016e3c > /opt/nginx_c
2 [root@server1 yum.repos.d]# ll /opt
3 总用量 266060
4 drwx--x--x. 4 root root        28 11月 25 15:57 containerd
5 -rw-------. 1 root root 137096704 11月 25 16:20 nginx
6 -rw-r--r--. 1 root root 135345152 11月 25 16:52 nginx_c
7 drwxr-xr-x. 2 root root         6 3月  26 2015 rh

3.2.9、导入容器(会生成镜像,而不会创建容器)

1 [root@server1 yum.repos.d]# cat /opt/nginx_c | docker import - nginx:jiu

3.2.10、删除容器(容器必须为停止状态)

1 删除所有容器
2 docker rm `docker ps -a -q`
1 [root@server1 yum.repos.d]# docker stop ff30ed7850a1
2 ff30ed7850a1
3 [root@server1 yum.repos.d]# docker rm ff30ed7850a1
4 ff30ed7850a1

3.2.11、批量删除容器

1 [root@server1 yum.repos.d]# docker ps -a | awk '{print "docker rm "$1}' | bash
2 
3 输出第一字段
4 [root@server1 yum.repos.d]# docker ps -a | awk '{print "docker rm "$1}' 
5 docker rm CONTAINER
6 docker rm 6b5740016e3c