Docker
- 官网:/
- 文档:/
- 仓库:/
Docker的组成
- 镜像 (images)
- 容器(container)
- 仓库(registry)
1. 安装Docker
#1.卸载原有的Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.安装yum-utils软件包
sudo yum install -y yum-utils
#3.设置稳定的存储库
sudo yum-config-manager \
--add-repo \
/linux/centos/
#4.安装Docker
sudo yum install docker-ce docker-ce-cli
#5.启动Docker
sudo systemctl start docker
#6.查看版本
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
#7.测试Docker
sudo docker run hello-world
-------------------------------------------
Hello 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:
/
For more examples and ideas, visit:
/get-started/
- 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
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
2. 底层原理
-
Docker Client:也称为Docker客户端。其实就是Docker提供命令行界面工具,是许多Docker用户与Docker进行交互的主要方式。
-
Docker daemon:是服务器组建,以Linux后台服务的方式运行,是Docker最核心的后台进程,我们也把它称为守护进程。它负责响应来自Docker Client的请求,然后将这些请求翻译成系统调用完成容器管理操作。
-
Docker Image:可以看作一个特殊的文件系统,除了提供运容器运行时所需要的程序、库、资源、配置等文件外,还包含了一些为运行时准备的参数(匿名卷,环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将Docker镜像看成只读模版,通过它可以创建Docker容器。
-
Docker registry:是存储docker image的仓库
-
Docker Container:就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。
3. 容器与虚拟机
Docker 的命令
1. 帮助命令
docker version #版本信息
docker info #详细信息
docker 命令 --help #帮助信息
- 1
- 2
- 3
2. 镜像命令
docker images #查看镜像
--------------------------------
#REPOSITORY:镜像名称
#TAG:镜像版本
#IMAGE ID:镜像ID
#CREATED:镜像创建时间
#SIZE:镜像大小
docker images -a #显示所有信息
docker images -q #只显示镜像ID
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
docker search --help #搜索命令
-----------------------------------
Usage: docker search [可选参数] TERM
Options: #可选参数
-f, --filter filter 根据提供的条件过滤输出
--format string 使用Go模板进行打印搜索
--limit int 最大搜索结果数(默认25)
--no-trunc 不要截断输出
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
docker pull --help #镜像下载
----------------------------------
Usage: docker pull [可选参数] NAME[:版本号]
Options:
-a, --all-tags 下载存储库中所有标记的图像
--disable-content-trust 跳过图像验证(默认为true)
-q, --quiet 禁止详细输出
----------------------------------------------
[root@wdd ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql#版本信息
afb6ec6fdc1c: Pull complete #分层下载
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
4eec965ae405: Pull complete
a531a782d709: Pull complete
10e94c02b508: Pull complete
799a94b968ef: Pull complete
Digest: sha256:5c9fd7949bc0f076429fa2c40d0e7406e095bdb5216a923257b31972a6f3ae4f
Status: Downloaded newer image for mysql:5.7
/library/mysql:5.7#真实地址
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
docker rmi --help #镜像删除
Usage: docker rmi [可选参数] IMAGE [镜像名。。。]
Options:
-f, --force 强制删除镜像
--no-prune 不要删除未标记的父级
---------------------------------------------------------
docker rmi -f b84d68d0a7db #删除镜像
docker rmi -f id1 id2 id3 #批量删除镜像
docker rmi -f $(docker images -aq) #删除所有镜像
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3. 容器命令
docker run --help #运行镜像
Usage: docker run [可选参数] IMAGE [命令] [参数]
--name 容器姓名区分
-d 后台运行
-p 指定端口映射
-P 随机端口映射
-it 交互模式运行,进入容器内部
-v 绑定挂载卷
-e 环境配置,运行内存等
#测试
docker pull centos
#启动
docker run -it 470671670cac /bin/bash
#容器停止并退出
exit
#容器不停止退出
ctrl+P+Q
#显示容器
docker ps 【参数】
-a #显示所有容器包括历史容器
-n=?#参数限定
-q #只显示ID
#删除容器
docker rm id #删除容器,不能删除
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xrags docker rm #删除所有容器
#容器启动和停止
docker strat id #启动容器
docker restart id #重启容器
docker stop id #停止容器
docker kill id #强制停止容器
- 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
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
4. 常用命令
#后台运行容器
docker run -d id
#docker ps 时容器停止了,后台运行必须有一个前台进程,没有即停止
#查看日志
docker logs -t -f --tail 行数 id
#容器进程
docker top id
#容器元数据
docker inspect id
#进入容器
docker exec -it id /bin/bash #交互模式进入正在运行的容器中,进入后开启新的终端
docker attach id #进入容器正在执行的终端,没有创建新的进程
#拷贝命令
docker cp
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
Docker镜像原理
1. 镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行
某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
- 获取镜像:远程仓库+好友分享+自己制作
2. 联合文件系统(UnionFS)
-
Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提
交来层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
-
Union文件系统是Docker镜像的基础。
-
镜像可以通过分层来进行集成,基于基础镜像,可以制作各种具体的应用镜像。
-
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠
加起来,这样最终的文件系统会包含所有底层文件和目录。
3. Docker 镜像加载原理
-
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
-
bootfs(boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启
时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样
的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs
转交给内核,此时系统也会卸载bootfs。
-
roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标
-
准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。
-
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
4. Docker镜像
-
采用这种分层结构最大的一个好处就是共享资源,比如有多个镜像都从相同的base镜像构建而来,那么宿主
机只需要在磁盘上保存一份base镜像,
-
同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
-
docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作 “容器
层”,“容器层” 之下的都叫镜像层。
5. commit镜像
docker commit [可选参数] 容器id [新镜像名[:版本]]
-a, --author string 作者
-c, --change list 将Dockerfile指令应用于创建的映像
-m, --message string 提交信息
-p, --pause 提交期间暂停容器(默认为true)
- 1
- 2
- 3
- 4
- 5
容器数据卷
**Docker数据持久化:**容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。
1. 优点:
- 绕过“拷贝写”系统,以【达到本地磁盘IO的性能】,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
- 绕过“拷贝写”系统,有些文件【不需要在docker commit打包】进镜像文件。
- 数据卷可以在【容器间】共享和重用数据
- 数据卷可以在【宿主】和【容器】间共享数据
- 数据卷数据改变是【直接修改】的
- 数据卷是【持续性】的,直到没有器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。
2. 命令挂载 -v
docker run 【-d】【 -v 宿主机目录:容器目录】 【--name 容器名】 【-p 宿主端口:容器端口】 镜像ID
#启动mysql
- 1
- 2
- 3
#查看元数据
docker inspect 970ffe5b3623
-----------------------------------------
"Mounts": [ #挂载
{
"Type": "bind",
"Source": "/root/mysql/conf", #宿主机目录
"Destination": "/etc/mysql/", #容器目录,Mysql的配置文件
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/mysql/logs",
"Destination": "/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/root/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
- 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
- 27
- 28
- 29
3. 具名与匿名挂载
#匿名挂载 -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的卷信息
docker vplume ls
------------------------------
DRIVER VOLUME NAME
local 9f38292179faal78afcce54d80be99d4ddd68c91d2a68870bcece72d2b7ed061
#具名挂载 -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume Is
DRIVER VOLUME NAME
local juming-nginx
docker volume inspect juming-nginx
------------------------------------
Mountpoint:“/var/Lib/docker/voLumes/juming-nginx/_data”
#docker容器内没有指定目录时默认在 /var/Lib/docker/voLumes/xxx/_data
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
-v 容器路径 #匿名挂载
-v 卷名:容器路径 #具名挂载
-v /路径:容器路径 #路径挂载
- 1
- 2
- 3
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro readonly 只读权限-----只能通过宿主机操作,容器内无法操作
#rw readwrite 可读可写权限
- 1
- 2
- 3
- 4
- 5
4. Dockerfile挂载
vim dockerfile1
- 1
FROM centos
VOLUME ["volume1","volume1"] #匿名挂载
CMD echo "-----end------"
CMD /bin/bash
- 1
- 2
- 3
- 4
docker build -f /home/dockerfile1 -t wddcentos:1.0 .#创建镜像
- 1
5. 数据卷同步不同容器
父容器:数据卷容器
--volume-from #数据备份,双向拷贝
- 1
docker -it --name docker01 970ffe5b3623 #父容器
docker -it --name docker02 --volumes-from docker01 970ffe5b3623 #挂载docker01数据
docker -it --name docker03 --volumes-from docker01 970ffe5b3623 #挂载docker01数据
#docker01 docker02 docker03 挂载卷数据共享,持久化保存,删除某个容器数据仍存在
- 1
- 2
- 3
- 4
DockerFile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- 创建文件——vim文件——docker build——docker run——docker commit ——docker push
1. dockerfile命令
-
保留关键字大写
-
每一个命令为一层
-
#注释
-
DockerFile——Docker镜像——Docker 容器
FROM #基础容器
MAINTAINER #作者 姓名+邮箱
RUN #用于执行后面跟着的命令行命令
ADD #
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #暴漏端口配置
CMD #指定这个容据启动的时候要运行的今,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候运行的指今,可追加命令
ONBUILD #用于延迟构建命令的执行,新的镜像使用镜像时,执行命令
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Docker-Compose
通过编写文件来管理镜像
docker-compose up -d #启动docker-compose
docker-compose down #关闭docker容器
docker-compose restart #重启docker容器
docker-compose up -d --build #从新构建docker镜像
- 1
- 2
- 3
- 4
docker管理redis
version: '3'
services:
redis:
restart: always
image: redis:latest
container_name: redis
ports:
- 6379:6379
volumes:
- ./data:/data
- ./conf/:/usr/local/redis/
- ./logs:/logs
command:
redis-server /usr/local/redis/"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
docker-compose up -d #启动
docker-compose down #关闭docker容器
docker-compose restart #重启docker容器
docker-compose up -d --build #从新构建docker镜像
docker管理redis
version: '3'
services:
redis:
restart: always
image: redis:latest
container_name: redis
ports:
- 6379:6379
volumes:
- ./data:/data
- ./conf/:/usr/local/redis/
- ./logs:/logs
command:
redis-server /usr/local/redis/"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14