教程「入门强烈推荐」

全面:菜鸟教程

狂神说 docker https://www.bilibili.com/video/BV1og4y1q7M4

阮一峰入门教程

Docker 入门

下载

安装

CentOS

CentOS Docker 安装 | 菜鸟教程 (runoob.com)

卸载

1
2
3
4
5
# 删除安装包:
yum remove docker-ce

# 删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker

安装

Docker 支持以下的 64 位 CentOS 版本:CentOS 7、CentOS 8、更高版本…
使用官方安装脚本自动安装,安装命令如下:

1
2
3
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh

启动

1
2
service docker start
docker ps

概念

镜像

镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

容器

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

系统时区

目前几乎所有的 Docker Image 的时区都是 UTC「世界标准时间」

启动容器时指定时区:

1
-e TZ='Asia/Shanghai'

镜像加速

参考:https://juejin.im/post/5cd2cf01f265da0374189441

加速器

建议根据运行 Docker 的云平台选择对应的镜像加速服务

镜像加速器 镜像加速器地址
Docker 中国官方镜像 https://registry.docker-cn.com
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
腾讯云 https://mirror.ccs.tencentyun.com
网易云 https://hub-mirror.c.163.com
七牛云 https://reg-mirror.qiniu.com
阿里云 https://.mirror.aliyuncs.com

配置

Windows

image-20200729071540938

Mac

1

image-20200729071352260

Ubuntu14.04、Debian7Wheezy

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:

1
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

重新启动服务:

1
$ sudo service docker restart

Ubuntu16.04+、Debian8+、CentOS7

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

1
2
3
4
5
6
7
{
"registry-mirrors": [
"https://ustc-edu-cn.mirror.aliyuncs.com/",
"https://ccr.ccs.tencentyun.com/",
"https://docker.m.daocloud.io/"
]
}

之后重新启动服务:

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

检查加速器是否生效

1
2
3
4
5
$ docker info
Registry Mirrors:
https://hub-mirror.c.163.com/
https://reg-mirror.qiniu.com/
https://xxxxx.mirror.aliyuncs.com/

命令

  1. 显示 Docker 的版本信息

    1
    2
    % docker -v
    Docker version 19.03.5, build 633a0ea
  2. 列出本地镜像

    1
    2
    3
    4
    5
    % docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    dockerpracticesig/docker_practice latest e0739c901de5 4 days ago 46.5MB
    spring-boot-demo-docker 1.0.0-SNAPSHOT b4a8a5630e0d 3 weeks ago 121MB
    nginx latest 6678c7c2e56c 5 weeks ago 127MB

    类似的有:docker image ls

  3. 删除镜像

    1
    2
    3
    docker image rm xxx
    //示例
    docker image rm rabbitmq:stomp
  4. 列出正在运行的容器

    1
    2
    3
    4
    % docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    df9418f8e43c dockerpracticesig/docker_practice "nginx -g 'daemon of…" 12 hours ago Up 12 hours 0.0.0.0:4000->80/tcp dreamy_bassi
    a3400150814f elasticsearch:6.5.3 "/usr/local/bin/dock…" 2 weeks ago Up 12 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch-6.5.3

    docker container ls -a包含未启动、已启动、已停止的容器

  5. 启动

    1
    2
    3
    4
    5
    6
    7
    //新建并启动
    docker run xxx
    //示例
    docker run -t -i ubuntu:18.04 /bin/bash

    //启动已终止容器
    docker container start xxx「CONTAINER ID」
  6. 查看容器完整 command 的命令

    1
    docker ps -a --no-trunc
  7. 进入容器 shell

    1
    docker exec -it containerid /bin/bash
  8. 终止容器

    1
    docker container stop xxx
  9. 容器重命名

    1
    docker rename my_container my_new_container
  10. 重启容器

    1
    docker restart {container_id}
  11. 删除容器

1
2
3
4
5
//删除一个处于终止状态的容器
docker container rm xxx

//删除一个运行中的容器,可以添加 -f 参数
docker container rm -f xxx
  1. 清理所有处于终止状态的容器
1
docker container prune
  1. 获取容器的输出信息「日志」
1
docker logs -f xxx「container ID」

等价于 docker container logs [container ID or NAMES]

  1. 宿主机和容器间复制文件 docker cp

    1
    2
    3
    docker cp  df9418f8e43c:/etc/nginx/nginx.conf /Users/mac126/Desktop

    docker cp /Users/mac126/Desktop/nginx.conf df9418f8e43c:/etc/nginx/

问题解决

  1. docker pull ubuntu

    1
    2
    Using default tag: latest
    Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
    1. 配置 DNS

      • vi /etc/resolv.conf

        1
        2
        nameserver 114.114.114.114
        nameserver 114.114.115.115
      • 重启网络

        1
        service networking restart
    2. 修改镜像仓库地址

      • vim /etc/docker/daemon.json

        1
        2
        3
        {
        "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
        }
    3. 重启守护进程

      1
      2
      systemctl daemon-reload
      systemctl restart docker

使用

https://www.runoob.com/docker/docker-container-usage.html

docker 服务自动重启设置

1
systemctl enable docker.service

docker 重启后容器也自动重启

  1. 容器启动时

    1
    docker run --restart always
  2. 已经启动了

    1
    docker update --restart always <CONTAINER ID>

实例

image-20200623172947756

Portainer

参考《Docker-可视化工具》

YApi

Openjdk

说明

从尺寸上来讲,alpine 最小、slim 稍大、默认的最大。所以应该尽可能的使用 alpine 版本的,如果发现程序的运行环境缺少某些东西,那么尝试用 slim 版本或者默认版本。就目前的经验来讲:

如果需要操作系统字体库,那么就得使用 slim 版本或者默认版本。需要操作系统字体库的程序例如:图片验证码、PDF 导出。
如果需要某些 Linux 标准的动态 / 静态连接库,那么在 alpine 版本不行的情况下,尝试 slim 版本或默认版本。因为 alpine 版本是一个及其精简的 Linux,它删除了很多东西

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker pull openjdk:8-jdk
docker images

#设置东八区
-e TZ='Asia/Shanghai'
docker run -itd --name openjdk8 -e TZ='Asia/Shanghai' openjdk:8-jdk

#进入容器
docker exec -it openjdk8 sh

#检测 Java 版本
java -version

#查看日期
date

SpringBoot「废弃,参考《SpringBoot-Docker部署》」

本 demo 主要演示了如何容器化一个 Spring Boot 项目。通过 Dockerfile 的方式打包成一个 images

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基础镜像
FROM openjdk:8-jdk-alpine

# 作者信息
MAINTAINER "联系方式"

# 添加一个存储空间
VOLUME /tmp

# 暴露8080端口
EXPOSE 8080

# 添加变量,如果使用dockerfile-maven-plugin,则会自动替换这里的变量内容
ARG JAR_FILE=target/spring-boot-demo-docker.jar

# 往容器中添加jar包
ADD ${JAR_FILE} app.jar

# 启动镜像自动运行程序
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"]

打包方式

手动打包
  1. 前往 Dockerfile 目录,打开命令行执行

    1
    $ docker build -t spring-boot-demo-docker .
  2. 查看生成镜像

    1
    2
    3
    4
    5
    $ docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE
    spring-boot-demo-docker latest bc29a29ffca0 2 hours ago 119MB
    openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB
  3. 运行

    1
    $ docker run -d -p 9090:8080 spring-boot-demo-docker
使用 maven 插件打包
  1. pom.xml 中添加插件

    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
    <artifactId>spring-boot-demo-docker</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-demo-docker</name>
    <description>Demo project for Spring Boot</description>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <dockerfile-version>1.4.9</dockerfile-version>
    </properties>

    <build>
    <finalName>spring-boot-demo-docker</finalName>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${dockerfile-version}</version>
    <configuration>
    <repository>${project.build.finalName}</repository>
    <tag>${project.version}</tag>
    <buildArgs>
    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
    </buildArgs>
    </configuration>
    <executions>
    <!--设置运行 mvn package 的时候自动执行docker build-->
    <execution>
    <id>default</id>
    <phase>package</phase>
    <goals>
    <goal>build</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
  2. 执行mvn打包命令,因为插件中 execution 节点配置了 package,所以会在打包的时候自动执行 build 命令

    1
    $ mvn clean package -Dmaven.test.skip=true
  3. 查看镜像

    1
    2
    3
    4
    5
    $ docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE
    spring-boot-demo-docker 1.0.0-SNAPSHOT bc29a29ffca0 2 hours ago 119MB
    openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB
  4. 运行

    1
    $ docker run -d -p 9090:8080 spring-boot-demo-docker:1.0.0-SNAPSHOT

参考

MySQL

参考《MySQL-Docker》

Redis

参考《Redis-Docker》

Nginx

参考《Nginx-Docker》

ElasticSearch

参考《ElasticSearch-Docker》

Tomcat

参考《Tomcat-Docker》

Oracle

参考《Oracle-Docker》

RabbitMQ

参考《Rabbitmq-Docker》

MongoDB

参考《MongoDB》