Docker学习笔记
- 镜像
- 镜像名词
- 镜像命令
- 获取新镜像(仓库管理)
- 创建镜像
- 查看镜像
- 删除镜像
- 容器
- 容器名词
- 容器命令
- 启动和重启
- 进入容器
- 容器的停止及删除
- 容器的导出及导入
- 提交
- 查看容器
- log
- 容器互联
- Docker Compose
镜像
镜像名词
名称 | 释义 | 备注 |
REPOSITORY | 镜像的仓库源 | |
TAG | 镜像的版本标签 | 同一仓库源可以有多个 TAG, eg:ubuntu:15.10 |
IMAGE ID | 镜像ID | |
CREATED | 镜像创建时间 | |
SIZE | 镜像大小 |
镜像命令
获取新镜像(仓库管理)
- 可以从 Docker Hub 网站 来搜索镜像
docker login //登录
docker search <镜像名> //搜索 某镜像名 来寻找适合我们的镜像
docker pull <仓库源>:<版本标签> //下载镜像
- 当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
docker push <镜像name>:<镜像tag>//将自己的镜像推送到 Docker Hub
- –disable-content-trust :忽略镜像的校验,默认开启
docker logout //退出
创建镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
docker run -t -i ubuntu:15.10 /bin/bash //更新镜像之前,我们需要使用镜像来创建一个容器。//第一步通过某需要复制的镜像创建一个容器
apt-get update// 在容器内执行该命令 更新
apt install <命令> //在容器中安装命令 (非必须),exit / ctrl+c 退出容器
docker commit -m=“has update” -a=“runoob” e218edb10161 runoob/ubuntu:v2 //通过命令 docker commit 来提交容器副本
2、使用 Dockerfile 指令来创建一个新的镜像
- Dockerfile 文件概述 重点摘抄:
命令 | 释义 | 备注 |
-FROM | 指定基础镜像 | 必须是第一条指令, 如果不以任何镜像为基础,可以写成FROM scratch |
-RUN | 运行指定的命令 | RUN是构建容器时就运行的命令以及提交运行结果, Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大 |
-CMD | 容器启动时要运行的命令(变参) | CMD是容器启动时执行的命令,在构建时并不运行,构建时仅仅指定了这个命令到底是个什么样子.CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 |
-EXPOSE | 指定容器运行时监听的端口 | 想要主机和容器之间的端口有映射关系,必须在容器启动的时候加上-P或者-p选项 |
-ENV | 设置环境变量 | |
-ARG | 设置变量命令 | 构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。 |
-ADD | 把文件复制到镜像中 | 如果是压缩文件,会自动解压,相当于scp命令,只是ADD不需要进行验证 |
-COPY | 复制命令 | 与ADD的区别 :COPY的只能是本地文件,并且不能解压,其他用法一致 |
-ENTRYPOINT | 启动时的默认命令(定参) | 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 |
-VOLUME | 实现挂载数据卷 | 作用:①避免重要的数据,因容器重启而丢失,这是非常致命的。②避免容器不断变大。 |
-USER | 设置启动容器的用户 | |
-WORKDIR | 设置工作目录 | 设置之后,容器启动就会进入设置的目录中 |
-ONBUILD | 用于延迟构建命令的执行 | ONBUILD指令只对当前镜像的子镜像生效 |
-STOPSIGNAL | 当容器退出时给系统发送什么样的指令 | |
-HEALTHCHECK | 检查容器健康状况 | |
-LABEL | 用来给镜像添加一些元数据 | key1=value1 key2=value2 形式 |
- 上下文路径: 是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包
- 上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
docker build -t <镜像名> //构件镜像
- -t :指定要创建的目标镜像名
docker tag <镜像ID> <用户名称>/<镜像源名>
查看镜像
docker images //列出本地主机上的镜像
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
docker image ls //展示所有镜像的关键信息
删除镜像
docker rmi -rf <镜像> //删除本地一个或多个镜像。 (docker rmi -f runoob/ubuntu:v4)
- -f :强制删除;
- –no-prune :不移除该镜像的过程镜像,默认移除;
容器
容器名词
名称 | 释义 | 备注 |
CONTAINER ID | 容器 ID | |
NAMES | 容器名称 | 自动分配 且和id一样保持唯一 |
IMAGE | 使用的镜像 | eg: |
COMMAND | 启动容器时运行的命令 | |
STATUS | 容器状态 | 状态有7种: |
PORTS | 容器的端口信息和使用的连接类型(tcp/udp) | eg : |
容器命令
启动和重启
docker run -it <镜像名> /bin/bash //可交互
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
- ctrl+C 或exit 退出命令模式
docker run -d -p <映射主机端口>:<docker开放的端口(默认5000) > --name <容器名> <应用启动文件> //后台启动一个应用
- 通过 -d 参数 实现 ( -d 参数默认不会进入容器)
- -P -p:将容器内部使用的网络端口随机映射到我们使用的主机上。
-P: 是容器内部端口随机映射到主机的端口(-P 8081) 。
-p: 是容器内部端口绑定到指定的主机端口(-p 8081:5000)
-p: 指定容器绑定的网络地址(-p 127.0.0.1:5001:5000)。
-p: 指定tcp/udp (-p 127.0.0.1:5000:5000/udp) - –name 标识来命名容器
docker start <容器ID> //启动一个已经停止的容器
docker restart <容器ID> // 重新启动容器
进入容器
docker attach <容器ID> //进入容器 退出后停止容器,不建议用
docker exec <容器ID> //进入容器 且 退出后不会停止容器
容器的停止及删除
docker stop <容器ID> //停止
docker rm -f <容器ID> //删除镜像
- 删除容器时,容器必须是停止状态,否则会报如下错误
runoob@runoob:~$ docker rm wizardly_chandrasekhar
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
容器的导出及导入
docker export 容器ID> 文件名.tar // 导出并快照到tar文件
cat 文件名.tar | docker import 镜像名 //导入tar文件到某镜像
docker import 某url或目录 镜像名//导入指定 URL 或者某个目录到某镜像(eg : docker import http://example.com/exampleimage.tgz example/imagerepo)
提交
docker commit -m=“提交的描述信息” -a=“指定镜像作者” <容器 ID> <创建的镜像名> // 提交容器副本 保存成新镜像
- -m: 提交的描述信息
- -a: 指定镜像作者
查看容器
docker ps -a //查看当前所有容器的信息和状态
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 port <容器ID或者 容器名称>//查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
runoob@runoob:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000
docker top <容器ID/容器名称>
runoob@runoob:~$ docker top wizardly_chandrasekhar
UID PID PPID ... TIME CMD
root 23245 23228 ... 00:00:00 python app.py
docker inspect <容器ID/容器名称>// 来查看 Docker 的底层信息
docker ps -l //查询最后一次创建的容器:
log
docker logs -f <容器ID/容器名称>
- -f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
容器互联
1、先创建一个新的Docker网络
docker network create -d bridge <网络名(eg: test-net)>
- -d:参数指定 Docker 网络类型,有 bridge、overlay。
2、运行多个容器并连接到新建的网络中
docker run -itd --name <容器名(test1)> --network <网络名(test-net)> <镜像名(ubuntu)> /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
3、多个容器之间需要互相连接,使用 Docker Compose
Docker Compose