摘要
- 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、镜像加速(到阿里云官网寻找自己的加速器)
①打开阿里云官网登录,搜索“镜像加速器”
②选择容器镜像服务 ACR
③选择管理控制台
④选择镜像加速器
⑤找到位置并将其运行到服务器中
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:各个容器之间通信的网关
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