image-20210228175240489

在服务器中安装 Docker

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。

1
2
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

安装完成后的推荐操作

  1. 启动 docker

    1
    2
    sudo systemctl enable docker
    sudo systemctl start docker
  2. 创建 docker 用户组

    1
    sudo groupadd docker
  3. 将当前用户加入 docker 组

    1
    sudo usermod -aG docker $USER
  4. 测试 docker 安装是否正确

    1
    docker run hello-world

修改镜像

  1. 登录阿里容器镜像服务

  2. 查看加速地址

    image-20210227190110321

  3. 设置加速服务

    • 创建目录

      1
      sudo mkdir -p /etc/docker
    • 创建文件并写入内容

      1
      2
      3
      4
      5
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
      "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
      }
      EOF
    • 重新加载及重启 Docker 服务

      1
      2
      sudo systemctl daemon-reload
      sudo systemctl restart docker
  4. 查看镜像地址

    1
    docker info

镜像常用命令

查看本机中所有镜像

命令docker images [镜像名]可查看当前镜像。

  • -q

    只显示镜像 id

  • -a

    列出所有镜像(包含中间映像层)

搜索镜像

命令格式:docker search [options] 镜像名

  • -s

    列出收藏数不少于指定值的镜像

  • --no-trunc

    显示完整的镜像信息

从仓库下载镜像

命令格式:docker pull 镜像名[:TAG|@DIGEST]

可以指定 TAG 或者 DIGEST

  • TAG

    标签名

  • DIGEST

删除镜像

命令格式:docker rmi 镜像名

可以指定 TAG 或者 DIGEST

  • -f

    强制删除

容器常用命令

运行容器

镜像名新建并启动容器

命令格式:docker run [选项] 镜像名

  • --name

    别名为容器起一个名字

  • -d

    启动守护式容器(在后台启动容器)

  • -p

    映射端口号:原始端口号 指定端口号启动

  • --network

    指定使用的网桥

1
2
3
docker run -it --name myTomcat -p 8888:8080 tomcat

docker run -d --name myTomcat -P tomcat

查看运行的容器

列出所有正在运行的容器,命令格式:docker ps

  • -a

    正在运行的和历史运行过的容器

  • -q

    静默模式,只显示容器编号

停止|关闭|重启容器

  • 开启容器

    docker start 容器名字或者容器id

  • 重启容器

    docker restart 容器名或者容器id

  • 正常停止容器运行

    docker stop 容器名或者容器id

  • 立即停止容器运行

    docker kill 容器名或者容器id

删除容器

  • 删除单个容器

    docker rm -f 容器id和容器名

  • 删除所有容器

    docker rm -f $(docker ps -aq)

查看容器内进程

docker top 容器id或者容器名

查看容器内部细节

docker inspect 容器id

查看容器运行日志

命令格式:docker logs [OPTIONS] 容器id或容器名

  • -t

    加入时间戳

  • -f

    跟随最新的日志打印

  • --tail

    数字 显示最后多少条

进入容器内部

命令格式:docker exec [options] 容器id 容器内命令

  • -i

    以交互模式运行容器,通常与-t 一起使用

  • -t

    分配一个伪终端 shell 窗口 bash

容器和宿主机之间复制文件

  • 将宿主机复制到容器内部

    docker cp 文件|目录 容器id:容器路径

  • 将容器内资源拷贝到主机上

    docker cp 容器id:容器内资源路径 宿主机目录路径

数据卷(volum)实现与宿主机共享目录

命令:docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名,宿主机与容器文件是互通的。

docker run -v 宿主机的路径|任意别名:/容器内的路径:ro 镜像名,容器机不能修改宿主机的文件内容。

  • 如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
  • 如果是别名则会在 docker 运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

打包镜像

命令:docker save 镜像名:tag -o 名称.tar

载入镜像

命令:docker load -i 名称.tar

容器打包成新的镜像

命令:docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签

容器间通信

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

image-20201125105847896

网桥

  1. 查看默认网桥

    1
    docker network ls
  2. 创建网桥

    1
    docker network create name
  3. 删除网桥

    1
    docker network rm name
  4. 删除没有使用的网桥

    1
    docker network prune

Dockerfile

Dockerfile 可以认为是Docker 镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建 docker 镜像的构建文件

image-20200404111908085

通过架构图可以看出通过 DockerFile 可以直接构建镜像

image-20200603181253804

打包字段详情见官方:https://docs.docker.com/engine/reference/builder/

保留字作用
FROM当前镜像是基于哪个镜像的 第一个指令必须是FROM
RUN构建镜像时需要运行的指令
EXPOSE当前容器对外暴露出的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 包
COPY类似于 ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数

FROM 命令

  • 基于那个镜像进行构建新的镜像,在构建时会自动从 docker hub 拉取 base 镜像 必须作为 Dockerfile 的第一个指令出现

  • 语法:

    1
    2
    3
    FROM  <image>
    FROM <image>[:<tag>] 使用版本不写为latest
    FROM <image>[@<digest>] 使用摘要

RUN 命令

  • RUN 指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于 Dockerfile 中的下一步

  • 语法:

    1
    2
    3
    4
    5
    RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    RUN echo hello

    RUN ["executable", "param1", "param2"] (exec form)
    RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE 命令

  • 用来指定构建的镜像在运行为容器时对外暴露的端口

  • 语法:

    1
    2
    EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
    EXPOSE 80/udp

CMD 命令

  • 用来为启动的容器指定执行的命令,在 Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 注意: Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令才会生效。

  • 语法:

    1
    2
    3
    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)

WORKDIR 命令

  • 用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也将被创建。

  • 语法:

    1
    2
    3
    4
    5
    6
    WORKDIR /path/to/workdir

    WORKDIR /a
    WORKDIR b
    WORKDIR c
    `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`

ENV 命令

  • 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

  • 语法:

    1
    2
    ENV <key> <value>
    ENV <key>=<value> ...

ADD 命令

  • 用来从 context 上下文复制新文件、目录或远程文件 url,并将它们添加到位于指定路径的映像文件系统中。

  • 语法:

    1
    2
    3
    4
    5
    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/ 通配符添加
    ADD test.txt relativeDir/ 可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD url

COPY 命令

  • 用来将 context 目录中指定文件复制到镜像的指定目录中

  • 语法:

    1
    2
    COPY src dest
    COPY ["<src>",... "<dest>"]

VOLUME 命令

  • 用来定义容器运行时可以挂在到宿主机的目录

  • 语法:

    1
    2
    VOLUME ["/data"]
    VOLUME /data

ENTRYPOINT 命令

  • 用来指定容器启动时执行命令和 CMD 类似

  • 语法:

    1
    2
      ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2

    ENTRYPOINT 指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
    CMD 指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

docker-compose

安装与卸载

Linux 系统

在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。

1
2
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Linux 手动下载

  1. 进入GitHub下载

  2. 将文件上传到服务器(Linux 机器)

  3. 将文件放入/usr/local/bin/目录,并改名为docker-compose

    1
    mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
  4. 为其赋予可执行权限

    1
    sudo chmod +x /usr/local/bin/docker-compose

macos、windows

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用

卸载

1
sudo rm /usr/local/bin/docker-compose

文件基本格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
version: '3.2' # 官方网址 https://docs.docker.com/compose/compose-file/

services:
tomcat01: #服务名称(id)
container_name: tomcat01 # 相当于run 的 --name
image: tomcat:8.0-jre8 #使用哪个镜像 相当于run image
ports: #用来完成host与容器的端口映射关系 相当于run -p
- '8080:8080'
volumes: #完成宿主机与容器中目录数据卷共享 相当于run -v
#- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps01:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥 相当于run --networ
- hello

tomcat02: #服务名称
container_name: tomcat02
image: tomcat:8.0-jre8 #使用哪个镜像
ports: #用来完成host与容器的端口映射关系
- '8081:8080'
volumes: #完成宿主机与容器中目录数据卷共享
#- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
- tomcatwebapps02:/usr/local/tomcat/webapps
networks: #代表当前服务使用哪个网络桥
- hello

mysql:
image: mysql:5.7.32
container_name: mysql
ports:
- '3307:3306'
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- hello

redis:
image: redis:5.0.10
container_name: redis
ports:
- '6379:6379'
volumes:
- redisdata:/data
networks:
- hello
command: 'redis-server --appendonly yes' #run 镜像之后用来覆盖容器内容默认命令

volumes: #声明上面服务所使用的自动创建的卷名
tomcatwebapps01: #声明指令的卷名 compose自动创建该卷名但是会在之前加入项目名
external: #使用自定义卷名
false #true确定使用指定卷名 注意:一旦使用外部自定义卷名启动服务之前必须手动创建
tomcatwebapps02:
mysqldata:
mysqlconf:
redisdata:

networks: #定义服务用到桥
hello: #定义上面的服务用到的网桥名称 默认创建就是 bridge
external: true #使用外部指定网桥 注意:网桥必须存在

常用命令

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的使用格式。

docker-compose 命令的基本的使用格式是

1
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

命令选项

  • -f, --file FILE

    指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

  • -p, --project-name NAME

    指定项目名称,默认将使用所在目录名称作为项目名。

  • --x-networking

    使用 Docker 的可拔插网络后端特性

  • --x-network-driver DRIVER

    指定网络后端的驱动,默认为 bridge

  • --verbose

    输出更多调试信息。

  • -v, --version

    打印版本并退出。

命令使用说明

up

格式为 docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过该命令来启动一个项目。

默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl-C 停止命令时,所有容器将会停止。

默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容

如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

down

此命令将会停止 up 命令所启动的容器,并移除网络

exec

进入指定的容器。

ps

格式为 docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。-q可以只打印容器的 id 信息

restart

格式为 docker-compose restart [options] [SERVICE...]

重启项目中的服务。

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

格式为 docker-compose rm [options] [SERVICE...]

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

start

格式为 docker-compose start [SERVICE...]

启动已经存在的服务容器。

stop

格式为 docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

top

查看各个服务容器内运行的进程。

pause

格式为 docker-compose pause [SERVICE...]

暂停服务

unpause

格式为 docker-compose unpause [SERVICE...]

恢复处于暂停状态中的服务。