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 623 22:58 ./
drwxr-xr-x 22 jack             jack      4096 622 22:18 ../
drwxr-xr-x  2 systemd-coredump root      4096 410 18:14 data/
-rw-------  1 root             root 551940608 622 22:37 mysql
-rw-r--r--  1 root             root 551940608 623 22:58 mysql.tar
drwxr-xr-x  2 root             root      4096 410 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值