文章目录
Docker安装
Docker的基本组成
Docker镜像(image)
Docker镜像就好比一个模板,可以通过这个模板来创建容器服务 tomcat镜像 —> run —> tomcat01容器(提供服务器),通过镜像可创建多个容器(最终项目运行在容器中)
Docker容器(container)
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
容器启动、停止、删除
Docker仓库(repository)
仓库就是存放镜像的地方
仓库分为公有仓库和私有仓库
Docker安装与卸载
前言
在新主机首次安装 Docker 之前,需要设置 Docker 仓库,之后,您可以从仓库安装和更新 Docker,设置仓库,需要安装所需的软件包。yum-utils 提供了 yum-config-manager
yum
Yellow dog Updater, Modified(Yum),是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理工具。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
yum-utils
utils是常用工具的意思
yum-utils是一个包。需要用yum来安装:yum install yum-utils
yum-config-manager
yum-config-manager是一个命令。包含在yum-utils这个包内。即安装yum-utils之后才能运行yum-config-manager命令。
安装
# 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#需要的安装包
yum install -y yum-utils
#设置镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是国外的,十分慢
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云的
#下载安装docker相关
yum install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#使用 docker version 查看是否安装成功
docker version
#Helloworld
docker hello-world #看到 Hello from Docker
#查看已下载的docker镜像
docker images
卸载Docker
#卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#删除资源
rm -rf /var/lib/docker
配置阿里云镜像加速
在阿里云的产品与镜像服务中找到容器镜像服务,然后点击镜像加速器
#在/etc/docker下建立一个daemon.json,然后注册了阿里云镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://8su6p2zl.mirror.aliyuncs.com"]
}
EOF
#镜像重启 + docker重启
sudo systemctl daemon-reload
sudo systemctl restart docker
docker run hello-world流程
底层原理
Docker是怎么工作的?
Docker是一个 Client/Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer 接收到 DockerClient 的指令,就会执行这个命令
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,VM需要的是Ghest OS
- 新建一个容器,Docker不需要像VM一样重新加载一个OS内核,避免引导性操作
- VM加载Ghest OS为分钟级别,而Docker是利用宿主机OS,省略了复杂的过程,秒级启动
Docker的常用命令
帮助命令
#显示docker的版本信息
docker version
#显示docker的系统信息,包括镜像与容器数量
docker info
#帮助命令
docker 命令 --help
官方帮助文档:https://docs.docker.com/reference/
镜像命令
查看所有本地主机上的镜像 docker images
[root@dinosaur /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 9 months ago 13.3kB
#解释
REPOSITORY 仓库的镜像源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATE 镜像的创建时间
SIEZ 镜像的大小
#可选项
-a, --all 出所有的镜像
-q, --quiet 只显示镜像的ID
搜索镜像 docker search
[root@dinosaur /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10053 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3684 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 735 [OK]
#可选项,通过收藏数量来过滤
--fliter=STARTS=3000 搜索出来的镜像就是STARTS大于3000的
下载镜像 docker pull
#下载镜像 docker pull 镜像名[:tag]
[root@dinosaur /]# docker pull mysql
Using default tag:latest #如果不写tag,默认就是最新版本
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete #分层下载,docker image 的核心
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
9eb4355ba450: Pull complete
6879faad3b6c: Pull complete
164ef92f3887: Pull complete
6e4a6e666228: Pull complete
d45dea7731ad: Pull complete
Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址 即 docker pull mysql 与 docker.io/library/mysql:latest 等价
#指定版本下载
[root@dinosaur /]# docker pull mysql:5.7
bb79b6b2107f: Already exists
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
6d2fc69dfa35: Pull complete
56153548dd2c: Pull complete
3bb6ba940303: Pull complete
3e1888da91a7: Pull complete
Digest: sha256:b3dc8d10307ab7b9ca1a7981b1601a67e176408be618fc4216d137be37dae10b
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除镜像 docker rmi
[root@dinosaur /]# docker rmi -f 镜像ID #删除指定的镜像
[root@dinosaur /]# docker rmi -f 镜像ID 镜像ID 镜像ID #删除指定的多个镜像
[root@dinosaur /]# docker rmi -f $(docker images -aq) #删除全部镜像
容器命令
说明:我们有了镜像才可以创建容器,下载一个 centos 镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" #容器名字 eg:tomcat01 tomcat02
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P #随机指定端口
#测试:启动并进入容器
[root@iZm5e8bu6m70tacta2xvz9Z ~]# docker run -it centos /bin/bash
[root@683ca0574062 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@683ca0574062 /]# exit
exit
列出所有的运行的容器
#docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器 + 历史运行过的容器
-n=? #显示最近创建的n个容器
-q #只显示容器的编号
[root@dinosaur ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@dinosaur ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
683ca0574062 centos "/bin/bash" 5 minutes ago Exited (0) 4 minutes ago nifty_dewdney
1ba49974e12b bf756fb1ae65 "/hello" 14 hours ago Exited (0) 14 hours ago sharp_zhukovsky
退出容器
exit #容器停止并退出
ctrl + p + q #容器不停止并退出
删除容器
docker rm 容器ID #删除指定ID的容器,不能删除正在运行的容器
docker rm -f $(docker ps -sq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动与停止容器
docker start 容器ID #启动容器
docker restart 容器ID #重启容器
docker stop 容器ID #停止当前正在运行的容器
docker kill 容器ID #强制停止当前容器
常用的其他命令
后台启动容器
#docker run -d 镜像名
[root@dinosaur ~]# docker run -d centos
7f800c985ad510df2e0173b98456c4190e2831a1ab485033758cf09b0e186a57
#问题:docker ps 发现centos停止了
#常见坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用就会自己停止
#nginx :容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -tf --tail 日志数 容器ID
查看容器中进程信息
docker top 容器ID
查看容器的元数据
[root@dinosaur ~]# docker inspect 容器ID
进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令:docker exec -it 容器ID /bin/bash 进入容器后开启一个新的终端(常用)
#方式2:docker attach 容器ID 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
结尾
Docker镜像讲解
镜像是什么?
镜像是一种轻量级,可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件。它包含运行整个软件所需要的所有内容,包括代码、运行时库、环境变量和配置文件
所有的应用,直接打包成Docker镜像,就可以直接跑起来
如何得到镜像?
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像:DockerFile
Docker镜像加载原理
base镜像
base 镜像含义
- 不依赖其他镜像,从 scratch 构建
- 其他镜像可以之为基础进行扩展
base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等
Base镜像提供的是最小化的发行版本,且不同的Base镜像共用 kernel,各自有自己的rootfs
rootfs
内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉
用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录
对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了
而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了
base 镜像提供的是最小安装的 Linux 发行版,不同 Linux 发行版的区别主要就是 rootfs
UnionFS(联合文件系统)
UnionFS(联合文件系统)是一种分层,轻量级,并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,它是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特征:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
Docker镜像实际上由一层层的文件系统组成 — UnionFS
bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader 主要是引导加载 kernel ,Linux 刚启动时候会加载 bootfs 系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含boot加载器和内核,当加载完成之后整个内核就在内存中了,此时内存的使用权已从 bootfs 转交给内核,系统卸载 bootfs
rootfs(root file system),在 bootfs 之上,包含的就是典型 Linux 系统中的 /dev /prov /bin /etc 等标准目录和文件,rootfs 就是各种不同的操作系统的发行版,比如 Ubuntu、Centos等
平时我们安装虚拟机的 Centos 都是好几个 G ,为什么 Docker 这里才200多M?
对于一个精简的 OS ,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel ,自己只需要提供 rootfs 就可以了。由此可见对于不同 Linux 的发行版, bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以共用 bootfs
虚拟机分钟级别启动,容器则为秒级
分层理解
分层的镜像
我们去下载一个镜像,观察下面的日志输出可以看到是在一层一层的下载!
[root@dinosaur home]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
f99a38f44786: Pull complete
d6fc863042e2: Pull complete
9bd1af4eae13: Pull complete
Digest: sha256:33ca074e6019b451235735772a9c3e7216f014aae8eb0580d7e94834fe23efb3
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
为什么Docker 镜像要采用这种分层的结构呢?
最大的好处莫过于资源共享,比如有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需要在磁盘保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像就可以为所有的容器服务了,而且镜像的每一层都可以被共享
查看镜像分层的方式可以通过 docker image inspect
命令 eg :docker image inspect redis
理解
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就在当前镜像层上创建新的镜像层
举个例子:如果基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是镜像的第一层,如果在该镜像中添加 python 包
就会在基础镜像层上创建第二个镜像层,如果继续添加一个安全补丁就是第三个镜像层
在添加额外镜像层的同时,镜像始终保持是当前所有镜像的组合
例子:下面图中每个镜像层包含三个文件,而镜像包含了来自于两个镜像层的六个文件
下图展示了一个三层镜像,在外部看来整个镜像只有六个文件,实际上文件七为文件五的更新版本
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,使得文件的版本更新作为一个新的镜像层添加到镜像中
特点
Docker镜像都是可读的,当容器启动时,一个新的可写层被加载到镜像的顶部
这一层就是我们通常说的容器层,其下的都叫镜像层
commit镜像
docker commit #提交镜像成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 镜像ID 目标镜像名:[TAG]
测试
#启动一个默认的tomcat
#发现这个默认的tomcat没有webapps应用,这是镜像的原因,官方的镜像默认webapps下没文件
#拷贝进去基本的文件
#将我们操作过的容器通过commit提交为一个新的镜像 我们以后就使用我们修改后的镜像即可!
[root@dinosaur home]# docker commit -a="dinosaur" -m="add webapps->app !" 6aa8e563dab6 tomcat02:1.0
sha256:f75fcdcb1ab32066104c1aed527db0b6937f9abe369f840776a32d65991ad2fe
[root@dinosaur home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 f75fcdcb1ab3 18 seconds ago 652MB
tomcat latest 91fcd9c5b3a 2 days ago 647MB
centos latest 0d120b6ccaa8 2 months ago 215MB