TODO:这仅仅是一篇草稿 ,个人使用,内容有待完善不建议查看
TODO: 此文档还需完善请留言或联系作者
Docker
Docker介绍
第一课
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试
Docker 包括三个基本概念:
- 镜像(Image )
- 容器(Container )
- 仓库(Repository )
Windows Container和Linux Container(LXC)
Windows Container 和 Docker:你需要知道的5件事 - CSDN博客
Install Docker for Windows | Docker Documentation
在Ubuntu上安装LXC:
sudo apt-get install lxc
Docker Image
Docker 镜像
《第一本Docker书》第4.1节:什么是Docker镜像?
Docker Container
Docker Container (容器)是共享内核的,Docker Container是Docker Image的运行实例。Docker Container里面可以运行不同OS的Image(这里OS相当于就是壳)
Docker Container 的IP地址只能在当前的主机上才可以ping通。
Docker Container的生命周期
Docker Container中运行的命令都是前台的。不管你是否是以后台方式启动的该命令,只要命令运行完成,Docker Container就会消亡。很多时候Docker Container作为临时使用。
容器的典型生命周期:
创建 --> 管理 --> 停止 --> 最终删除
docker run 提供了容器的创建到启动的功能
Docker Registry
Docker Registry(仓库):分为公有和私有。
Docker Hub 属于公有的
Docker核心组件的关系
Docker Daemon 守护进程。对应的程序现在已经从
docker daemon
变为了dockerd
首先在主机(Host)上安装一个Docker Deamon,它负责启动Docker Container(可以是多个),它在启动容器的过程中会从Docker Hub中拉取image。
通过Docker Client操作Docker Deamon
Docker 部署和配置
安装社区版 Docker CE
对于使用 Docker 而言,使用最新版本非常重要。所以不要直接使用 yum 或 apt 安装 docker,我们需要先进行配置一下。
参考这里在Ubuntu 16.04上安装成功:Docker CE 镜像源站-博客-云栖社区-阿里云 ,安装成功。
fedora安装 Get Docker CE for Fedora - Docker Documentation 可直接参考官方文档,但是官网下载速度慢。
清华大学开源软件镜像站 - Tsinghua Open Source Mirror (这里选择:对于 amd64 架构的计算机,添加软件仓库)。
设置开机启动Docker Deamon进程:
|
|
CentOS 的 firewalld 会导致 Docker不能正常运行,需要将其关闭
systemctl disable firewalld
(未验证)。并且需要安装 iptables:因为Docker(1.8)会做一些端口映射
1 2 3
yum -y install iptables-services systemctl enable iptables systemctl start iptables
安装并启动docker之后,必须是root用户或者是docker组中的用户才能运行命令。
比如当尝试运行 docker info
会报错:
|
|
创建 docker 用户组:
|
|
将当前用户添加到docker用户组:
|
|
然后重启系统以生效:直接注销也可以
|
|
推荐的storage driver:
Docker 官方推荐使用 overlay2
storage driver,Docker EE和Docker CE都建议使用storage driver。
在 /etc/docker/daemon.json
文件中 配置Docker使用overlay2
storage driver,见 Use the OverlayFS storage driver
不推荐使用
overlay
storage driver。此外,Docker不建议任何需要您禁用操作系统安全功能的配置,例如,如果您在CentOS上使用overlay或overlay2驱动程序,则需要禁用selinux。
1 2 3 4 5 6
$ docker info Containers: 0 Images: 0 Storage Driver: overlay2 # 查看当前 Backing Filesystem: extfs # 没搞懂
Windows中安装Docker
安装 Docker for Windows:
只有windows 10 内置了Hyper V 虚拟环境,所以只有win10才能安装docker for windows。
下载安装包安装即可,首次运行会出现下面的提示:“Hyper-V and Containers features are not enabled. Do you want to enable them for Docker to be able to work properly? Your computer will restart automatically. Note: VirtualBox will no longer work.(VirtualBox将不能运行)” 开启Hyper-V将不能使用Vbox虚拟机,这个让人感到苦恼,这里有人提供了命令来开启和关闭Hyper-V功能 virtualbox - Simple instructions needed for enabling and disabling Hyper V Docker - Stack Overflow。
You can do below to disable
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V bcdedit /set hypervisorlaunchtype off
and below to enable
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All bcdedit /set hypervisorlaunchtype auto
From PowerShell
To Disable
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
To Enable
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
Windows中的相关问题可以参考一下Docker的文档: Logs and troubleshooting | Docker Documentation
看到这样一句话: 默认情况下Boot2Docker需要安装Virtualbox,而不支持Hype-V,这很麻烦,还得我们修改BCD引导文件,因为Hyper-V和Virtualbox不兼容。
**后期遇到的问题:**使用-v
挂载本机目录到容器中时没有任何效果,容器启动时也没有报错。主机中保存了数据库文件,开启mysql容器后却不能挂载这些,之前是可以的;后来查看某博文说自己更改了windows的密码,需要重新认证;才想起前段时间,自己将windows的本地账户转换为了在线账户,可能是这个问题。
解决步骤:
Docker Setting > Shared Drives > Reset credentials...
然后在弹出的对话框中输入你的在线账户的密码(也就是你电子邮箱的密码)。
坑了我好久。
win10 docker 使用run -v 时,虚拟机无法显示宿主机挂载的目录 - CSDN博客
配置加速器
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。
阿里云加速器 点击此链接登录阿里云,然后可能会弹出对话框让你设置docker镜像的独立密码(这里的密码与你的专属链接没有关系),设置完成点击"Docker Hub镜像站点" 会看到属于你的专属链接,并附有操作说明(注意:不要参考此处的操作说明,它既有可能是配置老版本的docker的方法,会造成之后的配置出错)。
Docker 加速器 - DCS 文档 (DaoCloud加速器)
Docker 问答录(95 问) · 大桥下的蜗牛 配置加速器还是这里说的清楚。
成功的配置方法:
|
|
再运行下面的命令试一下:
|
|
错误1:命令写错
|
|
错误2: 配置加速器时一定要按照相应版本来配置
查看版本:
|
|
开始我尝试了阿里提供的方法(修改daemon.json文件),没有用。然后我又尝试了另一种方法(修改docker.service文件),结果出现了下面的错误:
|
|
出现错误的原因是必须先删除之前创建的 daemon.json 文件。
还有个坑人的地方是,docker.service文件也需要根据版本来配置。原则就是:“Docker 1.12 之前的版本,dockerd
应该换为 docker daemon
,更早的版本则是 docker -d
"。(之前看到网上有些教程附带有 -d -H
参数什么的也跟着乱配)。
这里
https://jxus37ad.mirror.aliyuncs.com
如何与用户对应?我的本地电脑用户名称与阿里云帐号的用户名称。这里并不需要对应。
|
|
看第20行:docker会创建一个 docker0
的网桥,并分配了私有网段 172.17.0.1/16
,docker中的所有容器将会在此网段上分配一个可用的ip地址;该地址是私有地址只能在本机访问。
Docker配置文件与日志:
配置文件: /etc/sysconfig/docker
docker服务的配置文件: /usr/lib/systemd/system/docker.service
日志文件:/var/log/message
,查找: tail -f /var/log/message | grep docker
更改Docker的相关路径
docker for windows 安装时默认不能修改路径,所以全部安装在c盘。
Disk image location:
seting -> Advanced -> Disk image location
,然后更改目录即可,其包含的 vhdx 文件会自动迁移。
在我的系统默认是:
C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx
(这应该是与我将Docker安装成所以用户可用有关)
这里分为linux容器和windows容器: (这里是个人理解,似乎有误)
linux 容器下Docker 容器安装在 MobyLinuxVM.vhdx 内,只要更改VHD 路径即可会自动移动VHD
Windows 容器docker的安装路径默认在
C:\ProgramData\Docker
windows上安装的docker其实本质上还是借助与windows平台的hyper-v技术来创建一个linux虚拟机,你执行的所有命令其实都是在这个虚拟机里执行的,所以所有pull到本地的image都会在虚拟机的Virtual hard disks目录的文件中,这个文件就是虚拟硬盘文件。
Docker运行根目录: (似乎不需要更改)
Docker 后台进程参数:
更改docker运行根目录的参数:-g, --graph="/var/lib/docker"
:设置Docker运行时根目录
或者可以在deamon.json配置文件中修改:
|
|
在Windows中通过 setting -> Daemon -> 切换"Basic"按钮 ->
然后就可以配置该文件
在cmd中运行
docker info
命令,会看到 “Docker Root Dir: /var/lib/docker”
在Windows中
C:\Users\youname\.docker
目录下可以看到config.json
,deamon.json
两个文件
Docker for Windows 设置 Shared Drives目录
Shared Drives的作用,“Select the local drives you want to be available to your containers.",类似于为虚拟机添加共享文件夹(比如怎样才能让虚拟机中的系统访问主机中的文件)。
Dockers version 18.03.1-ce已经可以正确处理权限问题,设置shared drives目录时会跳出一个对话框让你输入管理员密码就行。
Docker基础命令
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从 镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
docker help
查看一下简单帮助信息和可用命令
docker info
查看docker的系统信息
docker search
搜索镜像
docker search java
: 查找一个Java镜像。
docker pull
拉取镜像到本地
完整格式:
|
|
Dockers Registry(Docker镜像仓库地址)完整格式:
<域名/IP>[:端口号]
;默认值(省略时使用默认值):默认为 hub.docker.com仓库名,完整格式:
<用户名>/<软件名>
;默认值,如果省略用户名则默认为labrary
,它表示官方版本标签: 如果省略则表示下载最新版,即
latest
版
|
|
|
|
官方版本的理解:官方版本指的是该容器由Docker公司提供。也就是说那么对于 ubuntu 这个镜像它并不是由 ubuntu 公司提供,而是由 Docker公司提供。
docker image
列出本地已经下载的镜像:
docker image ls [关键字]
删除本地镜像:
docker image rm [选项] <镜像1id> [<镜像2id ...]
建议通过镜像的 id 或摘要来删除一个镜像,因为它们是一个镜像的唯一标识
docker run *
docker run -it -rm java ps
该命令解释:(相关步骤)
- Docker会检查本地是否存在java镜像,如果没有就会去默认仓库中查看是否有此镜像,如果找到就下载该镜像到本地。
- 随后,Docker在文件系统内部用该镜像创建一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主主机进行通信的桥接网络接口。
- 最后我们告诉Docker在新容器中要运行的命令 ,这里是
ps
。 - 当 ps 命令运行结束,容器也就停止了运行
|
|
注意:docker run 。。。
里面的命令结束了,container的运行就结束了。
对于临时性的容器我们可以使用 docker run --rm
运行完成就删除
因为Docker的容器实在太轻量级了,很多使用用户都是随时删除和新建容器
-it
:其中-i
表示交互式操作(让容器的标准输入保持打开),-t
表示终端;(交互式终端)--rm
:表示容器退出后就将其删除,默认情况下,为了排障需求,退出的容 器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果, 不需要排障和保留结果,因此使用--rm
可以避免浪费空间。参数的位置:这里对于第一条执行 ps 的命令中参数
-it
(--rm
也一样) 位置不能随便放,如果放在 ps 的后面,它会认为该参数是传递给 ps 命令的。当使用docker ps -a
查看时可以看到在 COMMAND 列中(表示容器最后运行的命令)对应的是ps -it
当容器中指定的应用终结时,容器也自动终止。
后台运行容器
在原有运行命令的基础上使用 -d
参数 (detached 分离)即可
|
|
-d
参数启动后会返回一个唯一的 id
有三种方式可以指定唯一容器:
- 短 UUID
- 长 UUID
- 容器名称,(在创建容器时如果没有指定名称则将会获得一个自动生成的名称,可以使用
--name
来为容器命名)
停止后台运行的容器
docker stop <容器>
指定端口
·-p
选项
指定特定端口, 随机端口,所有端口
挂载数据卷
-v
选项
挂载目录,格式:-v [host-dir]:[container-dir]:[rw|ro]
可以挂载文件,但是不可以改变文件inode (改变后容器内外就不再是同一文件了) ;也就是说能够更改此文件的内容,但是不能从别处复制一个同名文件过来进行覆盖。
默认挂载的路径权限为读写 rw 。如果指定为只读可以用:ro
自启动容器
在使用docker run
启动容器时,使用--restart
参数来设置:
–restart的参数值 | 描述 |
---|---|
no |
容器退出后,不自动重启容器(默认值) |
on-failure |
如果容器由于错误(非0)而退出,则将其重新启动;非0退出代码表示错误 |
unless-stopped |
重启容器;(排除两种情况)除非明确停止容器或者Docker被停止或重新启动 |
always |
只要容器停止了,就重新启动 |
还可以在使用on-failure
策略时,可以指定Docker将尝试重新启动容器的最大次数。默认情况下,Docker将尝试永远重新启动容器。
sudo docker run --restart=on-failure:10 redis
重启策略注意点:
- 重启策略只在容器启动成功后才生效。这种情况下,成功启动的意思是容器运行 10 秒以上,并且 Docker 已经开始监控它。这可以防止根本不启动的容器进入重启循环。
- 如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启或容器手动重启。这是防止重启循环的另一个尝试。
- 重启策略只作用于容器。swarm 服务的重启策略配置方式不同。
如果在最初运行容器时没有使用--restart
选项,那么可以通过update
命令进行更新:
docker update --restart=always <container>
取消自动重启:
docker update --restart=no <container>
Docker容器互连 network
**方法一:(过时)**使用--link
,创建两个容器的别名,它需要两个参数:
- 一个时要连接的容器名字
- 另一个是连接后容器的别名
示例1:
|
|
通过--link
参数连接到容器db,并为其设置别名webdb。然后在httpd容器中就可以直接使用db或webdb作为连接地址来和mysql通信了 。 不要再使用 localhost 了。
示例2:
docker run --name some-redis -d redis
其它 app 使用 redis
|
|
redis-cli 连接 redis
|
|
方法二: 建议 , 通过 –network
将容器加入自定义的Docker网络来连接多个容器,而不是使用 --link
方法三:如果你有多个容器之间需要互相连接,推荐使用 Docker Compose
请参考: Network settings| Docker Documentation
docker exec
可以通过docker exec命令在容器内部额外启动新进程。
作用: 当需要操作进入后台的容器时 ,可以使用此命令
可以在容器内运行的进程有两种类型:
- 后台任务
- 交互式任务
示例:
|
|
这里的 -t
和-i
标志为我们执行的进程创建了 TTY 并捕捉 STDIN。
**注意:**如果从这个stdin中 exit,容器不会停止运行(因为docker exec是新开了一个进程)。
这也是docker exec
和 docker attach
的区别。
所以推荐使用 docker exec
。
docker attach *
使用该命令重新附着到某容器的会话上。
作用:当需要操作进入后台的容器时 ,可以使用此命令
使用场景示例:
|
|
**注意:**如果从这个stdin中 exit,会导致容器的停止。
docker ps
docker ps
: 查看正在运行的容器
docker pa -a
:查看运行过的所有的容器
格式化 ps 输出:
|
|
docker logs *
示例:
docker logs -f -t --since="2017-05-31" --tail=10 the_container
--since
: 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。-f
: 查看实时日志-t
: 查看日志产生的日期--tail=10
: 查看最后的10条日志。the_container
: 容器名称
跟踪某个容器的最新日志而不必读取整个日志文件:
|
|
使用 -t
为每条日志加上时间戳:
|
|
使用 Ctrl + C
退出日志跟踪
推荐: Docker容器的调试技巧:docker logs 与 docker service logs - CSDN博客
如果安装了 portainer ,也可直接在 portainer中查看
补充知识:
容器中不建议更改配置文件,所以最常用的就是通过环境变量与其进行的信息传输。
但是对于用户密码等并合适通过明文的环境变量进行传递,它又提供了某种机制来保证安全。
docker top
查看容器内部运行的进程
|
|
docker container 相关*
docker run
见上文。
|
|
docker 容器退出方式
可以通过 docker container start
命令来重新启动处于终止状态的容器:这里docker容器重启的时候,会沿用 docker run
命令时指定的参数来运行。
比如,我们这样启动了 ubuntu 容器:
docker run -it ubuntu bash
退出该容器后,使用docker container start
启动时依旧会运行一个交互式的会话 shell 。这里容器主要就是运行容器中的 shell,所以如果退出该shell,容器也会随之停止运行。
上面容器的几种退出方式:
- 先按
ctrl + p
,再按ctrl + q
(我好像明白了,该快捷键应该对应Linux中使进程转换到后台的快捷键。实际操作时结果终端被锁了) - 使用
exit
或者ctrl + d
方法一: 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
方法二: 如果使用 exit 退出 ,那么在退出之后会关闭容器,可以使用下面的流程进行恢复使用docker container start
docker inspect
该命令会对容器进行详细的检查,然后返回其配置信息。
除了查看容器,还可以通过
/var/lib/docker
目录来深入了解Docker的工作原理.
docker stats
监控容器使用的资源
docker stats
docker stats <container_id>
docker update
为 容器更新 (部分)配置
- cpu 相关配置
- mems 内存相关配置
--restart
docker cp *
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
容器 -> 主机
主机 -> 容器
用于容器与主机之间的数据拷贝 。选项:
- -L , –follow-link : 保持源目标中的链接
示例:容器 mysql中/usr/local/bin/
中存在docker-entrypoint.sh文件,可如下方式copy到宿主机
docker cp mysql:/usr/local/bin/docker-entrypoint.sh /root
修改完毕后,将该文件重新copy回容器
docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/
docker volume *
创建数据卷:
|
|
查看所有数据卷:
|
|
查看指定数据卷信息
|
|
删除某个数据卷:
|
|
清除所有无主的数据卷:
|
|
删除容器时同时删除它使用的数据卷
|
|
docker history
显示镜像制作的过程,相当于Dockfile。
docker login
使用该命令登录到Docker Hub。
你先要在注册有 docker 网站的帐号,注册时如果看不到图片验证码则必须翻墙。
docker network
相关命令
命令名称 | 说明 |
---|---|
docker network connect | 将容器连接到网络 |
docker network create | 创建一个网络 |
docker network disconnect | 断开容器的网络(容器必须处于运行状态) |
docker network inspect | 显示一个或多个网络的详细信息 |
docker network ls | 列出网络 |
docker network prune | 删除所有未使用的网络 |
docker network rm | 删除一个或多个网络 |
docker network connect
命令用于将容器连接到网络。可以按名称或ID连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。
用法
|
|
示例:
将正在运行的容器连接到网络
|
|
启动时将容器连接到网络
还可以使用docker run --network=
选项启动容器并立即将其连接到网络。
|
|
Docker Ubuntu
在容器中
安装程序时出现下面的问题:
|
|
解决办法:
需要先运行 apt-get update
,再安装程序。这个命令的作用是:同步 /etc/apt/sources.list
和 /etc/apt/sources.list.d
中列出的源的索引,这样才能获取到最新的软件包。
Docker管理和监控工具
Portainer
轻量开源。
Portainer的安装方式主要有两种,一个是使用Docker安装,一个是二进制文件直接跑,我建议用Docker安装,比较方便点,也不用你自己去配置自启动啥的。
注意:最新版本的安装方式请参考官方文档:Installation | Portainer.io
参考 Deployment — Portainer 1.18.1 documentation 的示例:
Example on Windows:
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v C:\ProgramData\Portainer:C:\data portainer/portainer
因为我的docker for windwos使用的linux容器,那么我的命令为:
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v G:\Docker\portainer\data:/data portainer/portainer
这里先要为主机创建: G:\Docker\portainer\data
目录。
-v /var/run/docker.sock:/var/run/docker.sock
:把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中; (上面是照搬Linux中使用的命令,那么在Windows中该如何?)
注意:上面的命令还没有明确为该容器指定一个name, 默认的name是 silly_heyrovsky。
运行该容器后,在浏览器中输入: http://127.0.0.1:9000
进入管理界面,必须添加用户: 这里为管理员用户: admin 设置的密码为: ···12345
在Windows中发现路径使用下面三种形式都可以:
docker run -v G:\\Docker\\portainer\\data:/data
docker run -v G:\Docker\portainer\data:/data
docker run -v G:/Docker/portainer/data:/data
该命令还没试,我使用的是下面的命令,但是后续出现问题,稍等。
最开始我以为在Windows中不可以使用带
-v /var/run/docker.sock:/var/run/docker.sock
的run命令,然后再后面的操作中收到下面的错误提示:大概就是提示必须使用: -v /var/run/docker.sock:/var/run/docker.sock 来运行容器
最后发现: Deployment — Portainer 1.18.1 documentation 好像似乎明白了,使用该选项是没有任何问题的。
Rancher
重量级但部署较简单
Docker管理面板系列——Rancher(能够对接各家公有云) | Senraの小窝
Prometheus
Prometheus是一个开源系统监视和警报工具包。
使用Prometheus收集Docker指标| Docker文档
docker-slim 镜像瘦身工具
一个 Docker 镜像文件的瘦身工具,据称最好情况下,可以让镜像文件体积缩小为原来的30分之一。
学习资料
如何选择Docker书籍 - Docker 问答录(95 问) · 大桥下的蜗牛
**观察一下当前的 Docker 版本号,选择不要晚于 3 个版本的 Docker 书籍。**否则看到的很多东西可能将会因过时而无法使用,或者已经不必如此繁琐有更简单的方式去实现了。
Docker的版本号规则发生了改变。以前是v1.12什么的,现在直接变成 v17.06,这里17表示2017年。
Docker中国 (Docker官网的中文镜像) Docker 文档 - Docker 中文文档
⭐ Docker官方推出了这个网站来帮助学习Docker,可以在线练习docker命令 :Play With Docker (PWD)
Docker (软件)
Docker 教程
Docker —— 从入门到实践 看这里吧,这本书一直都有更新。
Docker 极客学院
Docker入门教程(一)介绍
百度云上有一套 《实战 Docker到Kuberneter技术系列视频教程》
宋宝华:Docker 最初的2小时(Docker从入门到入门) 后面如果有时间,作者会再完成一个《Docker 相处的8小时》。
宋宝华- KVM最初的2小时(KVM从入门到入不了门)
其它:
看过《Docker —— 从入门到实践 》
《第一本Docker书》相比之下这本书有不错的补充