docker学习笔记

目录

docker网址php

docker介绍html

docker安装java

docker使用linux

  docker的使用命令nginx

    使用命令git

    rungithub

  详细参数配置web

  docker详细使用docker

    docker基本信息shell

    操做docker镜像

    启动容器

    查看容器

    操做容器

    保存和加载镜像

    登陆

    发布docker镜像

    构建镜像

    构建镜像_Dockerfile文件语法

    重新镜像启动容器

    守护容器

 docker资料

 

docker网址

docker hub:https://hub.docker.com/

经常使用官网docs:https://docs.docker.com/

docker介绍

docker概念

  • Docker 的经常使用文档:https://docs.docker.com/
  • Docker 镜像: 用户基于镜像来运行本身的容器,能够把镜像当作容器的『源代码』,镜像体积很小,易于分享、存储和更新
  • Registry: Docker 用 Registry 保存用户构建的镜像,Registry 分为公共和私有两种:
    • Docker 公司运营的公共 Registry 叫作 Docker Hub,咱们能够在上面注册帐号,分享并保存本身的镜像。
    • 能够在 Docker Hub 保存本身的私有镜像或者架设本身私有的 Registry
  • Docker 容器: 把应用程序或服务打包放进去,容器是基于镜像启动的,容器中能够运行一个或多个进程。
    • 镜像是 Docker 生命周期中的构建或打包阶段
    • 容器则是启动或执行阶段

docker的逻辑

容器与虚拟化

虚拟化使得许多操做系统可同时在单个系统上运行。

容器则可共享同一个操做系统内核,将应用进程与系统其余部分隔离开。

普通虚拟化技术和Docker的对比图

docker与lxc对比

传统的 Linux 容器使用 init 系统来管理多种进程。这意味着,全部应用程序都做为一个总体运行。与此相反,Docker 技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运做模式自有其优点。

 docker安装

如下是centos版本

官网安装指导:https://docs.docker.com/install/linux/docker-ce/centos/

# 如下亲测有效,20190308版。

sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io

systemctl start docker

[root@localhost ~]# docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:33:21 2019
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:02:24 2019
OS/Arch: linux/amd64
Experimental: false

 

增长开机启动

chkconfig docker on

实测有效。

 

添加镜像加速器

阿里镜像加速器网址:https://cr.console.aliyun.com/cn-hangzhou/mirrors
可加快连接docker官网镜像的速度


教程:
1. 安装/升级Docker客户端

推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce

2. 配置镜像加速器

针对Docker客户端版本大于 1.10.0 的用户

您能够经过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

实测有效。

 补充:

删除none的image

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

 

docker使用

docker的使用命令

docker 命令介绍

docker --help

管理命令:
  container   管理容器
  image       管理镜像
  network     管理网络
命令:
  attach      介入到一个正在运行的容器
  build       根据 Dockerfile 构建一个镜像
  commit      根据容器的更改建立一个新的镜像
  cp          在本地文件系统与容器中复制 文件/文件夹

          # 从主机复制到容器sudo docker cp host_path containerID:container_path

          # 从容器复制到主机sudo docker cp containerID:container_path host_path

  create      建立一个新容器
  exec        在容器中执行一条命令
  images      列出镜像
  kill        杀死一个或多个正在运行的容器    
  logs        取得容器的日志
  pause       暂停一个或多个容器的全部进程
  ps          列出全部容器
  pull        拉取一个镜像或仓库到 registry
  push        推送一个镜像或仓库到 registry
  rename      重命名一个容器
  restart     从新启动一个或多个容器
  rm          删除一个或多个容器
  rmi         删除一个或多个镜像
  run         在一个新的容器中执行一条命令
  search      在 Docker Hub 中搜索镜像
  start       启动一个或多个已经中止运行的容器
  stats       显示一个容器的实时资源占用
  stop        中止一个或多个正在运行的容器
  tag         为镜像建立一个新的标签
  top         显示一个容器内的全部进程
  unpause     恢复一个或多个容器内全部被暂停的进程

 

docker run命令

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    
  
  -d, --detach=false         指定容器运行于前台仍是后台,默认为false     
  -i, --interactive=false   打开STDIN,用于控制台交互    
  -t, --tty=false            分配tty设备,该能够支持终端登陆,默认为false    
  -u, --user=""              指定容器的用户    
  -a, --attach=[]            登陆容器(必须是以docker run -d启动的容器)  
  -w, --workdir=""           指定容器的工做目录   
  -c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用    
  -e, --env=[]               指定环境变量,容器中可使用该环境变量    
  -m, --memory=""            指定容器的内存上限    
  -P, --publish-all=false    指定容器暴露的端口    
  -p, --publish=[]           指定容器暴露的端口   
  -h, --hostname=""          指定容器的主机名    
  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录    
  --volumes-from=[]          给容器挂载其余容器上的卷,挂载到容器的某个目录  
  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities    
  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities    
  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法    
  --cpuset=""                设置容器可使用哪些CPU,此参数能够用来容器独占CPU    
  --device=[]                添加主机设备给容器,至关于设备直通    
  --dns=[]                   指定容器的dns服务器    
  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件    
  --entrypoint=""            覆盖image的入口点    
  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量    
  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口    
  --link=[]                  指定容器间的关联,使用其余容器的IP、env等信息    
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用    
  --name=""                  指定容器名字,后续能够经过名字进行容器管理,links特性须要使用名字    
  --net="bridge"             容器网络设置:  
                                bridge 使用docker daemon指定的网桥       
                                host    //容器使用主机的网络    
                                container:NAME_or_ID  >//使用其余容器的网路,共享IP和PORT等网络资源    
                                none 容器使用本身的网络(相似--net=bridge),可是不进行配置   
  --privileged=false         指定容器是否为特权容器,特权容器拥有全部的capabilities    
  --restart="no"             指定容器中止后的重启策略:  
                                no:容器退出时不重启    
                                on-failure:容器故障退出(返回值非零)时重启   
                                always:容器退出时老是重启    
  --rm=false                 指定容器中止后自动删除容器(不支持以docker run -d启动的容器)    
  --sig-proxy=true           设置由代理接受并处理信号,可是SIGCHLD、SIGSTOP和SIGKILL不能被代理    

更详细的功能参数配置

参数 解释
--api-enable-cors=false 开放远程API调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持.
-b, --bridge="" 挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 能够停用容器里的网络.
--bip="" 使用 CIDR 地址来设定网络桥的 IP。注意,此参数和 -b 不能一块儿使用.
-D, --debug=false 开启Debug模式。例如:docker -d -D
-d, --daemon=false 开启Daemon模式.
--dns=[] 强制容器使用DNS服务器.例如: docker -d --dns 8.8.8.8
--dns-search=[] 强制容器使用指定的DNS搜索域名.例如: docker -d --dns-search example.com
-e, --exec-driver="native" 强制容器使用指定的运行时驱动.例如:docker -d -e lxc
-G, --group="docker" 在后台运行模式下,赋予指定的Group到相应的unix socket上。注意,当此参数 --group 赋予空字符串时,将去除组信息。
-g, --graph="/var/lib/docker" 配置Docker运行时根目录
-H, --host=[] 在后台模式下指定socket绑定,能够绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:$ docker -H tcp://0.0.0.0:2375 ps 或者 $ export DOCKER_HOST="tcp://0.0.0.0:2375" $ docker ps
--icc=true 启用内联容器的通讯.
--ip="0.0.0.0" 容器绑定IP时使用的默认IP地址.
--ip-forward=true 启动容器的 net.ipv4.ip_forward.
--iptables=true 启动Docker容器自定义的iptable规则.
--mtu=0 设置容器网络的MTU值,若是没有这个参数,选用默认 route MTU,若是没有默认route,就设置成常量值 1500.
-p, --pidfile="/var/run/docker.pid" 后台进程PID文件路径.
-r, --restart=true 重启以前运行中的容器.
-s, --storage-driver="" 强制容器运行时使用指定的存储驱动,例如,指定使用devicemapper, 能够这样:docker -d -s devicemapper
--selinux-enabled=false 启用selinux支持
--storage-opt=[] 配置存储驱动的参数
--tls=false 启动TLS认证开关
--tlscacert="/Users/dxiao/.docker/ca.pem" 经过CA认证过的的certificate文件路径
--tlscert="/Users/dxiao/.docker/cert.pem" TLS的certificate文件路径
--tlskey="/Users/dxiao/.docker/key.pem" TLS的key文件路径
--tlsverify=false 使用TLS并作后台进程与客户端通信的验证
-v, --version=false 显示版本信息

*注意:其中带有[] 的启动参数能够指定屡次,例如

docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

docker详细使用

docker基本信息

uname -r 查看系统内核
systemctl start docker 启动docker 境像
docker verison 查看docker版本
docker info 显示docker系统的信息

操做docker镜像

docker search image-name 检索image
docker pull image-name 下载image
docker images 列出镜像列表
docker rmi image-name 删除一个或者多个镜像
docker history image-name 显示一个镜像的历史

*从已经建立的容器中更新镜像,而且提交这个镜像 *使用 Dockerfile 指令来建立一个新的镜像 下面经过已存在的容器建立一个新的镜像。
docker commit -m="First Image" -a="keke" 7a15f99695c0 keke/unbantu:17.10.0

上面命令参数说明:
* -m 提交的描述信息
* -a 指定镜像做者
* 7a15f99695c0 记住这个是容器id,不是镜像id
* keke/unbantu:17.10.0 建立的目标镜像名

1.在Docker 注册帐户,发布的镜像都在这个页面里展现
2.将上面作的镜像unbantu,起个新的名字unbantu-test
docker tag keke/unbantu:17.10.0 keke/unbantu-test:lastest

3.登陆docker
docker login

4.上传unbantu镜像
docker push keke/unbantu-test:lastest

经过容器建立镜像

 启动容器

docker run image-name apt-get install -y -name 在容器中安装新的程序
docker run image-name echo "hello word"  在容器中运行"echo"命令,输出"hello word"

docker run -i -t image_name /bin/bash
注意:在执行apt-get 命令的时候,要带上-y参数。若是不指定-y参数的话,apt-get命令会进入交互模式,须要用户输入命令来进行确认,但在docker环境中是没法响应这种交互的。apt-get 命令执行完毕以后,容器就会中止,但对容器的改动不会丢失.

交互式进入容器中

查看容器

docker ps 列出当前全部正在运行的container
docker ps -a 列出全部的container
docker ps -l 列出最近一次启动的container

docker commit ID new-image-name
保存对容器的修改; -a, --author="" Author; -m, --message="" Commit message

保存对容器的修改 当你对某一个容器作了修改以后(经过在容器中运行某一个命令),能够把对容器的修改保存下来,这样下次能够从保存后的最新状态运行该容器。

操做容器

docker rm `docker ps -a -q` 删除全部容器

docker rm Name/ID
-f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container

 删除单个容器

docker stop Name/ID
docker start Name/ID
docker kill Name/ID

 中止、启动、杀死一个容器

docker logs Name/ID
-f, --follow=false Follow log output; -t, --timestamps=false Show timestamps

 从一个容器中取日志
 docker diff Name/ID  列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增长的,D 删除的,C 被改变的
 docker top Name/ID  显示一个运行的容器里面的进程信息
 

docker cp Name:/container-path to-path
docker cp ID:/container-path to-path

 从容器里面拷贝文件/目录到本地一个路径
 

docker restart Name/ID
-t, --time=10 Number of seconds to try to stop for before killing the container, Default=10

 重启一个正在运行的容器
 

docker attach ID #从新启动并运行一个交互式会话shell
--no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process
注意:使用这个命令能够挂载正在后台运行的容器,在开发应用的过程当中运用这个命令能够随时观察容器內进程的运行情况.

 附加到一个运行的容器上面

保存和加载镜像

docker save image-name -o file-path
-o, --output="" Write to an file

保存镜像到一个tar包

docker load -i file-path
-i, --input="" Read from a tar archive file

加载一个tar包格式的镜像

docker save image-name > /home/keke/main.tar

*使用scp将main.tar拷到机器A上:
docker load < /home/keke/main.tar

从机器A拷贝到机器B

登陆

docker login
-e, --email="" Email; -p, --password="" Password; -u, --username="" Username

登录registry server

发布docker镜像

docker push new-image-name  发布docker镜像

构建镜像

  1. Dockerfile文件使用

docker build命令会根据Dockerfile文件及上下文构建新Docker镜像。构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,因此,构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。

  • 构建镜像

将当前目录作为构建上下文时,能够像下面这样使用docker build命令构建镜像:

$ ~/Downloads/hello-system$ sudo docker build .
Sending build context to Docker daemon  70.14kB

说明:构建会在Docker后台守护进程(daemon)中执行,而不是CLI中。构建前,构建进程会将所有内容(递归)发送到守护进程。大多状况下,应该将一个空目录做为构建上下文环境,并将Dockerfile文件放在该目录下。

在构建上下文中使用的Dockerfile文件,是一个构建指令文件。为了提升构建性能,能够经过.dockerignore文件排除上下文目录下,不须要的文件和目录。

Dockerfile通常位于构建上下文的根目录下,也能够经过-f指定该文件的位置:

$ sudo docker build -f /home/keke/Downloads/hello-system/Dockerfile .

构建时,还能够经过-t参数指定构建成后,镜像的仓库,标签等:

  • 镜像标签
$ ~/Downloads/hello-system$ sudo docker build -t keke/myapp .

若是存在多个仓库下,或使用多个镜像标签,就可使用多个-t参数:

$ docker build -t keke/myapp:1.0.2 -t keke/myapp:latest .

在Docker守护进程执行Dockerfile中的指令前,首先会对Dockerfile进行语法检查,有语法错误时会返回:

$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
  • Dockerfile文件格式 Dockerfile文件中指令不区分大小写,但为了更易区分,约定使用大写形式。

Docker 会依次执行Dockerfile中的指令,文件中的第一条指令必须是FROM,FROM指令用于指定一个基础镜像。

FROM指令用于指定其后构建新镜像所使用的基础镜像。FROM指令必是Dockerfile文件中的首条命令,启动构建流程后,Docker将会基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。

Dockerfile文件格式以下:

# Comment
INSTRUCTION arguments

Dockerfile文件中指令不区分大小写,但为了更易区分,约定使用大写形式。

Docker 会依次执行Dockerfile中的指令,文件中的第一条指令必须是FROM,FROM指令用于指定一个基础镜像。

  • FROM语法格式为:
FROM <image> 或 FROM <image>:<tag>

经过FROM指定的镜像,能够是任何有效的基础镜像。FROM有如下限制:

FROM必须是Dockerfile中第一条非注释命令 在一个Dockerfile文件中建立多个镜像时,FROM能够屡次出现。只需在每一个新命令FROM以前,记录提交上次的镜像ID。 tag或digest是可选的,若是不使用这两个值时,会使用latest版本的基础镜像

  • RUN RUN用于在镜像容器中执行命令,其有如下两种命令执行方式: shell执行 在这种方式会在shell中执行命令,Linux下默认使用/bin/sh -c,Windows下使用cmd /S /C。 注意:经过SHELL命令修改RUN所使用的默认shell
RUN <command>

exec执行

RUN ["executable", "param1", "param2"]

RUN能够执行任何命令,而后在当前镜像上建立一个新层并提交。提交后的结果镜像将会用在Dockerfile文件的下一步。

经过RUN执行多条命令时,能够经过\换行执行:

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

也能够在同一行中,经过分号分隔命令:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

RUN指令建立的中间镜像会被缓存,并会在下次构建中使用。若是不想使用这些缓存镜像,能够在构建时指定--no-cache参数,如:docker build --no-cache。

  • CMD CMD用于指定在容器启动时所要执行的命令。CMD有如下三种格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

CMD不一样于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。 CMD与RUN在功能实现上也有类似之处。如:

docker run -t -i keke/static /bin/true 等价于:cmd ["/bin/true"]

CMD在Dockerfile文件中仅可指定一次,指定屡次时,会覆盖前的指令。 另外,docker run命令也会覆盖Dockerfile中CMD命令。若是docker run运行容器时,使用了Dockerfile中CMD相同的命令,就会覆盖Dockerfile中的CMD命令。 如,咱们在构建镜像的Dockerfile文件中使用了以下指令:

CMD ["/bin/bash"]

使用docker build构建一个新镜像,镜像名为keke/test。构建完成后,使用这个镜像运行一个新容器,运行效果以下:

sudo docker run -i -t keke/test

在使用docker run运行容器时,咱们并无在命令结尾指定会在容器中执行的命令,这时Docker就会执行在Dockerfile的CMD中指定的命令。 若是不想使用CMD中指定的命令,就能够在docker run命令的结尾指定所要运行的命令:

sudo docker run -i  -t keke/test /bin/ps

这时,docker run结尾指定的/bin/ps命令覆盖了Dockerfile的CMD中指定的命令.

  • ENTRYPOINT ENTRYPOINT用于给容器配置一个可执行程序。也就是说,每次使用镜像建立容器时,经过ENTRYPOINT指定的程序都会被设置为默认程序。ENTRYPOINT有如下两种形式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINT与CMD很是相似,不一样的是经过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT。Dockerfile中只容许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 docker run运行容器时指定的参数都会被传递给ENTRYPOINT,且会覆盖CMD命令指定的参数。如,执行docker run -d时, -d参数将被传递给入口点。也能够经过docker run --entrypoint重写ENTRYPOINT入口点。 如:能够像下面这样指定一个容器执行程序:

ENTRYPOINT ["/usr/bin/nginx"]

完整构建代码:

FROM ...
MAINTAINER keke "2536495681@gmail.com"
RUN ...

# 指定容器内的程序将会使用容器的指定端口
# 配合 docker run -p
EXPOSE ...

使用docker build构建镜像,并将镜像指定为keke/test:

sudo docker build -t="itbilu/test" .

构建完成后,使用keke/test启动一个容器:

sudo docker run -i -t keke/test -g "daemon off;"

在运行容器时,咱们使用了-g "daemon off;" ,这个参数将会被传递给ENTRYPOINT,最终在容器中执行的命令为/usr/sbin/nginx -g "daemon off;" 。

  • EXPOSE EXPOSE用于指定容器在运行时监听的端口:
EXPOSE <port> [<port>...]

EXPOSE并不会让容器的端口访问到主机。要使其可访问,须要在docker run运行容器时经过-p来发布这些端口,或经过-P参数来发布EXPOSE导出的全部端口。

  • RUN: 指定镜像被构建时要运行的命令
  • CMD: 指定容器被启动时要运行的命令
  • ENTRYPOINT: 同 CMD ,但不会被 docker run -t 覆盖
  • WORKDIR: CMD/ENTRYPOINT 会在这个目录下执行
  • VOLUME:建立挂载点,即向基于所构建镜像创始的容器添加卷
  • ADD:用于复制构建环境中的文件或目录到镜像中
  • COPY:一样用于复制构建环境中的文件或目录到镜像中
docker history images-name

Dockerfile文件语法

dockerfile主要组成部分:

     基础镜像信息 FROM centos:6.8

     制做镜像操做指令RUN yum insatll openssh-server -y

     容器启动时执行指令 CMD ["/bin/bash"]

dockerfile经常使用指令:

     FROM 这个镜像的妈妈是谁?(指定基础镜像)

     MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,能够没有)

     RUN 你想让它干啥(在命令前面加上RUN便可)

     ADD 给它点创业资金(COPY文件,会自动解压)

     WORKDIR 我是cd,今天刚化了妆(设置当前工做目录)

     VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)

     EXPOSE 它要打开的门是啥(指定对外的端口)

     CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)

dockerfile其余指令: 

    COPY 复制文件

    ENV  环境变量

    ENTRYPOINT  容器启动后执行的命令

 

(1)FROM(指定基础image)
构建指令,必须指定且须要在Dockerfile其余指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image能够是官方远程仓库中的,也能够位于本地仓库。镜像能够指定标签。格式:

FROM <image>:<tag> 

(2)MAINTAINER(用来指定镜像建立者信息)
构建指令,用于将image的制做者相关的信息写入到image中。当咱们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
格式:

MAINTAINER <name> 

(3)RUN
构建指令,RUN能够运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。RUN指令能够有多条,每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时,能够用\来换行。
该指令有两种格式:

# 在shell终端中运行 - `/bin/sh -c`
RUN <command>

# 使用exec执行
RUN ["executable", "param1", "param2" ... ]

(4)CMD(设置容器启动时执行的操做)
设置指令,用于容器启动时指定的操做。该操做能够是执行自定义脚本,也能够是执行系统命令。该指令只能在文件中存在一次,若是有多个,则只执行最后一条。
该指令有三种格式:

# 格式一:like an exec, this is the preferred form
CMD ["executable","param1","param2"]

# 格式二:as a shell
CMD command param1 param2

# 当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:做为ENTRYPOINT的缺省参数
CMD ["param1","param2"]

注意:
1) CMD运行在镜像构建以后,容器启动的时候;
2) CMD只执行最后一条
3) CMD能够被用户指定的命令覆盖

(5)ENTRYPOINT(设置容器启动时执行的操做)
设置指令,指定容器启动时执行的命令,能够屡次设置,可是只有最后一个有效。
两种格式:

# 格式一:like an exec, this is the preferred form
ENTRYPOINT ["executable", "param1", "param2"]

# 格式二:as a shell
ENTRYPOINT command param1 param2

该指令的使用分为两种状况,一种是独自使用,另外一种和CMD指令配合使用。

当独自使用时,若是你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效:

# CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
CMD echo “Hello, World!”  
ENTRYPOINT ls -l 

另外一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数:

FROM ubuntu  
CMD ["-l"]  
ENTRYPOINT ["/usr/bin/ls"] 

注意:
1) 和CMD指令基本同样,可是不能被用户指定的命令所覆盖;
2) 能够和CMD组合使用,ENTRYPOINT提供不可变得命令,CMD提供缺省参数。

(6)USER(设置容器的用户)
设置指令,设置启动容器的用户,默认是root用户。

# 指定memcached的运行用户  
ENTRYPOINT ["memcached"]  
USER daemon  

# 或  
ENTRYPOINT ["memcached", "-u", "daemon"]  

(7)EXPOSE(指定容器须要映射到宿主机器的端口)
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。格式为:

EXPOSE <port> [<port> ...]
例如:

EXPOSE 80 443 11211

告诉Docker服务端容器暴露的端口号,供互联系统使用。在启动容器时须要经过-P,Docker主机会自动分配一个端口转发到指定的端口;使用-p,则能够具体指定哪一个本地端口映射过来。

(8)ENV(用于设置环境变量)
构建指令,在image中设置一个环境变量。格式:

ENV <key> <value>

设置了后,后续的RUN命令均可以使用,容器启动后,能够经过docker inspect查看这个环境变量,也能够经过在docker run --env key=value时设置或修改环境变量。

假如你安装了JAVA程序,须要设置JAVA_HOME,那么能够在Dockerfile中这样写:

ENV JAVA_HOME /path/to/java/dirent

(9)ADD(从src复制文件到容器的dest路径)
构建指令,全部拷贝到容器中的文件和文件夹权限为0755,uid和gid为0。格式为:

ADD <src> <dest> 
<src> 是相对被构建的源目录的相对路径,能够是文件或目录的路径,也能够是一个远程的文件url;<dest>是容器中的绝对路径。

该命令将复制指定的<src>到容器中的<dest>。其中<src>能够是Dockerfile所在目录的一个相对路径(文件或目录);也能够是一个URL;还能够是一个tar文件(自动解压为目录)。

若是是一个目录,那么会将该目录下的全部文件添加到容器中,不包括目录;若是文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);若是<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;若是<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

(10)COPY
格式为

COPY <src> <dest>

复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)为容器中的<dest>。目标路径不存在时,会自动建立。
当使用本地目录为源目录时,推荐使用COPY。

(11)VOLUME(指定挂载点))
设置指令,使容器中的一个目录具备持久化存储数据的功能,该目录能够被容器自己使用,也能够共享给其余容器使用。咱们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,全部的更改都会丢失。当容器中的应用有持久化数据的需求时能够在Dockerfile中使用该指令。格式:

VOLUME ["<mountpoint>"] 

示例:

FROM base VOLUME ["/tmp/data"] 

运行经过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另外一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么能够运行下面的命令启动一个容器:

docker run -t -i -rm -volumes-from container1 image2 bash  

# container1为第一个容器的ID,image2为第二个容器运行image的名字。

(12)WORKDIR(切换目录)
设置指令,能够屡次切换(至关于cd命令),对RUN,CMD,ENTRYPOINT生效。格式:

WORKDIR /path/to/workdir  
示例:

# 在 /p1/p2 下执行 vim a.txt  
WORKDIR /p1
WORKDIR p2
RUN vim a.txt  

(13)ONBUILD(在子镜像中执行)

ONBUILD <Dockerfile关键字>  
# ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

(14)ARG(指定构建过程当中使用的环境变量)

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

重新镜像启动容器

docker run -d -p 4000:80 --name [name] #能够在 Dokcer 宿主机上指定一个具体的端口映射到容器的80端口上

守护容器

docker run -d container-name #建立守护容器
docker top container-name #查看容器内进程
docker exec container-name touch a.txt #在容器内部运行进程
docker stop container-name #中止容器

疑难杂症

docker login时出现问题以下:
Error saving credentials: error storing credentials - err: exit status 1, out: `The connection is closed`

解决方案:
sudo apt install gnupg2 pass

 

docker资料

官方英文资源

中文资源

其它资源

 

参考or转发

https://www.cnblogs.com/52fhy/p/5638571.html

https://github.com/KeKe-Li/docker-directive

https://www.cnblogs.com/52fhy/p/5638571.html

相关文章
相关标签/搜索