【Docker】Docker基础教程(1)
前言:
推荐免费Docker基础讲解视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
Docker概述
Docker的出现
之前发布一个项目:(jar+(Redis MySQL jdk ES)),项目不能带上环境打包;在服务器配置一个应用环境,配置繁琐且不能跨平台。
Docker的出现,解决以上的问题!
Docker的思想来自于集装箱!
隔离:Docker的核心思想,打包装箱,每个箱子是相互隔离的;
Docker的发展
Docker 是Paas提供商 dotCloud 开源的一个基于LXC的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。
在Docker出现之前,我们使用虚拟机基数!
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
虚拟机:占用空间大,启动速度慢,笨重!
Docker:占用小,启动快!
Docker网址
Docker官网:Home - Docker
官方文档:Orientation and setup | Docker Documentation
Dockerhub:Docker Hub Container Image Library | App Containerization
Docker的作用和基本组成
Docker的作用
虚拟机技术
虚拟机技术缺点:
- 资源占用多;
- 冗余步骤多;
- 启动慢;
容器化技术
容器的技术:
- 容器内的应用直接运行在宿主机的内容,容器本身没有内核,也没有虚拟我们的硬件,占用很小;
- 每个容器相互隔离,容器内部都有一个属于自己的文件系统,互不影响;
DevOps
- 应用更快速的交付和部署;
- 更便捷的升级和扩缩容;
- 更简单的系统运维;
- 更高效的计算资源利用;
Docker基本组成
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker安装及流程和原理
Docker安装
环境准备
-
购买一台服务器
-
Linux基础
-
CentOS 7或CentOS 8
-
使用Xshell连接远程服务器
环境查看
1 | 系统内核 3.0+即可 |
安装
-
打开Docker引擎Linux安装地址
-
卸载旧的版本
1
2
3
4
5
6
7
8yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine -
安装
安装的方法很多,我们使用yum进行安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16需要安装的包
yum install -y yum-utils
docker仓库地址(官方)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
(可选)阿里云docker仓库镜像地址
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引 CentOS 7
yum makecache fast
更新yum软件包索引 CentOS 8
yum makecache
安装最新版docker引擎
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -
启动Docker
1
systemctl start docker
-
验证Docker时候安装成功
hello-world
1
docker run hello-world
运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
[root@jokerdig ~]# -
查看Docker版本信息和镜像
1
2
3
4
5
6
7查看版本信息
docker version
查看镜像
docker images
镜像的信息
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB -
卸载Docker步骤
1
2
3
4
5卸载Docker引擎
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
删除Docker所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
Docker流程分析和原理
Run流程分析图
底层原理
Docker如何工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行该命令!
Docker为什么比虚拟机快?
- Docker有着比虚拟机更少的抽象层;
- Docker利用的是宿主机的内核,VM需要的是Guest OS;
镜像的基本命令
帮助命令
1 | docker version # 显示docker的版本信息 |
镜像的基本命令
-
docker images
1
2查看本地主机所有镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]选项(OPTIONS)
选项名 默认 描述 --all
,-a
显示所有图像(默认情况下隐藏中间图像) --digests
显示摘要 --filter
,-f
基于所提供条件的过滤器输出 --format
使用Go模板打印精美图像 --no-trunc
不截断输出 --quiet
,-q
仅显示图像ID 测试
1
2
3
4[root@jokerdig ~]# docker images
仓库源 标签 镜像ID 创建时间 大小
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB -
docker search
1
2在Docker Hub中搜索镜像
docker search [OPTIONS] TERM选项(OPTIONS)
选项名 默认 描述 --filter
,-f
基于所提供条件的过滤器输出 --format
使用Go模板进行漂亮的打印搜索 --limit
25
最大搜索结果数 --no-trunc
不截断输出 测试
1
2
3
4
5
6
7
8搜索mysql
[root@jokerdig ~]# docker search mysql
名称 说明
NAME DESCRIPTION
星⭐ 官方 自动化
STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13207 [OK]
............... -
docker pull
1
2提取(下载)镜像或存储库
docker pull [OPTIONS] NAME[:TAG|@DIGEST]选项(OPTIONS)
选项名 默认 描述 --all-tags
,-a
下载存储库中所有标记的镜像 --disable-content-trust
true
跳过图像验证 --platform
如果服务器支持多平台,则设置平台 --quiet
,-q
禁止详细输出 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26下载mysql(默认最新版)
[root@jokerdig ~]# docker pull mysql
Using default tag: latest # 如果不指定tag,默认下载最后一个版本
latest: Pulling from library/mysql
051f419db9dd: Pull complete # 分层下载,docker核心
7627573fa82a: Pull complete
a44b358d7796: Pull complete
95753aff4b95: Pull complete
a1fa3bee53f4: Pull complete
f5227e0d612c: Pull complete
b4b4368b1983: Pull complete
f26212810c32: Pull complete
d803d4215f95: Pull complete
d5358a7f7d07: Pull complete
435e8908cd69: Pull complete
Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
指定版本下载mysql 8.0
这里官方默认下载的就是8.0的,所以不会重复下载,如果换其他版本,它只会去下载与当前版本不同的内容,而相同的内容直接共用,不需要再次下载。
[root@jokerdig ~]# docker pull mysql:8.0
8.0: Pulling from library/mysql
Digest: sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921
Status: Downloaded newer image for mysql:8.0
docker.io/library/mysql:8.0 -
docker rmi
1
2删除一个或多个镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]选项(OPTIONS)
名称 默认 描述 --force
,-f
强制删除镜像 --no-prune
不要删除未标记的父项 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22删除mysql(可以通过名称或者ID删除)
删除所有镜像 docker rmi -f $(docker images -aq)
[root@jokerdig ~]# docker rmi -f 43fcfca0776d
Untagged: mysql:8.0
Untagged: mysql:latest
Untagged: mysql@sha256:b9532b1edea72b6cee12d9f5a78547bd3812ea5db842566e17f8b33291ed2921
Deleted: sha256:43fcfca0776df8e192d1647da2866237fbd9f8e875fb496e4ca887369b2dd995
Deleted: sha256:45d11760ca3e62bb36a589002b413a42c60c9b917b7a089b116c1ab69155aa4d
Deleted: sha256:af1876abdf5bbbef0ac13e24068669d600bf7de8aa74f31a43ae5f56b83331c2
Deleted: sha256:e1668f1334215580aa7a19beef5d1ee6c6ba121c305154f1ddd7253e21bf65e8
Deleted: sha256:91d92a76bd6a29d88aa511715731ac59d1df33c8e4f5b393dbc16c16b9c08b1c
Deleted: sha256:8608eb76a683654e96af6087a19f416c4498e46f1121e15d63d2ce983750a3a2
Deleted: sha256:fd95c084aad87623a6db2c76480f0765e16ae2ba6de68ce1aefdb7ea4e8fe120
Deleted: sha256:968e68a28e13606ce58651654f554c342f51d5f3ea7e792cdcb21809fefe1a4f
Deleted: sha256:15628dda9c1556632ae3577f5dd8ff16c6456fb95da60284783e8c1f89c588ae
Deleted: sha256:49904d4d7d64ce4a3b64466e4d9bdc624fa8acc760c6a622dcbde03a0ada9fed
Deleted: sha256:df0e3d67e1ecb153c572e3110d36a8bbc46ded2dc376395384c6171732241d90
Deleted: sha256:05dc728e5e49b5db657ec403b875f757afdd8d31f624eea76d706d6eee6395b2
查看镜像,mysql已经被删除
[root@jokerdig ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB
容器的基本命令
准备工作
有了镜像在可以创建容器,这里我们下载一个CentOS镜像来进行测试;
下载CentOS镜像
1 | docker pull centos |
容器的基本命令
-
docker run
1
2创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]选项(OPTIONS)
名称 描述 -a stdin
指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d
后台运行容器,并返回容器ID; -i
以交互模式运行容器,通常与 -t 同时使用; -P
随机端口映射,容器内部端口随机映射到主机的端口; -p
指定端口映射,格式为:主机(宿主)端口:容器端口; -t
为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="Name"
为容器指定一个名称; --dns 8.8.8.8
指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com
指定容器DNS搜索域名,默认和宿主一致; -h "mars
指定容器的hostname; -e username="ritchie"
设置环境变量; --env-file=[]
从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2"
绑定容器到指定CPU运行; -m
设置容器使用内存最大值; --net="bridge"
指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]
添加链接到另一个容器; --expose=[]
开放一个端口或一组端口; --volume , -v
绑定一个卷 测试
1
2
3
4
5
6
7
8
9
10
11运行centos镜像,并进入容器
[root@jokerdig ~]# docker run -it centos /bin/bash
[root@20adf34e67c1 /]# ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp
etc lib64 mnt root srv usr
退出容器(直接退出)
[root@20adf34e67c1 /]# exit
exit
退出但不停止 ctrl+P+Q
[root@jokerdig ~]# -
docker ps
1
2列出容器
docker ps [OPTIONS]选项
名称 默认 描述 --all
,-a
显示所有容器(默认显示正在运行) --filter
,-f
基于所提供条件的过滤器输出 --format
根据提供的条件筛选输出使用Go模板漂亮地打印容器 --last
,-n
-1
显示n个上次创建的容器(包括所有状态) --latest
,-l
显示最新创建的容器(包括所有状态) --no-trunc
不截断输出 --quiet
,-q
仅显示容器ID --size
,-s
显示总文件大小 测试
1
2
3
4
5
6查看运行过的容器
[root@jokerdig ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20adf34e67c1 centos "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago hardcore_solomon
2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori
0b315095fc9e hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago keen_kalam -
docker rm
1
2移除一个或多个容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]选项(OPTIONS)
名称 默认 描述 --force
,-f
强制移除正在运行的容器(使用SIGKILL) --link
,-l
删除指定的链接 --volumes
,-v
删除与容器关联的匿名卷 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14删除容器(可以通过名称或者ID删除)
删除所有容器 docker rm -f $(docker ps -aq)
[root@jokerdig ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20adf34e67c1 centos "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago hardcore_solomon
2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori
0b315095fc9e hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago keen_kalam
移除ID为(0b315095fc9e)的容器,不能删除正在运行的容器
[root@jokerdig ~]# docker rm -f 0b315095fc9e
0b315095fc9e
[root@jokerdig ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20adf34e67c1 centos "/bin/bash" 31 minutes ago Exited (0) 29 minutes ago hardcore_solomon
2597d73a7546 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago keen_cori -
docker start
1
2启动一个或多个停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]选项(OPTIONS)
名称 默认 描述 --attach
,-a
连接STDOUT/STDERR和转发信号 --checkpoint
experimental (daemon) 从此检查点还原 --checkpoint-dir
experimental (daemon) 使用自定义检查点存储目录 --detach-keys
覆盖用于分离容器的键序列 --interactive
,-i
附加容器的STDIN 测试
1
2[root@jokerdig ~]# docker start 20adf34e67c1
20adf34e67c1 -
docker stop
1
2停止一个或多个正在运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]选项(OPTIONS)
名称 默认 描述 --time
,-t
10
在杀死它之前等待停止的秒数 测试
1
2[root@jokerdig ~]# docker stop 20adf34e67c1
20adf34e67c1 -
docker restart
1
2重新启动一个或多个容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]选项(OPTSIONS)
名称 默认 描述 --time
,-t
10
在杀死它之前等待停止的秒数 测试
1
2[root@jokerdig ~]# docker restart 20adf34e67c1
20adf34e67c1 -
docker kill
1
2杀死一个或多个正在运行的容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]选项(OPTIONS)
名称 默认 描述 --signal
,-s
KILL
发送到容器的信号 测试
1
2[root@jokerdig ~]# docker kill 20adf34e67c1
20adf34e67c1