docker学习笔记
目录
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 指令来创建一个新的镜像 下面通过已存在的容器创建一个新的镜像。 上面命令参数说明: 1.在Docker 注册账户,发布的镜像都在这个页面里展示 3.登录docker 4.上传unbantu镜像 |
通过容器创建镜像 |
启动容器
| 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 |
交互式进入容器中 |
查看容器
| docker ps | 列出当前所有正在运行的container |
| docker ps -a | 列出所有的container |
| docker ps -l | 列出最近一次启动的container |
|
docker commit ID new-image-name |
保存对容器的修改 当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。 |
操作容器
| docker rm `docker ps -a -q` | 删除所有容器 |
|
docker rm Name/ID |
删除单个容器 |
|
docker stop Name/ID |
停止、启动、杀死一个容器 |
|
docker logs Name/ID |
从一个容器中取日志 |
| docker diff Name/ID | 列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的 |
| docker top Name/ID | 显示一个运行的容器里面的进程信息 |
|
docker cp Name:/container-path to-path |
从容器里面拷贝文件/目录到本地一个路径 |
|
docker restart Name/ID |
重启一个正在运行的容器 |
|
docker attach ID #重新启动并运行一个交互式会话shell |
附加到一个运行的容器上面 |
保存和加载镜像
|
docker save image-name -o file-path |
保存镜像到一个tar包 |
|
docker load -i file-path |
加载一个tar包格式的镜像 |
|
docker save image-name > /home/keke/main.tar *使用scp将main.tar拷到机器A上: |
从机器A拷贝到机器B |
登录
|
docker login |
登陆registry server |
发布docker镜像
| docker push new-image-name | 发布docker镜像 |
构建镜像
- 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资料
官方英文资源
- Docker官网:http://www.docker.com
- Docker windows入门:https://docs.docker.com/windows/
- Docker Linux 入门:https://docs.docker.com/linux/
- Docker mac 入门:https://docs.docker.com/mac/
- Docker 用户指引:https://docs.docker.com/engine/userguide/
- Docker 官方博客:http://blog.docker.com/
- Docker Hub: https://hub.docker.com/
- Docker开源: https://www.docker.com/open-source
中文资源
- Docker中文网站:http://www.docker.org.cn
- Docker中文文档:http://www.dockerinfo.net/document
- Docker安装手册:http://www.docker.org.cn/book/install.html
- 一小时Docker教程 :https://blog.csphere.cn/archives/22
- Docker中文指南:http://www.widuu.com/chinese_docker/index.html
其它资源
- Docker 快速手册!
- Docker 教程
- MySQL Docker 单一机器上如何配置自动备份
- Docker — 从入门到实践
- https://github.com/yeasy/docker_practice(非常详细)
- docker问答
- moby
- https://wiki.openstack.org/wiki/Docker
- https://wiki.archlinux.org/index.php/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

浙公网安备 33010602011771号