Docker学习笔记

  • 镜像
  • 镜像名词
  • 镜像命令
  • 获取新镜像(仓库管理)
  • 创建镜像
  • 查看镜像
  • 删除镜像
  • 容器
  • 容器名词
  • 容器命令
  • 启动和重启
  • 进入容器
  • 容器的停止及删除
  • 容器的导出及导入
  • 提交
  • 查看容器
  • log
  • 容器互联
  • Docker Compose


镜像

镜像名词

名称

释义

备注

REPOSITORY

镜像的仓库源

TAG

镜像的版本标签

同一仓库源可以有多个 TAG, eg:ubuntu:15.10 ubuntu 仓库源 15.10 标签版本,所以 用 REPOSITORY: TAG 来定义不同的镜像

IMAGE ID

镜像ID

CREATED

镜像创建时间

SIZE

镜像大小

镜像命令

获取新镜像(仓库管理)

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 指令来创建一个新的镜像

命令

释义

备注

-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

实现挂载数据卷

作用:①避免重要的数据,因容器重启而丢失,这是非常致命的。②避免容器不断变大。docker run 时 -v 参数修改挂载点

-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:ubuntu15.10

COMMAND

启动容器时运行的命令

STATUS

容器状态

状态有7种:created(已创建) restarting(重启中) running 或 Up(运行中) removing(迁移中) paused(暂停) exited(停止) dead(死亡)

PORTS

容器的端口信息和使用的连接类型(tcp/udp)

eg : 0.0.0.0:32769->5000/tcp 即 tcp连接 ,Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

容器命令

启动和重启

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