docker 常见基本操作,Dockerfile编写介绍和部分错误

启动,停止,重启docer 服务

  • 启动:systemctl start docker
  • 停止:systemctl stop docker
  • 重启:systemctl restart docker
  • 查看docker 启动日志 systemctl status docker

docker 镜像相关操作

  • 查看镜像:docker images
  • 删除镜像:docker rmi 镜像ID/镜像名称

第三方镜像的使用

搜索,下载,上传,修改仓库地址

  1. 在docker 仓库搜索第三方镜像 docker search 镜像名称,例如搜索ubuntu镜像 docker search ubuntu,docker search nginx
  2. 从公共仓库拉去镜像docker pull 镜像名称,例如拉取docker pull ubuntu,默认下注最新ubuntu镜像,如果需要加入版本号
    例如:docker pull nginx:latest
  3. 上传镜像到仓库 docker pull image
  4. 加入自己镜像地址在/etc/docker/key.json中修改
    { "registry-mirrors": ["https://iwpfe8zv.mirror.aliyuncs.com"] #加入自己的镜像地址 }

docker 容器常见操作

镜像

  1. 运行镜像 docker run ImageName/ID 2 运行镜像并且以bash进行交互docker run -t -i ubuntu /bin/bash

容器

  1. 启动容器:docker start containerID/containerName
  2. 停止容器:docker stop containerID/containerName 或者强杀 docker kill containerID/containerName
  3. 重启容器:docker restart containerID/containerName
  4. 查看正在运行容器:docker ps
  5. 查看所有容器:docker ps -a

容器高级

  1. 进入容器:docker login containerID
  2. 查看容器进程:docker top containerID
  3. 重命名容器 docker rename oldName NewNmae
  4. 查看正在运行容器的网络端口映射情况docker port ContainerID

参数说明

  • -d : 守护进程模式在后台运行
  • -p : 容器内部端口绑定到指定的主机端口
  • -P : 容器内部端口随机映射到主机的高端口
  • -f : 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出
  • -l : 查询最后一次创建的容器
  • -t : 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -i : 则让容器的标准输入保持打开
  • -m : 提交的描述信息
  • -a : 指定镜像作者
  • –rm: 停止容器后移除容器

查看日志

命令dokcer logs

root@VM-0-13-ubuntu:/home/ubuntu# docker logs --help

Usage:	docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --help           Print usage
      --since string   Show logs since timestamp
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps

dockerfile 编写和示例

dockerfile 简介

dockerfile 类似于一般的描述文件,dockerfile 支持#注释命令

#WORKDIR 

ADD main /
RUN chmod +x main

EXPOSE 3000

ENTRYPOINT ["./main"]

功能是基于alpine镜像,添加main可执行文件到镜像中,暴露3000端口,设置容器开始运行时第一个命令。

编写docker dockerfile

基本命令简介

FROM:

这个设置基本的镜像,为后续的命令使用,所以应该作为Dockerfile的第一条指令。
FROM <image>:<tag> 或者 FROM <image> 无论什么时候,尽可能使用BU提供的基础镜像,有利于技术规范化,简化你的Dockerfile。

MAINTAINER:

格式为 MAINTAINER ,指定维护者信息

RUN

在shell 终端运行命令,格式为 RUN 或者或 RUN [“executable”, “param1”, “param2”]

EXPOSE:

EXPOSE 指令指定容器监听的端口。因此,你应该使用通用、惯例的端口到你的应用。
例如,一个包含着Apacheweb服务端的镜像将使用80端口,当镜像包含是一个MangoDB应该使用EXPOSE 27017 等等。

CMD:

支持三种格式
CMD [“executable”,“param1”,“param2”] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,“param2”] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

ADD

格式为 ADD
该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

COPY

格式为 COPY 。

复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。

当使用本地目录为源目录时,推荐使用 COPY。

ENTRYPOINT

ENTRYPOINT 最佳使用场景是设置镜像的主入口命令,允许镜像好像命令运行一样(使用 CMD 作为默认的标志)。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

VOLUME

格式为 VOLUME ["/data"]。

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER

格式为 USER daemon。

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo。

WORKDIR

格式为 WORKDIR /path/to/workdir

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
ONBUILD

格式为 ONBUILD [INSTRUCTION]。

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

编译docker 镜像

docker build -f DockerFile .

这个编译没有指定标签名 加 -t tag 指定标签名

运行容器

根据容器ID 运行容器并且映射端口

docker run -p 3000:3000 5310e8cc7a3e
后台运行
docker run -d -p 3000:3000 5310e8cc7a3e

docker导出、导入

导出镜像:docker save 镜像 > my.tar
导入镜像:docker load < my.tar

export 带有当前容器的运行信息快照

docker export 3144ce77fc7c -o e.tar
docker import e.tar econtioner:latest

常见错误

Error response from daemon: conflict: unable to delete 129e213d49a8 (must be forced) - image is being used by stopped container 693d3554ca11

  1. docker stop 693d3554ca11
  2. docker rm 693d3554ca11
  3. docker rmi 129e213d49a8 要是这个image正在被容器使用,需要先删除容器,才能删除镜像或者强制删除使用命令docker rmi -f imageID

ufw docker ubuntu 16.04

/etc/default/docker文件后面追加DOCKER_OPTS="--iptables=false"