Docker学习整理
概述
-
Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
官方文档:https://docs.docker.com/
仓库地址:https://hub.docker.com/
历史
2010年,dotCloud公司成立,要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。
后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker,但是当时并没有引起很大的反响。
2013年,dotCloud 公司的PaaS业务不太景气,公司名字改为docker,并在同年3月份将docker开源。不开则已,一开惊人,越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。
架构
Docker使用了C/S体系架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过UNIX套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
Docker daemon
Docker 守护进程 ( dockerd
) 监听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
Docker client
Docker 客户端 ( docker
) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 之类的命令时docker run
,客户端会将这些命令发送到dockerd
,从而执行它们。该docker
命令使用 Docker API。Docker 客户端可以与多个守护进程通信。
Docker registries
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Images
一个镜像是用于创建一个docker容器指令的只读模板。通常,一个镜像基于另一个镜像,并带有一些额外的自定义。
可以创建自己的镜像,也可以仅使用其他人创建并在registries中发布的镜像。构建自己的镜像可以使用简单的语法创建一个Dockerfile,用于定义创建镜像和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。更改Dockerfile并重建镜像时,只会重建那些已更改的层。与其他虚拟化技术相比,这是使镜像如此轻巧、小巧和快速的部分原因。
Containers
容器是镜像的可运行实例。使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新映像。
默认情况下,容器与其他容器及其主机相对隔离。可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。
容器由其映像以及在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,未存储在持久存储中的对其状态的任何更改都会消失。
docker安装与卸载
以centos7示例:
- 安装docker
# 环境 Linux version 3.10.0-693.el7.x86_64
# 1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定存储库。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 3.安装最新版本的 Docker Engine 和 containerd
sudo yum install docker-ce docker-ce-cli containerd.io
# 4.启动docker
sudo systemctl start docker
# 5.通过运行hello-world 映像验证 Docker Engine 是否已正确安装。
sudo docker run hello-world
- 卸载docker
# 1.卸载 Docker Engine、CLI 和 Containerd 包:
sudo yum remove docker-ce docker-ce-cli containerd.io
# 2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
常用命令
帮助命令
# 查看docker版本信息
docker version
# 显示docker的系统信息,包括镜像和容器的数量
docker info
# 帮助命令
docker --help
镜像命令
# 显示本地所有镜像
docker images
# 搜索镜像
docker search 镜像名
# 拉取镜像
docker pull 镜像名
# 删除镜像
docer rmi 镜像名/镜像id
# 删除全部的镜像
docker rmi -f $(docker images -aq)
容器命令
- 启动容器
docker start 容器id
- 重启容器
docker restart 容器id
- 停止容器
docker stop 容器id
- kill容器
docker kill 容器id
- 列出所有运行容器
docker ps
- 删除容器
docker rm 容器名/容器id
- 新建容器并启动
docker run 镜像id
-d # 后台运行
-i # 以交互模式运行,通常与-t一起使用
-P # 随机端口映射,容器内部端口随机映射到主机的端口
-p # 指定端口映射,格式为:主机(宿主)端口:容器端口
-t # 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb" #为容器指定一个名称
-e # 设置环境变量
--net="bridge" # 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[] # 添加链接到另一个容器;
--expose=[] # 开放一个端口或一组端口;
--volume,-v # 挂载绑定一个卷
docker run -itd --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /usr/docker_study/mysql/conf:/etc/mysql/conf.d 5c62e459e087
其他常用命令
docker logs -tf --tail 显示的日志条数 容器名/id # 查看日志
docker top 容器名/id # 查看容器中的进程信息
docker inspect 容器名/id # 查看镜像的元数据
docker exec -it 容器名/id /bin/bash # 通常容器以后台方式运行,需要进入其中修改配置:进入容器后开启一个新终端
docker attach 容器名/id # 进入容器正在执行的终端
docker cp 容器名/id:容器内路径 主机文件路径 # 从容器内拷贝文件到主机上
Exit # 从容器中退回主机
CTRL+Q+P # 容器不停止退出
镜像详解
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统)
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加载起来,这样最终的文件系统会包含所有的底层文件和目录。
镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs。
分层
docker pull的过程中是一层一层的下载。好处就是可以共享资源。
比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。
创建镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag] # 编辑容器后提交容器成为一个新镜像
创建自己的tomcat镜像示例:
# 1.搜索官方镜像
docker search tomcat
# 2.拉取官方镜像
docker pull tomcat:9.0
# 3.运行镜像
docker run -itd --name tomcat01 -p 8080:8080 tomcat:9.0
# 4.添加改变(官方镜像tomcat得webapps下无示例项目,需从webapps.list拷贝)
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps #当前即可正常访问示例项目
# 5.提交镜像
docker commit -a="rzz" -m="add a webapp" 702580afdd48 mytomcat:1.0 #容器id换成自己的
# 6.查看
docker images
发布镜像到dockerhub
推送镜像的规范是docker push 注册用户名/镜像名。
# 1.登录
docker login -u 用户名
# 2.将镜像修改为规范的镜像
docker tag 镜像名:版本 用户名/镜像名:版本
# 3.推送
docker push 用户名/镜像名:版本
# 4.搜索自己的镜像
docker search mycentos
Docker数据卷与持久化
为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。
挂载方式
通过docker run 命令挂载
# -v设置挂载 ro代表容器内只读 rw代表容器内可写可读
# 具名挂载 -v 卷名:容器内路径:ro|rw(默认rw,可不填)
docker run -itd -P --name mounttomcat01 -v juming:/usr/local/tomcat/webapps tomcat:9.0
# 匿名挂载 -v 容器内路径
docke