为什么要使用Docker
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的 利用率很高,一台主机上可以同时运行数千个 Docker 容器。 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚 拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。 具体说来,Docker 在如下几个方面具有较大的优势。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代 码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解 应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部 署的时间。
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。 更更轻轻松松的的迁迁移移和和扩扩展展 Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这 种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。 更更简简单单的的管管理理 使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更 新,从而实现自动化并且高效的管理。
总结起来就是能实现类似虚拟机的功能,能通过仓库(类似git)一次构建在任何地方使用,并且高效
docker安装
docker的官方安装文档https://docs.docker.com/instal
ubuntu18安装
- 更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update
- 安装需要的包
sudo apt install apt-transport-https ca-certificates software-properties-common curl
- 添加 GPG 密钥,并添加 Docker-ce 软件源,这里还是以中国科技大学的 Docker-ce 源为例
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
- 添加成功后更新软件包缓存
sudo apt update
- 安装 Docker-ce
sudo apt install docker-ce
- 设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略)
sudo systemctl enable docker
sudo systemctl start docker
- 测试运行
sudo docker run hello-world
- 添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选)
sudo groupadd docker
sudo usermod -aG docker $USER
- 测试添加用户组(可选)
sudo docker run hello-world
- 添加国内镜像
sudo vim /etc/docker/daemon.json
// 添加如下内容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
Docker基本概念
Docker 包括三个基本概念
- 镜像(Images)
- 容器(Container)
- 仓库(Repository)
Docker镜像
镜像就是一个只读的模板。 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已 经做好的镜像来直接使用。
镜像就是根据需求制作,包含了所需要的运行环境。下载可以直接运行。简单点理解就是安装好运行环境的虚拟机
查看镜像
docker images
删除镜像
docker rmi id/name
或
docker rmi -f id/name
查找镜像
docker search name[:tag]
获取镜像
docker pull name[:tag]
Docker容器
Docker利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
运行之后的镜像就会变成容器。简单理解就是要对这个镜像进行操作
运行容器
sudo docker run -i -t --name ubt -d -p 3000:80 nginx /bin/bash
- docker run 运行容器
- -i 交互模式
- -t 分配一个tty
- -d 后台运行
- --name 指定一个容器名称,可以用来对容器进行操作
- nginx 镜像的名称[和版本号]
- /bin/bash 运行bash shell
- -p 3000:80 将容器内的80端口映射到宿主机上,宿主机端口为3000
退出容器
退出当前bash ctrl-p + ctrl-q 退出之后后台仍旧会运行
完全退出 exit
进入正在运行容器
使用 docker attach 命令或 docker exec 命令,推荐使用docker exec
docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。
只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
docker exec -i -t id/name bash
停止容器
docker stop id/name
启动停止的容器
docker start id/name
查看运行中的容器
docker ps
查看所有容器
docker ps -a
删除容器
docker rm id/name
将容器保存为镜像
docker commit id imageName:imageTag
保存完后,可以通过docker images查看到该镜像
Docker仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。 实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
简单的就理解为git仓库一样,随时可以上面git clone代码
仓库登录
docker login -u 用户名 -p 密码
推送到远程
在将镜像push到自己新建的账户之前,要用docker tag重命名一下,将镜像命名你的用户名/镜像名这种形式,不然会push认证不通过
docker tag a/name 这里必须是仓库名字/name
然后
docker push 这里必须是仓库名字/name
Dockerfile
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
- 开始必须指明所基于的镜像名称
- 接下来推荐说明维护者信息。
- 后面则是镜像操作指令,例如 RUN 指令, RUN 指令将对镜像执行跟随的命令。每运行一条 RUN 指令,镜 像添加新的一层,并提交。
- 最后是 CMD 指令,来指定运行容器时的操作命令。
FROM
格式为 FROM <image> 或 FROM <image>:<tag> 。 第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指 令(每个镜像一次)。
MAINTAINER
格式为 MAINTAINER ,指定维护者信息
RUN
格式为 RUN 或 RUN ["executable", "param1", "param2"] 。 前者将在 shell 终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种 方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"] 。 每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。
CMD
支持三种格式
- CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
- CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
- CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数; 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会 被执行。 **如果用户启动容器时候指定了运行的命令,则会覆盖掉
EXPOSE
格式为 EXPOSE [...] 。 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配 一个端口转发到指定的端口。
ENV
格式为 ENV <key> <value> 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ADD
格式为 ADD <src> <dest> 。
该命令将复制指定的<src>到容器中的 <dest> 。 其中 <src>可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
COPY
格式为 COPY <src> <dest> 。
复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径)到容器中的 <dest> 。 当使用本地目录为源目录时,推荐使用 COPY 。
ENTRYPOINT
两种格式
- ENTRYPOINT ["executable", "param1", "param2"]
- ENTRYPOINT command param1 param2 (shell中执行) 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
VOLUME
格式为 VOLUME ["/data"] 。 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER
格式为 USER daemon 。
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN g roupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。
WORKDIR
格式为 WORKDIR /path/to/workdir 。
为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
ONBUILD
格式为ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
参考文章:
docker
yeasy.gitbooks.io/docker_prac…
docker-compose