docker 学习笔记
一、Windows 安装
下载链接:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
可能遇到的问题 :
点击Docker QuickstartTerminal报错如下信息:
VBoxManage.exe startvm default –type headless failed: VBoxManage.exe: error: The virtual machine ‘default’ has terminated unexpectedly during startup with exit code 1 (0x1).
原因:VirtualBox安装过程出现问题或者版本不适配
解决方案:卸载VirtualBox,取较新版本重新安装
二、上手docker
1、hello world
命令释义:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果
(如果本地没有该镜像, docker会自动从docker镜像仓库下载)
2、交互式创建容器
可在交互式bash中查看容器的版本信息:
exit退出交互式命令行
3、创建一个以进程方式运行的容器
通过 docker attach 或者 docker exec 进入容器(具体用法可以通过 –help 查看)
推荐使用 docker exec,因为它退出不会停止容器。
4、停止容器
5、导入导出
导出:docker export 容器ID > ubuntu.tar
导入:cat docker/ubuntu.tar | docker import - test/ubuntu:v1
三、镜像管理与创建
docker images 列出本地主机上的镜像
docker pull + 镜像名称 拉取镜像
docker search + 名称 查找镜像
docker rmi + 镜像名称 删除镜像
1、更新镜像:
从已经创建的容器中更新镜像,并且提交这个镜像
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- **e218edb10161:**容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2
2、创建镜像:
使用 Dockerfile 指令来创建一个新的镜像
使用命令 docker build , 从零开始来创建一个新的镜像。创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
3、dockerfile 详解:
含义:Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
构建时,在 Dockerfile 文件的存放目录下,执行构建动作,如命令:
docker build -t nginx:v3 .
.
是上下文路径,上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
dockerfile 命令:
-
FROM- 镜像从那里来
-
MAINTAINER- 镜像维护者信息
-
RUN- 构建镜像执行的命令,每一次RUN都会构建一层
-
CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
-
VOLUME- 定义数据卷,如果没有定义则使用默认
-
USER- 指定后续执行的用户组和用户
-
WORKDIR- 切换当前执行的工作目录
-
HEALTHCHECH- 健康检测指令
-
ARG- 变量属性值,但不在容器内部起作用
-
EXPOSE- 暴露端口
-
ENV- 变量属性值,容器内部也会起作用
-
ADD- 添加文件,如果是压缩文件也解压
-
COPY- 添加文件,以复制的形式
-
ENTRYPOINT- 容器进入时执行的命令
4、Compose:
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
下载地址:https://github.com/docker/compose/releases
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
yml 配置指令参考
version 指定本 yml 依从的 compose 哪个版本制定的。
build 指定为构建镜像上下文路径
cap_add,cap_drop 添加或删除容器拥有的宿主机的内核功能。
cgroup_parent 为容器指定父 cgroup 组,意味着将继承该组的资源限制
command 覆盖容器启动的默认命令
container_name 指定自定义容器名称,而不是生成的默认名称。
depends_on 设置依赖关系
deploy 指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
devices 指定设备映射列表。
dns 自定义 DNS 服务器,可以是单个值或列表的多个值
dns_search 自定义 DNS 搜索域。可以是单个值或列表。
entrypoint 覆盖容器默认的 entrypoint。
env_file 从文件添加环境变量。可以是单个值或列表的多个值。
environment 添加环境变量
expose 暴露端口,但不映射到宿主机,只被连接的服务访问。
extra_hosts 添加主机名映射。类似 docker client –add-host。
healthcheck 用于检测 docker 服务是否健康运行。
image 指定容器运行的镜像
logging 服务的日志记录配置。
network_mode 设置网络模式。
restart 重启策略
secrets 存储敏感数据
security_opt 修改容器默认的 schema 标签。
stop_grace_period 指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
stop_signal 设置停止容器的替代信号。默认情况下使用 SIGTERM 。
sysctls 设置容器中的内核参数,可以使用数组或字典格式。
tmpfs 在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
ulimits 覆盖容器默认的 ulimit。
volumes 将主机的数据卷或着文件挂载到容器里。
5、镜像tag:
使用 docker tag 命令,为镜像添加一个新的标签
四、容器连接:
1、通过端口实现docker与容器的连接:
启动容器时通过 -p 或者 -P 绑定端口号
2、通过docker实现容器之间的连接:
创建 docker 网络: docker network create -d bridge test-net
启动容器时指定网络:docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
两个容器可以互相 ping 通 name
五、仓库管理
在 https://hub.docker.com 创建自己 docker 账号
docker login 登录
docker push 将镜像推送到自己远端的 docker hub
六、常用参数
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
- -d: 以后台的形式创建一个容器
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
七、常用命令
docker 查看所有命令选项
docker logs + 容器ID 查看容器内标准输出
docker ps 查看有哪些容器在运行
docker ps -a 查看所有容器
docker run + 后续参数 启动容器
docker stop + 容器ID 停止容器
docker start + 容器ID 启动某个已经停止的容器
docker rm + 容器ID 删除容器
docker export 导出镜像
docker import 导入镜像
docker rmi + 镜像名称 删除镜像
八、Docker Machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
九、Swarm 集群管理
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
https://www.runoob.com/docker/docker-swarm.html
https://www.cnblogs.com/zhujingzhi/p/9792432.html
十、参考资料
https://www.bilibili.com/video/BV1og4y1q7M4?p=6
一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。