Docker 是什么?
- 是实现容器技术的一种工具
- 是一个开源的应用容器引擎
- 使用 C/S 架构模式,通过远程API 来管理 (我们本机是 C,docker 引擎是 S,实际的构建过程是在 docker 引擎下完成的)
- 可以打包一个应用及依赖包到一个轻量级、可移植的容器中
Docker 有什么优势?
- 资源占用少:每个容器都共享主机的资源,容器需要多少就用多少
- 启动快:一条命令即可将容器启动,而容器启动时一般会将服务或应用一并启动
Docker 和 虚拟机 的区别?
什么是仓库、镜像、容器?
仓库
存放镜像
,主机通过仓库下载镜像,通过镜像创建容器
仓库
仓库
- 存放镜像文件的地方,比如 DockerHub,可以将自己的镜像上传上去
- 不同镜像可以有不同的标签
- 主机可以从仓库下载镜像
镜像
- 创建容器的模板
- 同一个镜像可以创建多个不同的容器
容器
- 通过镜像生成的运行实例
- 不同容器之间是相互隔离,独立运行的
- 通常一个容器就是一个应用或一个服务,也是我们常说的微服务
Docker 容器有几种在状态?
- starting 运行状态
- Exited 退出状态
- Paused 暂停状态
- healthy 健康状态
- unhealthy 非健康状态
Docker 常用命令
docker pull
拉取镜像
docker create
创建容器
docker rm
删除容器
docker ps
列出正在运行的容器列表
docker run
创建容器并运行指定命令
docker start
启动容器
docker stop
停止运行容器
docker restart
重启容器
docker rm
删除容器
docker exec
进入容器内部,容器执行指定命令
docker rmi
删除镜像
docker pull ubuntu //获取镜像
docker run -it ubuntu /bin/bash //启动容器
docker start <容器 ID> //启动一个已停止的容器
docker stop <容器 ID> //停止一个容器
docker rm -f <容器 ID> //删除容器
docker ps //查看正在运行的容器
runoob@runoob:~# docker ps
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
更多:Docker 命令大全
Dockerfile 指令
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
FROM
构建镜像基于哪个镜像
MAINTAINER
镜像维护者姓名或邮箱地址
RUN
构建镜像时运行的指令
CMD
容器启动的命令,如果有多个则以最后一个为准,也可以为 ENTRYPOINT 提供参数
VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器
USER
为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR
为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH
健康检查
ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
EXPOSE
声明容器的服务端口(仅仅是声明)
ENV
设置容器环境变量
ADD
拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY
拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT
运行容器时执行的 shell 命令
FROM cr.d.xm.net/container/xm_centos7:release
MAINTAINER ldz <ldz@xm.com>
RUN mkdir -p /home/work/bin/tmp
# 复制应用程序
COPY devsecops_backend /home/work/bin
# 复制配置文件
COPY config/local.toml /home/work/bin
COPY config/staging.toml /home/work/bin
COPY config/prod.toml /home/work/bin
COPY config/preview.toml /home/work/bin
# 暴露端口
EXPOSE 1416
# 打开工作目录
WORKDIR /home/work/bin
# 执行命令
ENTRYPOINT [""]
Docker 怎么用?
例如,制作一个 centos 镜像
1.编写 Dockerfile,文件命名为 mydockerfile-centos
FROM centos:7.9.2009
MAINTAINER ldz ldz@whu.edu.cn
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
2.通过命令构建镜像 (最后有个 . )
// docker build -f dockerfile文件名 -t 镜像名:[tag] .
[root@ldz] docker build -f mydockerfile-centos -t mycentos:0.1 .
// 成功显示如下
Successfully built f29d77d79136
Successfully tagged mycentos:0.1
3.查看本地进行的变更历史(这一步骤可选)
4.启动容器
docker run -it mycentos:0.1
K8S 是什么?
Kubernetes 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
没有 k8s 可以使用 docker 吗?
可以。实际上一些小型公司,在业务不太复杂的情况下都是直接使用 Docker。
尽管 k8s 有很多好处,但是众所周知它非常复杂,业务比较简单可以放弃使用 k8s。
没有 Docker 可以使用 k8s 吗?
k8s 只是一个容器编排器,没有容器拿什么编排?!
k8s 经常与 Docker 进行搭配使用,但是也可以使用其他容器,如RunC、Containerted 等。
Docker Swarm 和 k8s 怎么选?
选 k8s。
2019年底Docker Enterprise已经出售给Mirantis,Mirantis声明要逐步淘汰Docker Swarm,后续会将 k8s 作为默认编排工具。