Docker 使用大全
1 Ubuntu 安装 Docker
1.1 配置 apt 支持 SSL 传输
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
1.2 添加 Docker GPG 秘钥
# Docker 官方 GPG 秘钥
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker 阿里 GPG 秘钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
1.3 添加 Docker 源
# Docker 官方源
#sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Docker 阿里源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
1.4 更新 apt 源
sudo apt update
1.5 安装 Docker
sudo apt install -y docker-ce
1.6 查看 Docker 服务状态
root@ubuntu:~# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-15 09:52:38 CST; 1h 22min ago
Docs: https://docs.docker.com
Main PID: 19134 (dockerd)
Tasks: 18
Memory: 75.6M
CGroup: /system.slice/docker.service
└─19134 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
1.7 启动 Docker 服务
sudo systemctl start docker
1.8 查看 Docker 版本信息
root@ubuntu:~# docker version
Client:
Version: 19.03.6
API version: 1.40
Go version: go1.12.10
Git commit: 369ce74a3c
Built: Fri Feb 28 23:26:00 2020
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 19.03.6
API version: 1.40 (minimum version 1.12)
Go version: go1.12.10
Git commit: 369ce74a3c
Built: Wed Feb 19 01:04:38 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.3-0ubuntu1~19.10.2
GitCommit:
runc:
Version: spec: 1.0.1-dev
GitCommit:
docker-init:
Version: 0.18.0
GitCommit:
root@ubuntu:~# docker --version
Docker version 19.03.6, build 369ce74a3c
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu:~#
1.9 配置 Docker 开机自启
sudo systemctl enable docker
2 修改 Docker 配置 (可选)
2.1 创建/修改 Docker 配置文件
创建或者修改 Docker 的 /etc/docker/daemon.json
sudo gedit /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://quay-mirror.qiniu.com"
],
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
2.2 重启 Docker 服务
service docker restart
3 修改 Docker cgroups (可选)
sudo systemctl daemon-reload
sudo systemctl restart docker
root@ubuntu:/etc/docker# docker info | grep Cgroup
Cgroup Driver: systemd
WARNING: No swap limit support
root@ubuntu:/etc/docker#
4 Docker 操作
4.1 查找镜像
docker search 镜像名称
root@ubuntu:~# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8028 [OK]
bitnami/redis Bitnami Redis Docker Image 141 [OK]
sameersbn/redis 79 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0 & 5.0 65
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 37 [OK]
kubeguide/redis-master redis-master with "Hello World!" 31
redislabs/redis Clustered in-memory database engine compatib… 24
oliver006/redis_exporter Prometheus Exporter for Redis Metrics. Supp… 21
redislabs/redisearch Redis With the RedisSearch module pre-loaded… 21
arm32v7/redis Redis is an open source key-value store that… 21
bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 12 [OK]
webhippie/redis Docker images for Redis 11 [OK]
redislabs/redisgraph A graph database module for Redis 10 [OK]
s7anley/redis-sentinel-docker Redis Sentinel 9 [OK]
arm64v8/redis Redis is an open source key-value store that… 9
insready/redis-stat Docker image for the real-time Redis monitor… 9 [OK]
redislabs/redismod An automated build of redismod - latest Redi… 7 [OK]
centos/redis-32-centos7 Redis in-memory data structure store, used a… 5
redislabs/redisinsight RedisInsight - The GUI for Redis 5
circleci/redis CircleCI images for Redis 4 [OK]
clearlinux/redis Redis key-value data structure server with t… 2
tiredofit/redis Redis Server w/ Zabbix monitoring and S6 Ove… 1 [OK]
wodby/redis Redis container image with orchestration 1 [OK]
runnable/redis-stunnel stunnel to redis provided by linking contain… 1 [OK]
xetamus/redis-resource forked redis-resource 0 [OK]
4.2 下载镜像
docker pull 镜像名称:版本
# 不指定版本会下载最新版本
docker pull 镜像名称:版本
root@ubuntu:~# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
8559a31e96f4: Pull complete
85a6a5c53ff0: Pull complete
b69876b7abed: Pull complete
a72d84b9df6a: Pull complete
5ce7b314b19c: Pull complete
04c4bfb0b023: Pull complete
Digest: sha256:800f2587bf3376cb01e6307afe599ddce9439deafbd4fb8562829da96085c9c5
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
4.3 查看下载
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 4cdbec704e47 2 weeks ago 98.2MB
mysql latest 9228ee8bac7a 2 weeks ago 547MB
4.4 删除镜像
docker rmi 镜像ID
如果该镜像有运行的镜像则不能删除,可以先停止容器,再删除
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 4cdbec704e47 2 weeks ago 98.2MB
mysql latest 9228ee8bac7a 2 weeks ago 547MB
a273218159/zentao latest c5b4be595f8f 21 months ago 1.15GB
root@ubuntu:~# docker rmi c5b4be595f8f
Untagged: a273218159/zentao:latest
Untagged: a273218159/zentao@sha256:590fca6580fb1b7e736db35cc12f9c109b5cf85f1142368a7bcc8cab0e74bf81
Deleted: sha256:c5b4be595f8f24ce5a2b78f0aae36893d2fc8884fe12f8d1b20a7c0198c29cdc
Deleted: sha256:546a12bcbdf971a1af11d42c6b46bbdc5659d54749cfe8e35b50c413f9a59e63
Deleted: sha256:100abf6963bf685778862c64c89d0aa535a958c34457b49aacf3b5c40bbe777f
Deleted: sha256:bcc97fbfc9e1a709f0eb78c1da59caeb65f43dc32cd5deeb12b8c1784e5b8237
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 4cdbec704e47 2 weeks ago 98.2MB
mysql latest 9228ee8bac7a 2 weeks ago 547MB
4.5 创建容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
4.6 启动容器
docker start 容器名
docker start 容器名
root@ubuntu:~# docker start mysql8
mysql8
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a995fe3a5c12 mysql:latest "docker-entrypoint.s…" 2 months ago Up 6 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
root@ubuntu:~#
4.7 停止容器
docker stop 容器名
docker stop 容器名
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a995fe3a5c12 mysql:latest "docker-entrypoint.s…" 2 months ago Up 4 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
root@ubuntu:~# docker stop mysql8
mysql8
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu:~#
4.8 重启容器
docker restart 容器名
docker restart 容器名
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu:~# docker restart mysql8
mysql8
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a995fe3a5c12 mysql:latest "docker-entrypoint.s…" 2 months ago Up 4 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
root@ubuntu:~#
4.9 删除容器
docker rm 容器名
docker rm 容器名
4.10 查看所有容器(运行/未运行)
root@ubuntu:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57dcd97fd4e5 4cdbec704e47 "docker-entrypoint.s…" 2 months ago Exited (0) 2 months ago redis
a995fe3a5c12 mysql:latest "docker-entrypoint.s…" 2 months ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
root@ubuntu:~#
5 Docker 容器迁移
5.1 export&import 还是 save & load
方法 | 作用 | 作用对象 | 能否保留数据 | 导出的内容 | 主要的应用场景 |
---|---|---|---|---|---|
export & import | 用来将container的文件系统进行打包的 | container | 不可以 | 一个Linux系统的文件目录 | 制作基础镜像 |
save & load | 用来将一个或者多个image打包 | image(container实际上也可以,但其实际上作用的是container下的image) | 可以 | 一个分层的文件系统(相对于前者比较大,因为多层文件系统中可能有东西是重合的) | 打包多个镜像 |
5.2 save & load
docker commit -a "hyacinth" -m "MySQL数据库容器迁移" mysql8 mysql:V8.0
docker commit --author "hyacinth" --message "MySQL数据库容器迁移" mysql8 mysql:V8.0
参数 | 说明 |
---|---|
-a/–author | 作者信息 |
-m/–message | 备注信息 |
mysql8 | 需要迁移的容器名称(正在运行的容器) |
mysql:V8.0 | 镜像名称和镜像标签 |
注:如果容器有挂载外部文件,如果想保留挂载文件的数据则需要把所有的挂载文件复制到新的环境,在恢复容器的时候要 -v 指定挂载文件 |
root@ubuntu:~# docker inspect --format='{{.Mounts}}' mysql8
[{volume 55485a1d2d9cab81f130a7b64755fc593e28fadf4989f27abb74a4cccb4c73c4 /var/lib/docker/volumes/55485a1d2d9cab81f130a7b64755fc593e28fadf4989f27abb74a4cccb4c73c4/_data /var/lib/mysql local true }]
root@ubuntu:~#
5.3 容器转镜像
root@ubuntu:/home/jack/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a995fe3a5c12 mysql:latest "docker-entrypoint.s…" 2 months ago Up 16 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql8
root@ubuntu:/home/jack/docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 4cdbec704e47 2 months ago 98.2MB
mysql latest 9228ee8bac7a 2 months ago 547MB
root@ubuntu:/home/jack/docker#
root@ubuntu:/home/jack/docker# docker commit -a "hyacinth" -m "MySQL数据库容器迁移" mysql8 mysql:V8.0
sha256:10a78039733080095eed5458bcbef77e4ec5e0304c0771fedd5ddebb98c63b13
root@ubuntu:/home/jack/docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql V8.0 10a780397330 6 seconds ago 547MB
redis latest 4cdbec704e47 2 months ago 98.2MB
mysql latest 9228ee8bac7a 2 months ago 547MB
root@ubuntu:/home/jack/docker#
5.4 镜像转静态文件
docker save -o mysql:V8.0 > mysql.tar
参数 | 说明 |
---|---|
mysql:V8.0 | 镜像名称和镜像标签 |
mysql.tar | 外部静态文件文件名称(当面Shell控制台所在目录) |
root@ubuntu:/home/jack/docker# docker save mysql:V8.0 > mysql.tar
root@ubuntu:/home/jack/docker# ll
总用量 1078040
drwxr-xr-x 4 root root 4096 6月 23 22:58 ./
drwxr-xr-x 22 jack jack 4096 6月 22 22:18 ../
drwxr-xr-x 2 systemd-coredump root 4096 4月 10 18:14 data/
-rw------- 1 root root 551940608 6月 22 22:37 mysql
-rw-r--r-- 1 root root 551940608 6月 23 22:58 mysql.tar
drwxr-xr-x 2 root root 4096 4月 10 18:14 redis.conf/
root@ubuntu:/home/jack/docker#
5.5 镜像还原
docker load -i mysql.tar
root@ubuntu:/home/hyacinth/SoftWare# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root@ubuntu:/home/hyacinth/SoftWare# docker load -i mysql.tar
c3a984abe8a8: Loading layer [==================================================>] 72.48MB/72.48MB
3aa6919958ae: Loading layer [==================================================>] 338.4kB/338.4kB
f36486186489: Loading layer [==================================================>] 9.539MB/9.539MB
c08e063406bc: Loading layer [==================================================>] 4.495MB/4.495MB
b63d6049d8d7: Loading layer [==================================================>] 1.536kB/1.536kB
a1452fb52f96: Loading layer [==================================================>] 53.75MB/53.75MB
1a945d224d74: Loading layer [==================================================>] 6.656kB/6.656kB
7bb6a75aad66: Loading layer [==================================================>] 3.584kB/3.584kB
b10e17c4e958: Loading layer [==================================================>] 411.2MB/411.2MB
e61fc95905e3: Loading layer [==================================================>] 5.632kB/5.632kB
38d33c0c39bf: Loading layer [==================================================>] 16.38kB/16.38kB
e1d0e0aeeac6: Loading layer [==================================================>] 1.536kB/1.536kB
ca98c7859dd8: Loading layer [==================================================>] 8.192kB/8.192kB
Loaded image: mysql:V8.0
root@ubuntu:/home/hyacinth/SoftWare#
root@ubuntu:/home/hyacinth/SoftWare# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql V8.0 10a780397330 10 minutes ago 547MB
root@ubuntu:/home/hyacinth/SoftWare#
5.5 容器还原
docker run -d --name=mysql8 -p 3306:3306 --restart=always mysql:V8.0
6 Dockersfile
6.1 Dockerfile 是什么
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
6.2 Dockerfile 的基础结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
6.3 Dockerfile 的文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
6.4 Dockerfile 如何运行
6.4.1 docker build -f
-f 标志 docker build 指向文件系统中任何位置的 Dockerfile 。
docker build -f /a/b/c/Dockerfile .
6.4.2 docker build -t
-t 表示当前目录中 REPOSITORY 为镜像名字 TAG 为镜像版本(如果不指定则为least)
格式:
docker build -t REPOSITORY:TAG .
示例:
docker build -t test:least .
6.5 Dockerfile 指令详解
指令 | 作用 |
---|---|
FROM | 指定基础镜像,必须为第一个命令。 |
MAINTAINER | 镜像维护者信息。 |
RUN | 构建镜像时执行的命令。 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。 |
COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。 |
CMD | 构建容器后调用,也就是在容器启动时才进行调用。 |
ENTRYPOINT | 配置容器,使其可执行化。配合CMD可省去"application",只使用参数。 |
LABEL | 用于为镜像添加元数据。 |
ENV | 设置环境变量。 |
EXPOSE | 指定于外界交互的端口。 |
VOLUME | 用于指定持久化目录。 |
WORKDIR | 工作目录,类似于cd命令。 |
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。 |
ARG | 用于指定传递给构建运行时的变量。 |
ONBUILD | 用于设置镜像触发器。 |
6.5.1 FROM
指定基础镜像,必须为第一个命令。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
// tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
示例:
FROM centos:latest
6.5.2 MAINTAINER (可选)
镜像维护者信息。
格式:
MAINTAINER <info>
示例:
MAINTAINER hyacinth
MAINTAINER hyacinth@hyacinth.com
MAINTAINER hyacinth <hyacinth@hyacinth.com>
6.5.3 RUN
构建镜像时执行的命令。
格式:
RUN <command>
// RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
示例:
RUN apt install vim
RUN yum install wget
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
6.5.4 ADD
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget,ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
6.5.4.1 ADD 的优点
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
6.5.4.2 ADD 的缺点
在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] // 用于支持包含空格的路径
示例:
ADD redis-5.0.3.tar.gz /app/redis/
ADD readme /readme/
6.5.5 COPY
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
示例:
COPY redis-5.0.3.tar.gz /app/redis/
COPY readme /readme/
6.5.6 CMD
构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] // (执行可执行文件,优先)
CMD ["param1","param2"] // (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 // (执行shell内部命令)
示例:
CMD echo "This is a Dockerfile test."
6.5.7 ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
如果 ENTRYPOINT 为非 JSON 则以 ENTRYPOINT 为主,如果 ENTRYPOINT 和 CMD 都是 JSON 则ENTRYPOINT + CMD 会拼接成 Shell 语句执行
6.5.7.1 ENTRYPOINT 优点
在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
6.5.7.2 ENTRYPOINT 注意
如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
示例:
FROM nginx
ENTRYPOINT ["nginx", "-c"] // 定参
CMD ["/etc/nginx/nginx.conf"] // 变参 CMD 的参数会传给 ENTRYPOINT -> ENTRYPOINT ["nginx", "-c", "/etc/nginx/nginx.conf"] -> nginx -c /etc/nginx/nginx.conf
在启动镜像时可以给 ENTRYPOINT 传参数
docker run test:least -c /etc/nginx/new.conf
// 容器会运行 nginx -c /etc/nginx/new.conf
6.5.8 LABEL
用于为镜像添加元数据。
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
// 使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
示例:
LABEL version="1.0" description="This is a Dockerfile test." by="aaaa"
6.5.9 ENV
设置环境变量。
格式:
ENV <key> <value>
// <key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ...
// 可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV description This is a Dockerfile test.
ENV version="1.0" description="This is a Dockerfile test." by="aaaa"
6.5.10 EXPOSE
指定于外界交互的端口,仅仅只是声明端口而已。
6.5.10.1 EXPOSE作用
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,需要在docker run运行容器时通过 -p 来发布这些端口,或通过 -P 参数来发布EXPOSE导出的所有端口。
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 81 82
EXPOSE 8080
EXPOSE 8081/tcp 8082/udp
6.5.11 VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
6.5.11.1 VOLUME作用
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
6 避免重要的数据,因容器重启而丢失,这是非常致命的。
7 避免容器不断变大。
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/a"]
VOLUME ["/a/b", "/a/b/c", "/etc/apache"
6.5.12 WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <dir>
示例:
WORKDIR /a // (这时工作目录为/a)
WORKDIR b // (这时工作目录为/a/b)
WORKDIR c // (这时工作目录为/a/b/c)
6.5.13 USER
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户.
格式:
USER <user>[:<group>]
示例:
user root
USER root:root
6.5.14 ARG
用于指定传递给构建 运行时 的变量。
格式:
ARG <name>[=<default value>]
// 在 build 时可以通过 --build-arg <name>[=<default value>] 来修改运行时变量
示例:
ARG aaa
ARG builder = aaaa
6.5.15 ONBUILD
用于设置镜像触发器。
格式:
ONBUILD [INSTRUCTION]
// 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
示例:
ONBUILD ADD tomcat.tar.gz /app/tomcat
ONBUILD RUN apt install vim
6.6 Dockerfile 测试
6.6.1 创建 Dockerfile
DockerfileD
root@ubuntu:/home/hyacinth/DockerTest# touch Dockerfile
root@ubuntu:/home/hyacinth/DockerTest# vim Dockerfile
root@ubuntu:/home/hyacinth/DockerTest# cat Dockerfile
# 测试 Dockerfile 在Docker运行的时候输出测试简单的语句This is a Dockerfile test. \n it success
FROM ubuntu
MAINTAINER hyacinth "hyacinth@hyacinth.com"
WORKDIR /test
COPY test.txt /test
RUN echo it success >> test.txt
CMD cat test.txt
# CMD ["cat", "test.txt"]
测试文件
root@ubuntu:/home/hyacinth/DockerTest# touch test.txt
root@ubuntu:/home/hyacinth/DockerTest# cat test.txt
This is a Dockerfile test.
6.6.2 编译 Dockerfile
root@ubuntu:/home/hyacinth/DockerTest# docker build -t test .
Sending build context to Docker daemon 3.072kB
Step 1/6 : FROM ubuntu
latest: Pulling from library/ubuntu
da7391352a9b: Already exists
14428a6d4bcd: Already exists
2c2d948710f2: Already exists
Digest: sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c
Status: Downloaded newer image for ubuntu:latest
---> f643c72bc252
Step 2/6 : MAINTAINER hyacinth "hyacinth@hyacinth.com"
---> Running in 2ca28acfbc6e
Removing intermediate container 2ca28acfbc6e
---> 346a5035d3db
Step 3/6 : WORKDIR /test
---> Running in d98a2ff2e990
Removing intermediate container d98a2ff2e990
---> 73134d655c11
Step 4/6 : COPY test.txt /test
---> 2f6c9860507f
Step 5/6 : RUN echo it success >> test.txt
---> Running in dbda8a6f2d9c
Removing intermediate container dbda8a6f2d9c
---> 701d010ad638
Step 6/6 : CMD tail -f test.txt
---> Running in 8e5172585ea9
Removing intermediate container 8e5172585ea9
---> 44b979848052
Successfully built 44b979848052
Successfully tagged test:latest
root@ubuntu:/home/hyacinth/DockerTest#
6.6.2 查看 Docker 镜像
root@ubuntu:/home/hyacinth/DockerTest# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest c05238475aeb 6 seconds ago 72.9MB
6.6.3 运行 Docker 镜像
root@ubuntu:/home/hyacinth/DockerTest# docker run ubuntu
This is a Dockerfile test.
it success