文章目录
一. 安装Docker
在aliyun中找到Docker-ce下载Docker相关的源
里面有集体安装步骤
-
系统版本选择: Docker 目前已经支持多种操作系统的安装运行,比如
Ubuntu、CentOS、 Redhat、DebianFedora
,甚至是还支持了 Mac 和 Windows,在 linux 系统上需要内核版本在 3.10 或以上,docker 版本号之前一直是 0.X 版本或 1.X 版本,例如 17.09 表示是 2017 年 9 月份发布的。 -
Docker 版本选择:
2017 年推出(将 docker 更名为)新的项目Moby,github 地址:https://github.com/moby/moby,Moby 项目属于 Docker 项
目的全新上游,Docker 将是一个隶属于的 Moby 的子产品,而且之后的版本之 后开始区分为CE
版本(社区版本
)和EE
(企业收费版),CE 社区版本和 EE 企业版本都是每个季度发布一个新版本,但是 EE 版本提供后期安全维护 1 年,而CE 版本是4 个月
,(稳定3. 6. 9. 12
版本)本次演示的 Docker 版本为 18.03,以下为官方原文:
https://blog.docker.com/2017/03/docker-enterprise-edition/
1. 下载 rpm 包安装
官方 rpm 包下载地址:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
2. 通过修改 yum 源安装
直接下载.repo
的yum源
直接wget
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
3. 验证
- 启动并验证 docker 服务:
systemctl start docker
systemctl enable docker
记住能不重启就不要重启
,重启会丢失Docker所有的内容,包括镜像等
- 验证 docker 版本
- 验证 docker0 网卡
在 docker 安装启动之后,默认会生成一个名称为 docker0 的网卡并且默认 IP 地 址为172.17.0.1
的网卡
- 验证 docker 信息
- docker 存储引擎
目前 docker 的默认存储引擎为 overlay2
,需要磁盘分区支持 d-type
文件分层功能,因此需要系统磁盘的额外支持。
官方文档关于存储引擎的选择文档:
https://docs.docker.com/storage/storagedriver/select-storage-driver/
Docker 官方推荐首选存储引擎为 overlay2 其次为 devicemapper,但是devicemapper 存在使用空间方面的一些限制,虽然可以通过后期配置解决,但是官方依然推荐使用 overlay2,以下是网上查到的部分资料:
https://www.cnblogs.com/youruncloud/p/5736718.html
如果 docker 数据目录是一块单独的磁盘分区而且是 xfs 格式
的,
那么需要在格式化的时候加上参数-n ftype=1
,
否则后期在启动容器的时候会报错不支持 d-type
报错界面
- docker 服务进程:
通过查看 docker 进程,了解 docker 的运行及工作方式
查看宿主机进程树
18.06 及之前的 docker 版本,进程关系
7 . 查看 containerd 进程关系:
有四个进程:
dockerd
:被 client 直接访问,其父进程为宿主机的 systemd 守护进程。
docker-proxy
:实现容器通信,其父进程为 dockerd
containerd
:被 dockerd 进程调用以实现与 runc 交互。
containerd-shim
:真正运行容器的载体,其父进程为 containerd
containerd-shim命令使用
容器的创建与管理过程
通信流程:
- dockerd 通过
grpc
和containerd
模块通信,dockerd 由libcontainerd
负责和 containerd 进行交换,dockerd 和 containerd 通信 socket 件:/run/containerd/containerd.sock
。 - containerd 在 dockerd 启动时被启动,然后 containerd 启动 grpc 请求监听,
containerd 处 理 grpc 请求
,根据请求做相应动作。 - 若是 start 或是 exec 容器,containerd 拉起一个
container-shim
, 并进行相应的操作。 - container-shim 别拉起后,
start/exec/create 拉起 runC 进程
,通过 exit、control 文件和containerd 通信,通过父子进程关系和 SIGCHLD 监控容器中进程状态。 - 在整个容器生命周期中,containerd 通过
epoll 监控容器文件
,监控容器事件
grpc 简介
gRPC 是 Google 开发的一款高性能、开源和通用的 RPC 框架,支持众多语言客户端
二. Docker 镜像加速配置
国内下载国外的镜像有时候会很慢,因此可以更改 docker 配置文件添加一个加速器
,可以通过加速器达到加速下载镜像
的目的。
获取加速地址:
浏览器打开 http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明
三. Docker 镜像管理
Docker 镜像含有启动容器所需要的文件系统及所需要的内容
,因此镜像主要用于创建并启动 docker 容器。
Docker 镜像含里面是一层层文件系统,叫做 Union FS(联合文件系统
),联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境,每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限
,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读
的,构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统,一层层往上叠加
,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样,当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层也不需要知道里面有几层,结构如下
一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,bootfs
(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel, 当 kernel 被加载到内存中后 bootfs 会被 umount 掉,rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc
等标准目录和文件,下图就是 docker image 中最基础的两层结构,不同的 linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别。
但是对于 docker 镜像通常都比较小,官方提供的 centos 基础镜像在 200MB 左 右,一些其他版本的镜像甚至只有几 MB,docker 镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序库就可以
了,比如 alpine 镜像,在 5M 左右。下图就是有两个不同的镜像在一个宿主机内核上实现不同的 rootfs
容器、镜像父镜像
docker 命令是最常使用的 docker 客户端命令,其后面可以加不同的参数以实现响应的功能
搜索镜像search
在官方的 docker 仓库中搜索指定名称的 docker 镜像,也会有很多三方镜像。
#带指定版本号
docker search centos:7.2.1511
#不带版本号默认 latest
docker search centos
下载镜像
从 docker 仓库将镜像下载到本地,命令格式如下
docker pull 仓库服务器:端口/项目名称/镜像名称:tag(版本)号
docker pull alpine
docker pull nginx
docker pull hello-world
docker pull centos
查看本地镜像
下载完成的镜像比下载的大,因为下载完成后会解压
docker images
镜像导出
可以将镜像从本地导出问为一个压缩文件,然后复制到其他服务器进行导入使用。
- 导出方法 1:
docker save centos -o /opt/centos.tar.gz
ll /opt/centos.tar.gz
-rw------- 1 205225472 Nov 1 03:52 /opt/centos.tar.gz
- 导出方法 2:
docker save centos > /opt/centos-1.tar.gz
ll /opt/centos-1.tar.gz
-rw-r--r-- 1 205225472 Nov 1 03:52 /opt/centos-1.tar.gz
查看镜像内容:
cd /opt/
tar xvf centos.tar.gz
#包含了镜像的相关配置,配置文件、分层
cat manifest.json
[{"Config":"196e0ce0c9fbb31da595b893dd39bc9fd4aa78a474bbdc21459a3ebe855b
7768.json","RepoTags":["docker.io/centos:latest"],"Layers":["892ebb5d1299cbf459f6
7aa070f29fdc6d83f40
25c58c090e9a69bd4f7af436b/layer.tar"]}]
分层为了方便文件的共用,即相同的文件可以共用
[{"Config":" 配置文件 .json","RepoTags":["docker.io/nginx:latest"],"Layers":[" 分 层
1/layer.tar","分层 2 /layer.tar","分层 3 /layer.tar"]}]
镜像导入
将镜像导入到 docker
scp /opt/centos.tar.gz 192.168.10.206:/opt/
docker load < /opt/centos.tar.gz
或
docker load -i /opt/centos.tar.gz
删除镜像
docker rmi centos
获取运行参数帮助
docker daemon --help
命令总结
#导入本地镜像
docker load -i centos-latest.tar.xz
#centos #导出镜像
docker save > /opt/centos.tar
#删除指定 ID 的镜像,通过镜像启动容器的时
候镜像不能被删除,除非将容器全部关闭
docker rmi 镜像 ID/镜像名称
#删除容器
docker rm 容器 ID/容器名称
#强制删除正在运行的容器
docker rm 容器 ID/容器名-f
删除none镜像
docker rmi -f `docker images |grep '<none>'|awk '{print $3}'`
四. 容器操作基础命令
命令格式:
docker run [选项] [镜像名] [shell 命令] [参数]
#单次执行,没有自定义容器名称
docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hello wold']
#启动的容器在执行完 shel 命令就退出了
docker run centos /bin/echo 'hello wold'
1. 容器基本操作
从镜像启动一个容器:
会直接进入到容器
,并随机生成容器 ID 和名称
bash默认有
docker run -it docker.io/centos bash
[root@11445b3a84d3 /]#
退出容器不注销
ctrl+p+q
-d 后台运行
-q 取出PID
显示正在运行的容器:
docker ps
显示所有容器:
包括当前正在运行以及已经关闭
的所有容器:
docker ps -a
删除运行中的容器:
即使容正在运行当中,也会被强制删除掉
docker rm -f 11445b3a84d3
2. 随机映射端口
#下载 nginx 镜像
docker pull nginx
#前台启动并随机映射本 地端口到容器的 80
docker run -P docker.io/nginx
前台启动的会话窗口无法进行其他操作,除非退出,但是退出后容器也会退出
随机端口映射,其实是默认从 32768 开始
3. 指定端口映射
方式 1:本地端口 81 映射到容器 80 端口:
-d后台运行
--name 指定名字
docker run -p 81:80 --name nginx-test-port1 nginx
docker run -it -d -p 81:80 nginx
方式 2:本地 IP:本地端口:容器端口
docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx
方式 3:本地 IP:本地随机端口:容器端口
docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx
方式 4:本机 ip:本地端口:容器端口/协议
,默认为 tcp 协议
docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx
方式 5:一次性映射多个端口+协议:
docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
查看容器已经映射的端口:
或者ID
docker port nginx-test-port5
给镜像打标签
相当与软连接
旧 新
docker tag centos:latest centos:7.6.1810
查看运行的容器
查看 Nginx 容器访问日志
#一次查看
后面这个可以是id
docker logs nginx-test-port3
#持续查看
docker logs -f nginx-test-port3
测试访问一下
自定义容器名称:
docker run -it --name nginx-test nginx
后台启动容器:
-d 后台运行
docker run -d -P --name nginx-test1 docker.io/nginx
创建并进入容器:
-t分配一个tty
-i 标准输入
docker run -t -i --name test-centos2 docker.io/centos
/bin/bash
#创建容器后直接进入,执行 exit 退出后容器关闭
[root@a8fb69e71c73 /]#
docker run -d --name centos-test1 docker.io/centos
单次运行:
容器退出后自动删除:
docker run -it --rm --name nginx-delete-test docker.io/nginx
传递运行命令:
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。
docker run -d centos /usr/bin/tail -f '/etc/hosts'
容器的启动和关闭:
docker stop f821d0cd5a99
docker start f821d0cd5a99
4. 进入到正在运行的容器
- 使用 attach 命令:
使用方式为 docker attach 容器名,attach 类似于 vnc,操作会在各个容器界面显示,所有使用此方式进入容器的操作都是同步显示的且 exit 后容器将被关闭,且使用 exit 退出后容器关闭,不推荐使用
,需要进入到有 shell 环境的容器,比如 centos 为例:
也就是有多个窗口在这个容器中,那么使用attach就会同时操作
docker run -it centos bash
[root@63fbc2d5a3ec /]#
docker attach 63fbc2d5a3ec
[root@63fbc2d5a3ec /]#
在另外一个窗口启动测试页面是否同步
-
使用 exec 命令:
推荐
-
用 nsenter 命令:
推荐使用此方式,nsenter 命令需要通过 PID 进入到容器内部
,不过可以使用docker inspect 获取到容器的 PID:
#安装 nsenter 命令
yum install util-linux
#查看所有的参数
docker inspect ID
docker inspect -f "{{.NetworkSettings.IPAddress}}" id
//结果 172.17.0.2
#获取到某个docker 容器的 PID,可以通过 PID 进入到容器内
docker inspect -f "{{.State.Pid}}" mydocker
docker inspect -f "{{.State.Pid}}" centos-test3
5892
#通过PID进入容器
nsenter -t 5892 -m -u -i -n -p
# ls
- 脚本方式:
将 nsenter 命令写入到脚本进行调用,如下:
cat docker-in.sh
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p }
docker_in $1
#测试脚本是否可以正常进入到容器且退出后仍然正常运行:
chmod a+x docker-in.sh
./docker-in.sh centos-test3
[root@66f511bb15af /]# pwd
/
[root@66f511bb15af /]# exit
logout
[root@docker-server1 ~]# ./docker-in.sh centos-test3
[root@66f511bb15af /]# exit
Logout
查看容器内部的 hosts 文件:
docker run -it --name test-centos3 docker.io/centos
/bin/bash
cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 056bb4928b64 #默认会将实例的 ID 添加到自己的 hosts 文件
ping 容器 ID
5. 关闭 / 删除容器
批量关闭正在运行的容器
#正常关闭所有运行中的容器
-q 取ID
docker stop $(docker ps -a -q)
批量强制关闭正在运行的容器:
针对与java容器
批量启动也一样start
#强制关闭所有运行中的容器
docker kill $(docker ps -a -q)
批量删除已退出容器:
docker rm -f `docker ps -aq -f status=exited`
批量删除所有容器
docker rm -f $(docker ps -a -q)
6. 指定容器 DNS
dns 服务,默认采用宿主机的 dns 地址
一
是将 dns 地址配置在宿主机
二
是将参数配置在 docker 启动脚本里面 --dns=1.1.1.1
docker run -it --rm --dns 223.6.6.6 centos bash
cat /etc/resolv.conf
nameserver 223.6.6.6
记住不要重启Docker
,重启会丢失Docker所有的内容,包括镜像等
注意:
docker容器
会生成iptables规则
切记里面的iptables规则
一般需要备份
iptables-restore < iptables-rule.txt