docker第二篇 docker操作:docker安装 | docker常用指令 | docker镜像 | 本地镜像发布到阿里云
第二篇 docker操作:docker安装 | docker常用指令 | docker镜像 | 本地镜像发布到阿里云
第二章 docker安装
2.1 安装条件
- Docker并非是一个通用的容器工具,它依赖于已存在并运行的 Linux内核环境。
- Docker实质上是在
已经运行的Linux下制造了一个隔离的文件环境
,因此它执行的效率几乎等同于所部署的 Linux主机
,因此,Docker必须部署在Linux内核的系统上。 - 如果其他系统想部署Docker 就必须安装一个虚拟Linux环境。
前提条件
- 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
- 查看自己的内核(用下面两个指令都可以)
uname -r
cat /etc/redhat-release
命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
2.2 安装
可以查看这个文档
- 查看linux版本
uname -r
cat /etc/redhat-release
- 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装gcc相关
yum -y install gcc
yum -y install gcc-c++
- 安装需要的软件包
sudo yum install -y yum-utils
- 设置stable镜像仓库
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 官网要求
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装阿里云镜像
- 更新yum软件包索引
yum makecache fast
- 安装docker CE
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 启动docker
systemctl start docker # systemctl是管理服务(守护进程)的命令
- 测试
docker version
docker run hello-world
- 卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
2.3 阿里云镜像加速
登录阿里云→控制台→左上角的产品与服务
选择镜像加速器
- 执行下面的脚本即可
2.4 run干了什么
第三章 docker常用指令
3.1 docker服务控制
指令 | 指令说明 |
---|---|
systemctl start docker | 启动 |
system stop docker | 停止 |
systemctl restart docker | 重启 |
systemctl status docker | 查看docker状态 |
systemctl enable docker | 开机启动 |
systemctl disable docker | 开机不启动 |
systemctl is-enabled docker | 查看开机启动的情况 |
docker info | 查看docker概要信息 |
3.2 帮助类指令
指令 | 说明 |
---|---|
docker --help | 查看docker总体帮助文档 |
docker 具体指令 --help |
3.3 镜像命令
3.3.1 查看镜像
指令 | 说明 | 选项 |
---|---|---|
docker images | 列出本地上的所有镜像 | -a (all) 列出本地所有的镜像(含历史映像层) -q 只显示镜像ID |
docker -aq image | 查看所有的镜像的id | |
docker images ubuntu | 查看ubuntu的信息 |
3.3.2 从仓库中查找镜像
指令 | 说明 | 选项 |
---|---|---|
docker search [OPTIONS] 镜像名字 | 从仓库中查找某个镜像 | |
docker search --limit 5 redis | 只列出N个镜像,默认是25个 |
举个例子
下面是每一项的说明
项 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
3.3.3 拉取镜像
指令 | 说明 | 选项 |
---|---|---|
docker pull 镜像名字[:TAG] | 从仓库中拉取某个镜像,TAG表示版本 | |
docker pull ubuntu | 没有tag等同于 ubuntu:latest 最新版 |
3.3.4 查看镜像/容器/数据卷所占的空间
指令 | 说明 | 选项 |
---|---|---|
docker system df | 查看镜像/容器/数据卷所占的空间 |
3.3.5 删除镜像
指令 | 说明 | 选项 |
---|---|---|
docker rmi 镜像ID | 删除某个镜像,rmi:rm image | -f,强制删除,不管是否当前有运行的容器 |
docker rmi 镜像名 | 根据镜像名删除 | |
docker rmi -f 镜像id | 强制删除镜像 | |
docker rmi -f 镜像名1:TAG 镜像名2:TAG | 删除多个镜像 | |
docker rmi -f $(docker images -qa) | 删除所有镜像 |
docker虚悬镜像
仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image
3.3.6 提交镜像commit
3.4 容器命令
使用ubuntu容器来演示
首先拉取镜像
3.4.1 新建 + 启动容器
(1) 常规指令
指令 | 说明 | 选项 |
---|---|---|
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] | 新建并启动容器 | --name="容器新名字" 为容器指定一个名称 -d (deamon) 后台运行容器并返回容器ID,也即启动守护式容器(后台运行); -i (interaction) 以交互模式运行容器,通常与 -t 同时使用; -t (tty) 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -P: 随机端口映射,大写P -p: 指定端口映射,小写p(常用) |
docker run -it ubuntu bash | 放在镜像名后面的bash是命令,这里我们希望有个交互式的shell,因此使用的是bash | |
docker run -it ubuntu /bin/bash | 使用/bin/bash也是一样的 | |
docker run -d 容器名 | 指定容器的后台运行模式 。 |
(2) 指定端口
参数 | 说明 |
---|---|
-p hostPort:containerPort | 端口映射-p 8080:80 |
-p ip:hostPort:containerPort | 配置监听地址-p 10.0.0.100:8080:80 |
-p ip::containerPort | 随机分配端口-p 10.0.0.100::80 |
-p hostPort:containerPort:udp | 指定协议-p 8080:80:tcp |
-p 81:80 -p 443:443 | 指定多个 |
- docker里面是含有一个简易版的操作系统的,可以对外开放端口,但是这个端口是容器的不是主机的
- 如果外接要访问容器,只能访问主机而不是容器的端口
- 因此可以设置映射,将主机的端口映射到容器的端口
-p 8080:80
一般使用这一种选项
(3) 后台启动程序
在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式。
docker run -d centos
使用镜像centos:latest
以后台模式启动一个容器
问题:然后docker ps -a
进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程
.
- 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,
我们配置启动服务只需要启动响应的service即可。例如service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
,常见就是命令行模式,表示我还有交互操作,别中断
比如对于ubuntu,最好加上 -it的选项
3.4.2 列出容器列表
参数 | 说明 | 说明 |
---|---|---|
docker ps [OPTIONS] | 列出当前所有正在运行的容器 | -a :列出当前所有正在运行的容器+历史上运行过的 -l:显示最近创建的容器。 -n:显示最近n个创建的容器。 -q:静默模式,只显示容器编号。 |
一般docker run之后,需要运行ps指令,来确保run成功了
3.4.3 退出容器
两种退出方式
指令 | 说明 |
---|---|
exit | run进去容器,exit退出,容器停止 |
ctrl+p+q | run进去容器,ctrl+p+q退出,容器不停止 |
3.4.4 启动容器
指令 | 说明 |
---|---|
docker start 容器ID或者容器名 | 启动容器 |
这里注意容器创建和容器启动的区别,run创建并启动了容器,容器可以关闭,还可以重启,但是并没有删除
3.4.5 重启容器
指令 | 说明 |
---|---|
docker restart 容器ID或者容器名 | 重启容器 |
3.4.6 停止容器
指令 | 说明 |
---|---|
docker stop 容器ID或者容器名 | 停止容器 |
docker kill 容器ID或者容器名 | 强制停止 |
3.4.7 删除容器
指令 | 说明 |
---|---|
docker rm 容器ID | 删除已经停止的容器 |
docker rm -f $(docker ps -a -q) | 一次删除多个容器 |
docker ps -a -q | xargs docker rm | 一次删除多个容器 |
3.4.8 查看容器日志/进程/细节
指令 | 说明 |
---|---|
docker logs 容器ID | 查看容器的日志 |
docker top 容器ID | 查看容器内运行的进程 |
docker inspect 容器ID | 查看容器内部细节 |
前面说过,可以把容器看做是一个简易版的
Linux 环境
(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
。
- 容器也算是一个linux环境,自然有linux中的进程体系
3.4.9 进入容器 exec & attach
指令 | 说明 |
---|---|
docker exec -it 容器ID/NAME bash | 进入容器以命令行的形式,exec也和run类似吧,含义不一样 |
docker attach 容器ID | 重新进入docker |
区别:
- attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
- exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
前面说过了,容器中含有一个linux环境,终端相当于linux的一个进程,所以attach是不开启新的进程,关闭直接会将容器关闭;但是exec是重新开了一个终端,不会关闭的
exec | attach |
---|---|
- 推荐使用
docker exec
命令,因为退出容器终端,不会导致容器的停止。
3.4.10 拷贝容器文件到主机
指令 | 说明 |
---|---|
docker cp 容器ID:容器内路径 目的主机路径 | 将容器中的文件复制到主机上 |
前面说过了,容器中含有一个linux环境,当然也有自己的文件系统,现在希望能够将容器中的文件拷贝到主机
3.4.11 导入导出容器
指令 | 说明 |
---|---|
docker export 容器ID > 文件名.tar | 导出容器的内容留作为一个tar归档文件[对应import命令] |
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 | 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export] |
如下演示
docker export e52223673c76 > container.tar.gz
cat container.tar.gz | docker import - test/myubuntu:1.3
- 导出就是将容器导出为tar文件
- 导入就是将tar文件导入成为
镜像
所有指令总结
指令 | 英文 | 作用 |
---|---|---|
attach | Attach to a running container | 当前 shell 下 attach 连接指定运行镜像 |
build | Build an image from a Dockerfile | 通过 Dockerfile 定制镜像 |
commit | Create a new image from a container changes | 提交当前容器为新的镜像 |
cp | Copy files/folders from the containers filesystem to the host path | 从容器中拷贝指定文件或者目录到宿主机中 |
create | Create a new container | 创建一个新的容器,同 run,但不启动容器 |
diff | Inspect changes on a container's filesystem | 查看 docker 容器变化 |
events | Get real time events from the server | 从 docker 服务获取容器实时事件 |
exec | Run a command in an existing container | 在已存在的容器上运行命令 |
export | Stream the contents of a container as a tar archive | 导出容器的内容流作为一个 tar 归档文件 |
history | Show the history of an image | 展示一个镜像形成历史 |
images | List images | 列出系统当前镜像 |
import | Create a new filesystem image from the contents of a tarbal | 从tar包中的内容创建一个新的文件系统映像 |
info | Display system-wide information | 显示系统相关信息 |
inspect | Return low-level information on a container | 查看容器详细信息 |
kill | Kill a running container | kill 指定 docker 容器 |
load | Load an image from a tar archive | 从一个 tar 包中加载一个镜像 |
login | Register or Login to the docker registry server | 注册或者登陆一个 docker 源服务器 |
logout | Log out from a Docker registry server | 从当前 Docker registry 退出 |
logs | Fetch the logs of a container | 输出当前容器日志信息 |
port | Lookup the public-facing port which is NAT-ed to PRIVATE_PORT | 查看映射端口对应的容器内部源端口 |
pause | Pause all processes within a container | 暂停容器 |
ps | List containers | 列出容器列表 |
pull | Pull an image or a repository from the docker registry server | 从docker镜像源服务器拉取指定镜像或者库镜像 |
push | Push an image or a repository to the docker registry server | 推送指定镜像或者库镜像至docker源服务器 |
restart | Restart a running container | 重启运行的容器 |
rm | Remove one or more containers | 移除一个或者多个容器 |
rmi | Remove one or more images | 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] |
run | Run a command in a new container | 创建一个新的容器并运行一个命令 |
save | Save an image to a tar archive | 保存一个镜像为一个 tar 包[对应 load] |
search | Search for an image on the Docker Hub | 在 docker hub 中搜索镜像 |
star | Start a stopped containers | 启动容器 |
stop | Stop a running containers | 停止容器 |
tag | Tag an image into a repository | 给源中镜像打标签 |
top | Lookup the running processes of a container | 查看容器中运行的进程信息 |
unpause | Unpause a paused container | 取消暂停容器 |
version | Show the docker version information | 查看 docker 版本号 |
wait | Block until a container stops, then print its exit code | 截取容器停止时的退出状态值 |
第四章 docker镜像
4.1 镜像是什么
- 是一种轻量级、可执行的
独立软件包
,它包含运行某个软件所需的所有内容
,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。 - 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
4.2 镜像的分层结构
分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
4.3 联合文件系统UnionFSM
- Union文件系统(UnionFS)是一种分层、轻量级并且高性能的
文件系统
,它支持对文件系统的修改作为一次提交来一层层的叠加
,同时可以将不同目录挂载到同一个虚拟文件系统下
(unite several directories into a single virtual filesystem)。 - Union 文件系统是
Docker 镜像的基础
。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
4.4 Docker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs
- bootfs(boot file system)主要包含
bootloader
和kernel
, bootloader主要是引导加载kernel
, Linux刚启动时会加载bootfs文件系统 - 在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。
- 当boot加载完成之后整个内核就都在内存中了,此时
内存的使用权已由bootfs转交给内核
,此时系统也会卸载bootfs
。
rootfs
- rootfs (root file system) ,在bootfs之上。
- 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。
- rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS和Ubuntu都是好几个G,为什么docker这里很小??
- 对于一个
精简的OS
,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了
,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。 - 由此可见对于不同的linux发行版,
bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs
。
4.5 为什么要采用分层结构
为什么 Docker 镜像要采用这种分层结构呢
- 镜像分层最大的一个好处就是
共享资源
,方便复制迁移,就是为了复用。 - 比如说有
多个镜像都从相同的 base 镜像构建
而来,那么Docker Host 只需在磁盘上保存一份 base 镜像
; - 同时
内存中也只需加载一份 base 镜像
,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
4.6 镜像层可读
Docker镜像层都是只读的,容器层是可写的
- 当容器启动时,一个
新的可写层被加载到镜像的顶部
。 这一层通常被称作“容器层
”,“容器层”之下的都叫“镜像层
”。 - 所有
对容器的改动
- 无论添加、删除、还是修改文件都只会发生在容器层中
。 - 只有容器层是可写的,容器层下面的所有镜像层都是只读的。
4.7 Docker镜像commit操作案例
docker commit提交容器副本使之成为一个新的镜像
指令 | 说明 |
---|---|
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] | 提交 |
commit也相当于是在本地仓库中提交了镜像,仅仅是在本地
下面做个演示
- 首先开启Ubuntu容器
docker run -it ubuntu bash
- 然后下载vim指令
apt-get update
apt-get -y install vim
- 然后随便编辑一个文件
vim /home/hello.txt
- 然后再提交这个容器
docker commit -a="crispy candy" -m="安装了vim的Ubuntu" 2df82f3a53ab test/myubuntu:1.0.3
重新启动镜像,可以发现还有vim指令
- Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。
- 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
第五章 本地镜像发到阿里云
- 容器编程镜像就是通过commit指令
5.1 镜像的生成方法
一般有两种
- container通过commit指令生成
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
- dockerfile通过build指令生成
在上面学过,只有容器是可写的,镜像是只可读的,因此容器可以生成新的镜像
5.2 本地镜像推送到阿里云
这里演示的是走左边的分支,即阿里云Docker Registry
5.2.1 创建仓库
- 选择控制台,进入容器镜像服务
- 选择个人实例
- 命名空间
- 仓库名称
- 获取仓库上传脚本
5.2.2 上传镜像
主要是登录和推送
docker login --username=crispycandy750 registry.cn-hangzhou.aliyuncs.com # 推送需要先登录
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]
应该是每个仓库只能有一种镜像,当然可以有该镜像的多个版本
5.2.3 拉下镜像
docker pull registry.cn-hangzhou.aliyuncs.com/testregister/myubuntu:[镜像版本号]
5.3 私有库Docker Registry
私有库是什么
- 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
- Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
- Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
5.3.1 创建本地仓库
- 下拉镜像 Docker Registry
docker pull registry
- 运行私有库,相当于本地有个私有的Docker hub
docker run -d -p 5000:5000 -v /test/myregistry:/tmp/registry --privileged=true registry
选项 | 说明 |
---|---|
-p 5000:5000 | 主机的5000端口映射到了容器的5000端口 |
-v /test/myregistry:/tmp/registry | 设置仓库的映射,registry这个容器比较特殊,可以设置映射 默认情况,仓库被创建在容器的/var/lib/registry目录下 建议自行用容器卷映射,方便于宿主机联调 |
-d | 后台运行(不后台运行就会霸占前台) |
- 修改配置使其支持http
docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。
在主机上执行
vim /etc/docker/deamon.json
{
"registry-mirrors": ["https://yg2hw0jm.mirror.aliyuncs.com"],
// 添加下面这一行
"insecure-registries":["192.168.200.130:5000"]
}
然后重新启动docker和容器
systemctl restart docker
docker run -d -p 5000:5000 -v /test/myregistry:/tmp/registry --privileged=true registry
5.3.2 上传镜像
首先给ubuntu容器添加ifconfig命令
apt-get update
apt-get install net-tools
- 首先将容器
commit
成为镜像(这个ubuntu安装了ifconfig的指令)
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
- 验证私服上有什么镜像
curl -XGET http://主机ip:主机映射端口/v2/_catalog
可以看到什么镜像都没有
- 将镜像的名称改成符合私服规范的镜像名
docker tag 镜像:Tag Host:Port/Repository:Tag
- push到私服
push之前要打开docker的http权限
docker push 192.168.200.130:5000/myubuntu:1.3
这里已经根据要求命名了。自动推到私服
- 再次查看
curl -XGET http://主机ip:主机映射端口/v2/_catalog
5.3.3 拉到本地
docker pull 192.168.200.130:5000/myubuntu:1.3