2.基础入门
这里将记录docker的基础命令,和一些常用的操作,包括查看镜像,容易,构建自己的镜像等操作
将当前用户加入到docker组
每次执行docker命令是都需要在前边加上 sudo命令,为了避免同样繁琐的步骤重复进行,可以将当前用户加入到docker组,方法如下:
➜ rootfs sudo groupadd docker
➜ rootfs sudo gpasswd -a ${USER} docker
➜ rootfs sudo systemctl restart docker
➜ rootfs newgrp docker
docker的核心概念
镜像
就如同我们下载的操作系统镜像一样,提供运行时必须的文件,组件库等,是容器启动的基础。
镜像是如何创建的:可以通过Dockerfile构建自己的镜像和从DockerHub下载别人制作好的常用镜像
容器
docker的镜像可以理解为一份静态文件合集,需要运行起来才能发挥作用,因此将镜像运行起来的运行实体被称为容器,容器在运行时,可以读写和更改里边的文件内容,简单来说,就是容器里面运行着应用。 容器包含 创建、运行、停止、暂停和删除五中状态。
仓库
Docker仓库类似github,等这样的代码仓库,用来存放别人或者组件官方制作的镜像,当然docker是支持自己搭建私有镜像仓库的(后面有学到在补充)
镜像-容器-和仓库的关系
容器是通过镜像创建的一个运行时,因此,一个镜像可以创建多个容器,并同时运行。
仓库是用来存放镜像的,当用于需要获取一个镜像时,会从仓库拉取
Docker的架构
Docker整体架构是采用C/S(客户端/服务器)模式,主要由客户端和服务端两大部分组成。
Docker 客户端
docker客户端有官方实现的docker客户端,也有官方提供的REST API方式的代码SDK,包含了Go,Java,Python,PHP等主流语言。
Docker服务端
是Docker后台服务的统称,其中dockerd是一个非常重要的后台管理进行,它负责相应和处理来自Docker客户端的请求,然后将客户端的请求转化为Docker的具体操作。
Docker 的重要组件
Docker两个至关重要的组件
runC 是官方按照OCI容器运行时标准的一个实现,通俗的说,runC是一个用来运行容器的轻量级工具,是用来运行容器的
containerd是Docker服务端的一个核心组件,它是从dockerd中剥离出来的,为了遵循OCI标准,containerd通过 containerd-shim启动并管理runC,可以说containerd是管理了容器的生命周期。
Docker的镜像操作
这里那个docker常用的镜像操作整理成了一个表格,内容如下
功能 | 指令 |
---|---|
拉取镜像 | docker pull |
重命名镜像 | docker tag |
查看镜像 | docker image ls 或者 docker images |
删除镜像 | docker rmi删除无用的镜像; |
构建镜像 | 基于Dockerfile的 docker <br />基于运行时的容器提交(在当前运行时的容器,构建) |
1.拉取镜像
命令各式
docker pull [Registry]/[Repository]/[image]:[tag]
Registry Docker的服务器,默认为docker.io,如果有私服,可以这里使用私服的url
Repository 镜像仓库 library为docker默认的镜像仓库
image 镜像名称
tag 镜像版本号(标签)
拉取一个busybox的镜像为例
➜ ~ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
9758c28807f2: Pull complete
Digest: sha256:a9286defaba7b3a519d585ba0e37d0b2cbee74ebfe590960b0b1d6a5e97d1e1d
Status: Downloaded newer image for busybox:latest
这里拉取到了latest版本的,也就是最新的busybox
当镜像拉取成功之后, 如何查看拉取成功的镜像呢?
2.查看镜像
➜ ~ docker images
可以刚才拉取的busybox
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ss v1.0 280330c0ff8d 3 days ago 298MB
ouruser/sinatra v98 b8f1814f3146 3 days ago 452MB
busybox latest f0b02e9d092d 2 weeks ago 1.23MB
ubuntu 14.04 df043b4f0cf1 6 weeks ago 197MB
redis 5.0.9 f60d84d4d72c 2 months ago 98.3MB
mysql 5.7 9cfcce23593a 4 months ago 448MB
hello-world latest bf756fb1ae65 10 months ago 13.3kB
training/sinatra latest 49d952a36c58 6 years ago 447MB
也可以使用docker image ls
结果是类似的
当然,当镜像过多时,也可以使用grep
来进行过滤,比如我只看busybox这个镜像有多少个
➜ ~ docker images | grep busybox
busybox latest f0b02e9d092d 2 weeks ago 1.23MB
这里就只能看到busybox的镜像啦
我们需要给镜像起一个独特的名字
重命名镜像
➜ ~ docker tag busybox:latest mybusybox:v7
➜ ~ docker images | grep busybox
busybox latest f0b02e9d092d 2 weeks ago 1.23MB
mybusybox v7 f0b02e9d092d 2 weeks ago 1.23MB
查看,这里多了一个重命名的mybusybox,其实可以看到 镜像的ID是一样的,实际上,这里并没有创建新的镜像,知识做了别名映射(因为它知识重命名)
当镜像过多,要删除一些不必要的镜像时,应该怎么做呢?
删除镜像
➜ ~ docker rmi mybusybox:v7
Untagged: mybusybox:v7
➜ ~ docker images | grep busybox
busybox latest f0b02e9d092d 2 weeks ago 1.23MB
调用images命令,在查询一次,可以看到现在机器上的busybox镜像就只有一个了,说明mybusybox已经被删除了。
构建镜像
构建镜像可以分为使用commit从运行中的容器中创建提交,以及使用build 基于Dockerfile构建镜像。
1.使用commit从运行中创建提交
step1 先运行一个容器
➜ ~ docker run --rm --name=busybox -it busybox sh
step2 在容器中做少许修改
/ # touch hello.txt && echo "i wantto mls" > hello.txt / # cat hello.txt i wantto mls
让这个容器保持运行,因为在创建容器时 添加了--rm参数(运行结束后删除容器)因此,这里重新开一个命令窗口,基于这个容器来创建镜像
step3 基于运行时容器创建镜像
➜ ~ docker commit busybox busybox:mls sha256:583538bc286c68d1ec71fe845cd21ffa5553e07b91f1883cffd1eeb367b2aa50
容器提交成功查看一下
➜ ~ docker image ls busybox REPOSITORY TAG IMAGE ID CREATED SIZE busybox mls 583538bc286c 30 seconds ago 1.23MB busybox latest f0b02e9d092d 2 weeks ago 1.23MB
2.使用Dockerfile
先看一个简单的例子
FROM busybox
COPY test /tmp/test
RUN mkdir /tmp/testdir
FROM:表示基于busybox这个镜像来创建
COPY:复制外部文件到镜像内部,这里复制test这个文件到镜像的/tmp/test
RUN:执行一个命令,这里指镜像在创建容器之后执行mkdir命令,创建后边的路径
开始构建
➜ mybusybox docker build -t mybusybox .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM busybox
---> f0b02e9d092d
Step 2/3 : COPY test /tmp/test
---> e52723c73437
Step 3/3 : RUN mkdir /tmp/testdir
---> Running in d88020552fc4
Removing intermediate container d88020552fc4
---> e117c48925a4
Successfully built e117c48925a4
Successfully tagged mybusybox:latest
这里要特别注意,build后面一定要跟路径,我这里是当前目录,所以用“.”表示
Dockerfile中常用的指令(ps:表格内容转载自拉钩
)
Dockerfile指令 | 指令简介 |
---|---|
FROM | Dockerfile 除了注释第一行必须是 FROM ,FROM 后面跟镜像名称,代表我们要基于哪个基础镜像构建我们的容器。 |
RUN | RUN 后面跟一个具体的命令,类似于 Linux 命令行执行命令。 |
ADD | 拷贝本机文件或者远程文件到镜像内 |
COPY | 拷贝本机文件到镜像内 |
USER | 指定容器启动的用户 |
ENTRYPOINT | 容器的启动命令 |
CMD | CMD 为 ENTRYPOINT 指令提供默认参数,也可以单独使用 CMD 指定容器启动参数 |
ENV | 指定容器运行时的环境变量,格式为 key=value |
ARG | 定义外部变量,构建镜像时可以使用 build-arg = 的格式传递参数用于构建 |
EXPOSE | 指定容器监听的端口,格式为 [port]/tcp 或者 [port]/udp |
WORKDIR | 为 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令设置工作目录。 |
总结:通过对docker常用命令的学习,基本上对docker的操作已经有了一些简单的认知,
镜像的常用操作
images | image ls 查看镜像
pull 拉取镜像
rmi 删除一个不用的镜像
以及采用两种方式构建镜像(从运行中的容器提交和从Dockerfile提交)
祝大家变得更强~!