三、Docker的初体验
3.1、Docker的运行机制
Docker 并不是容器,而只是一个管理容器的引擎,Docker 的底层运行原理:Docker 服务启动→下载镜像→启动该镜像得到一个容器→容器里运行着我们想要的程序。
3.2、运行Docker容器
我们在启动Docker容器的时候,需要去下载一个镜像,Docker 运行一个容器前需要本地存在有对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库 )。
从 docker hub 官网搜索要使用的镜像,也可以在命令行使用命令搜索要使用的镜像,比如 docker search tomcat 进行搜索,然后下载所需要的镜像。
# 下载Tomncat镜像 docker pull tomcat # 运行镜像,他默认是前台运行,如果是后台运行的话需要加一个参数 -d docker run tomcat # 检查 tomcat 镜像是否启动容器成功 ps -ef | grep tomcat 复制代码
我们可以使用命令查看本地已有的镜像。
docker images 复制代码
在列出信息中,可以看到几个字段信息:
- REPOSITORY:来自于哪个仓库。
- TAG:镜像的标记。
- IMAGE ID:镜像的 ID 号(唯一)。
- CREATED:创建时间。
- SIZE:镜像大小。
3.3、进入Docker容器
# 命令格式 docker exec -it 容器id bash # 退出容器 exit 复制代码
其中 i 表示交互式的,也就是保持标准输入流打开。t 表示虚拟控制台,分配到一个虚拟控制台
3.4、客户机访问容器
从客户机上访问容器,需要有端口映射,docker 容器默认采用桥接模式与宿主机通信,需要将宿主机的 ip 端口映射到容器的 ip 端口上。
# 启动容器 docker run -d -p 宿主机端口:容器端口 容器名称或者容器ID # 停止容器 docker stop 容器 ID/名称 复制代码
四、Docker 核心组件
4.1、Docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建,镜像与容器的关系类似于面向对象编程中的类与对象的关系。
Docker | 面向对象 |
镜像 | 类 |
容器 | 对象 |
4.2、Docker 核心要素
Docker 包括三个核心要素:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
4.3、镜像
4.3.1、镜像的概述
Docker 镜像就是一个只读的模板,可以用来创建 Docker 容器。
例如:一个镜像可以包含一个完整的 centos 操作系统环境,里面仅安装了 mysql 或用户需要的其它应用程序。Docker 提供了一个非常简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
4.3.2、镜像的构成
镜像是由许多层的文件系统叠加构成的,最下面是一个引导文件系统bootfs,第二层是一个 root 文件系统 rootfs,root 文件系统通常是某种操作系统,比如 centos、Ubuntu,在 root 文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成 docker 中的镜像。
4.3.3、镜像的操作
下载镜像
# 下载一个1redis镜像 docker pull redis:latest 复制代码
reids 是查询到的镜像名称,latest 是镜像的标签 tag,获取一个镜像有两种方式:
- 一种是从官方镜像仓库下载。
- 另一种是自己通过 Dockerfile 文件构建。
如果有官方镜像,我们就不必自己用 Dockerfile 文件构建了,除非官方没有才会自己去 Dockerfile 文件构建。
列出已经下载的镜像
# 语法格式为:docker images [OPTIONS] [REPOSITORY] # -a :表示列举出所有的镜像,默认并不显示中间层的镜像1 # -q :表示只显示出镜像的1唯一id docker images # 或者是 docker images redis 复制代码
运行镜像
# 其中-d 表示在后台运行 docker run -d redis 复制代码
查看redis进程
ps -ef | grep redis 复制代码
查看容器镜像状态
docker ps 复制代码
进入容器
docker exec -it 镜像ID bash 复制代码
删除镜像
docker rmi redis:latest 复制代码
4.3.4、构建镜像
构建镜像可以让我们保存对容器的修改,并再次使用。提供了自定义镜像的能力,以软件的形式打包并方法服务及其运行环境。Docker中提供了两种方式来构建镜像:
- docker commit的方式,通过容器构建镜像。
- docker build方式,通过DockerFile文件构建。
4.3.4.1、使用commit方式构建镜像
使用commit构建镜像的语法格式为:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 复制代码
他有几个参数:
- -a:指定镜像的作者。
- -m:指定镜像提交的消息。
- -p:默认情况下使用commit构建镜像的时候会暂停服务器1,使用这个参数可以不暂停服务器。
构建镜像的步骤:
创建一个容器
# 创建一个端口为80名为commit_test的容器,并且指定基础镜像为centos docker run -itd --name commit_test -p 80 centos /bin/bash 复制代码
在容器内部安装nginx
yum install -y epel-release yum install -y nginx 复制代码
提交镜像
# 语法格式:docker commit -a '作者信息' -m '镜像名称' 需要构建的镜像的名字 构建出来的镜像名称:版本 docker commit -a 'xiaolin' -m 'nginx_mirror' commit_test nginx_mirror:v1 复制代码
查看
docker images 复制代码
启动容器
# 这里的容器id要根据实际情况进行替换 docker run -itd --name nginx_test2 -p 80 36210c82236d 复制代码
进入容器
# 这里的容器id要根据实际情况进行替换 docker exec -it e231f1dfea62 bash 复制代码
4.3.4.2、通过DockerFile文件
后面进行详细介绍
4.4、容器
4.4.1、容器的概述
容器是从镜像创建的运行实例。它可以被启动、停止、删除。每个容器都是相互隔离的、保证安全平台。可以把看做一个简易版的 Linux环境,包括 root 用户权限、进程空间、用户空间和网络空间和运行在其中的应用程序。
Docker 利用容器来运行应用,镜像是只读的。
4.4.2、容器的操作
通过镜像启动容器
命令会检测当前要运行的镜像在本地存不存在,若不存在他会自动 pull 下来再运行运行后会启动一个容器,,并且开启一个文件系统,。
你可以直接在容器内创建文件夹,运行一个指定的程序, 当程序退出后, 容器也就退出了。
运行时的容器无法删除, 只能停止后删除, 或者加上 -f 参数强制删除
# 语法格式为 docker run 容器名字 docker run -d redis 复制代码
启动守护式容器
# i --interactive=true|false 默认是false:允许你对容器内的标准输入 (STDIN) 进行交互 # t --tty=true|false 默认是false:在新容器内指定一个伪终端或终端 docker run -i -t 容器名 /bin/bash # 示范 docker run -i -t centos /bin/bash 复制代码
退出守护容器
exit 复制代码
查看运行中的容器
# -a 表示列举所有容器 # -i 表示列举最近创建的容器 docker ps [-a] [-l] 复制代码
查看所有的容器
docker ps -a 复制代码
查看所有容器id
docker ps -aq 复制代码
停止容器
docker stop 容器id或容器名称 复制代码
重启容器
docker start 容器id或容器名称 复制代码
删除容器
# 删除容器时,容器必须是停止状态,否则会报错 docker rm 容器id或容器名称 复制代码
进入容器
docker exec -it 容器 id 或容器名称 bash 复制代码
查看容器更多信息
docker inspect 容器id或容器名称 复制代码
停用全部运行中的容器
docker stop $(docker ps -q) 复制代码
删除全部容器
docker rm $(docker ps -aq) 复制代码
停用并删除容器
docker stop $(docker ps -q) & docker rm -f $(docker ps -aq) 复制代码
4.4.3、守护式容器
守护式容器就是一个可以长期运行的容器,我们之前创建的容器大多数都是刚刚创建完就关闭了。守护式容器的优点:
- 能长期运行。
- 适合运行运用1程序和服务。
以守护形式运行容器
docker run -i -t 容器名 /bin/bash # 例子(创建一个容器并且指定基础镜像) docker run -i -t centos /bin/bash 复制代码
退出但不关闭容器
Ctrl+P 和 Ctrl+Q 复制代码
附加到运行中的容器
docker attach 容器名 复制代码
启动守护式容器
docker run -d 镜像名 复制代码
查看容器运行日志
# -f 一致跟踪日志的变化,并返回结果 # -t 默认为false 在返回的结果上加上时间戳 # --tail = “all” 返回后几行的日志数据 docker logs [-f] [-t] [--tail] 容器名 复制代码
查看容器内1进程
docker top 容器名 复制代码
停止守护式进程
# 发送一个信号给容器,等待容器的关闭 docker stop 容器名 # 直接停止容器 docker kill 容器名 复制代码
4.5、仓库
4.5.1、仓库的概述
仓库是集中存放镜像文件的场所,有时候会把仓库和仓库注册服务(Registry)看做同一事物,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。用户也可以在本地网络内创建一个私有仓库,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公 有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来即可。
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。
4.5.2、仓库的操作
搜索镜像
docker search redis 复制代码
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 从左往右的参数依次是:镜像名字、镜像描述、镜像星数、是否官方创建、是否自动创建。
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 官方的镜像说明是官方项目组创建和维护的,AUTOMATED资源允许用户验证镜像的来源和内容。
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 根据是否是官方提供,可将镜像资源分为两类:
- 类似Centos这样的基础镜像,这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
- 另一种是类似bitnami/redis镜像,它是由Docker用户创建1并且1维护的,往往带有用户名前缀。
下载镜像
docker pull redis # 后面可接版本号 docker pull redis4.x 复制代码
Docker 仓库的概念跟 Git 类似,注册服务器也类似于 GitHub 这样的托管服务。 我
们发现,镜像的下载速度是出奇的慢,所以我们需要配置阿里的镜像加速器进行下载。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://175i7vum.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker