文章目录

  • 学习资料
  • 一、基础知识
    • 1.1 简单了解
      • 1.1.1 Docker的应用场景
      • 1.1.2 Docker 优点
      • 1.1.3 Docker和传统虚拟机的区别
    • 1.2 深入了解
      • 1.2.1 Docker架构
      • 1.2.2 Docker 镜像
        • Dockerfile
        • 查看仓库中某个应用的全部标签
        • 配置docker 仓库源
      • 1.2.3 Docker容器
      • 1.2.4 数据卷Volumes
      • 1.2.5 使用网络
        • docker network
  • 二、使用
    • 命令
      • 关于docker run -it -rm XXX中的-rm选项
    • 2.1 VMware Workstation 15 与 Docker兼容问题(Windows)
    • 2.2 CentOS 7 手动安装Docker
      • 安装docker-compose
    • 2.3 制作Docker镜像
    • 2.4 在Docker Hub上共享镜像
      • 2.4.1 创建Docker Hub账户
      • 2.4.2 创建Docker Hub仓库并推送镜像到仓库中
    • 2.5 Docker部署自定义mysql
      • 使用测试数据验证数据库是否可用
    • 2.6 Docker 配置mongo

学习资料

  1. Docker中文文档
    推荐

  2. Docker Documents
    推荐,原汁原味,更直接

  3. 菜鸟教程-Docker

  4. 为什么Docker镜像大小与仓库中不一致?

  5. docker命令

  6. Docker查看远端仓库中某个应用全部标签的工具

  7. Job for docker.service failed because the control process exited with error code. See
    vim /etc/docker/daemon.json书写不规范,会导致这个错误

  8. nsenter命令简介

  9. docker 在宿主机上根据进程PID查找归属容器ID

  10. docker学习笔记–重基础使用

  11. 使用docker run后状态为Exited (1)
    配置文件编写有问题也会导致这个问题,大概来将容器内mysql运行失败都会导致容器进入这个状态

  12. Docker之Mysql数据持久化
    https://blog.csdn.net/qq_31864653/article/details/90769142

  13. “exec: “docker-entrypoint.sh”: executable file not found in $PATH”.解决方法

一、基础知识

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

1.1 简单了解

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

1.1.1 Docker的应用场景

1.Web应用的自动化打包和发布
2.自动化测试和持续集成、发布
3.在服务型环境中部署和调整数据库或其它的后台应用。
4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

1.1.2 Docker 优点

1.快速、一致的交付应用程序

2.在任何地方开发、部署和运行任何应用

Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

3.在同一硬件上运行更多工作负载

1.1.3 Docker和传统虚拟机的区别


[翻译]传统虚拟机包含:应用、二进制文件/库和客体操作系统三部分。每一个被虚拟化的应用可能只有几或几十MB,同时需要一些二进制文件和库。但是一个被虚拟化的操作系统却可能需要几十GB。
多个虚拟机之间需要有多个guest os,guest os占用大量的空间。

[翻译]这个Docker 引擎上的容器仅包含应用和一些其它的依赖文件。Docker 引擎作为一个独立进程在主机操作系统的用户空间(userspace)内运行。每一个容器都可以共享这个Docker 引擎。因此,Docker在具备传统虚拟机资源隔离和资源分配优势的基础上,拥有更高的效率和更好的可移植性。

1.关于hypervisor:虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。

2.Guest OS:运行在Guest Machine上的操作系统

3.Docker Engine 是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。

4.Docker Hub 可以分享和管理你的images镜像的一个 Saas 服务。

1.2 深入了解

1.2.1 Docker架构

三个基本概念:镜像(Mirroring)、容器(Container)、仓库(Repository)

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

镜像(Mirroring):一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。举例:多个文件的集合θ{A1,A2,...,An}\theta\{A_1,A_2,...,A_n\}θ{A1​,A2​,...,An​}打包成镜像文件,镜像文件展开后恢复成多个文件的集合θ\thetaθ,前后数据内容完全一致。

容器(Container):容器是镜像的实例

仓库(Repository):可以看成一个代码控制中心,用于保存镜像


关键名词

名词 说明
Docker镜像 Docker 镜像是用于创建 Docker 容器的模板
Docker 容器 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端 Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

1.2.2 Docker 镜像

在Docker中,一个只读层被称为镜像。
Docker使用一个统一的文件系统,Docker进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生在顶层的可写层,而下层的原始的只读镜像文件并未发生变化。
Docker镜像是多层存储结构,镜像中的每一层都是可继承、可复用的。

  1. 父镜像
    每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。通常将下层的那个镜像成为上层镜像的父镜像。

  2. 基础镜像
    无父镜像的镜像被成为基础镜像。

  3. 镜像ID
    所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。

  4. 获取镜像,使用docker pull <镜像名称:镜像标签>命令从仓库中获取需要的镜像。
    下载过程中会输出获取镜像每一层的信息

sudo docker pull ubuntu:20.10
20.10: Pulling from library/ubuntu
0b4f5d796ad9: Pull complete
59ee7132703b: Pull complete
672e5b34dda8: Pull complete
d3af786f5e76: Pull complete
Digest: sha256:8b55362d424379a123758b70ddc2c5d3fbc3b5815d110be2a43933fa385672a3
Status: Downloaded newer image for ubuntu:20.10
docker.io/library/ubuntu:20.10

若默认的官方仓库下载速度过慢,可以使用docker pull <域名:端口号>/<镜像名称:镜像标签>指定从某个仓库下载镜像
也可以设置加速源或国内源,方法写在下面,可以参照

  1. 使用docker images显示本地已有的镜像
REPOSITORY 仓库名称
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 创建时间
VIRTUAL SIZE 镜像大小

镜像ID唯一标识了镜像
TAG信息用来标记同一个仓库的不同镜像

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,一些元数据(metadata)还包含以该镜像为基础运行的容器的行为。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

基本语法:
使用#来注释
FROM指令告诉 Docker 使用哪个镜像作为基础
接着是维护者的信息
RUN开头的指令会在创建中运行,比如安装一个软件包。

FORM指令
指出使用的模板镜像,定制镜像都是在模板镜像的基础上进行。
RUN指令
用于执行后面跟着的命令行命令,有以下两种格式:

  1. shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
  1. exec格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

Dockerfile中每一条指令都创建镜像的一层。所以过多无意义的层会导致镜像膨胀过大。一个镜像不能超过127层,镜像层属性为只读,但镜像实例化为容器时该层可读可写。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

-t标记用来添加标签 <镜像名称:镜像标签>
docker tag用于修改镜像标签
docker images列出本地镜像
docker push上传镜像到仓库中
docker save导出镜像文件到本地
docker load载入镜像

查看仓库中某个应用的全部标签

vim /home/tu/dockertags.sh

将以下内容放在dockertags.sh文件中

#!/bin/bash
function usage() {cat << HELPdockertags  --  list all tags for a Docker image on a remote registry.EXAMPLE: - list all tags for ubuntu:dockertags ubuntu- list all php tags containing apache:dockertags php apacheHELP
}if [ $# -lt 1 ]; thenusageexit
fiimage="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`if [ -n "$2" ]; thentags=` echo "${tags}" | grep "$2" `
fi
echo "${tags}"

修改权限,运行脚本,得到输出

chmod 755 dockertags.sh
./dockertags.sh ubuntu
latest
10.04
12.04
12.04.5
12.10
13.04
13.10
14.04
14.04.1
14.04.2
14.04.3
14.04.4
14.04.5
14.10
15.04
15.10
16.04
16.10
17.04
17.10
18.04
18.10
19.04
19.10
20.04
20.10
artful
artful-20170511.1
...
artful-20180706
bionic
bionic-20171114
...bionic-20200526
cosmic
cosmic-20180605
...
cosmic-20190719
devel
disco
disco-20181112
...
disco-20200114
eoan
eoan-20190508
...
eoan-20200608
focal
focal-20191030
...
focal-20200606
groovy
groovy-20200505
groovy-20200609
lucid
precise
precise-20150212
...
precise-20170331
quantal
raring
rolling
saucy
trusty
trusty-20150218.1
...

配置docker 仓库源

vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://docker.mirrors.ustc.edu.cn/","https://hub-mirror.c.163.com","https://registry.docker-cn.com"]
}

加载配置文件
重启docker

systemctl daemon-reload
systemctl restart docker

1.2.3 Docker容器

容器是镜像的的行为

  • 启动容器
    两种情形:一种是基于镜像新建一个容器并启动;
    另外一种是将处于终止状态(stopped)的容器重新启动。

  • 新建并启动
    docker run
    示例1:使用ubuntu:14.04镜像生成一个容器,在容器中执行/bin/echo 'Hello world'

sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

示例2:使用ubuntu:14.04镜像生成一个容器,在容器中执行/bin/bash,该命令会开启一个bash终端

sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。

利用 docker run来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
  1. 启动已终止的容器,docker start
    容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。
root@ba267838cc1b:/# psPID TTY          TIME CMD1 ?        00:00:00 bash11 ?        00:00:00 ps
  1. 守护态运行
    更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。
docker run -d ubuntu:20.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
cbb72f51cf163590376fefe8444cbff7f8f44e38518bbf40fb799dcc2f4b0ff7

容器会返回一个唯一的id,也可以通过docker ps命令来查看容器信息

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   14 seconds ago      Up 12 seconds

可以使用docker logs命令获取容器的输出信息

docker logs confident_swanson
hello world
hello world
hello world
hello world
. . .
  1. 终止容器,docker stop
    当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上面只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。
docker stop confident_swanson
confident_swanson

终止状态的容器可以使用docker ps -a命令看到。

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   3 minutes ago       Exited (137) 12 seconds ago                       confident_swanson
36230771220f        ubuntu:20.10        "/bin/echo 'hello wo…"   5 minutes ago       Exited (0) 5 minutes ago                          epic_bhaskara
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   24 hours ago        Exited (0) 13 hours ago                           bb
7fa85404b035        hello-world         "/hello"                 27 hours ago        Exited (0) 27 hours ago

处于终止状态的容器,可以通过docker start命令来重新启动。

docker start confident_swanson
confident_swansondocker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   5 minutes ago       Up 9 seconds                                   confident_swanson
36230771220f        ubuntu:20.10        "/bin/echo 'hello wo…"   7 minutes ago       Exited (0) 7 minutes ago                       epic_bhaskara
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   24 hours ago        Exited (0) 13 hours ago                        bb
7fa85404b035        hello-world         "/hello"                 27 hours ago        Exited (0) 27 hours ago

docker restart命令会将一个运行态的容器终止,然后再重新启动。

6.进入容器
在使用 -d参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach命令或 nsenter工具等。
但是使用 attach命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

nsenter工具在 util-linux 包2.23版本后包含。nsenter可以访问另一个进程的名字空间。nsenter要正常工作需要有 root 权限。

# nsenter -V
nsenter,来自 util-linux 2.23.2

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

docker inspect --format "{{ .State.Pid }}" <container>

通过这个 PID,就可以连接到这个容器:

nsenter --target $PID --mount --uts --ipc --net --pid

示例

$ sudo docker run -idt ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
a4a2a29f9ba4: Pull complete
127c9761dcba: Pull complete
d13bf203e905: Pull complete
4039240d2e0b: Pull complete
Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
Status: Downloaded newer image for ubuntu:latest
93bd7a1a1bdf6293519649041fb28d70fcbe493fc70dbe281c6f31fed1499c10
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
93bd7a1a1bdf        ubuntu              "/bin/bash"         48 seconds ago      Up 45 seconds                           fervent_lederberg
$ docker inspect --format "{{ .State.Pid }}" fervent_lederberg
21525
$ sudo nsenter --target 21525 --mount --uts --ipc --net --pid
root@93bd7a1a1bdf:/#

解析:

  1. docker run -idt ubuntu:
    -t选项让docker分配一个伪终端并绑定到标准输入上,-i让容器的标准输入保持打开,-i -t通常同时出现。
    -d以守护态运行容器,即容器在后台运行
  2. docker inspect --format "{{ .State.Pid }}" fervent_lederberg:
    docker inspect输出容器的低级信息,格式是Json
    --format "{{ .State.Pid }}"向输出结果传递参数,只查看Pid信息
    fervent_lederberg容器名,上文通过docker ps命令获取到的。
    3.nsenter参数详解
nsenter [options] [program [arguments]]options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录如果没有给出program,则默认执行$SHELL。

使用docker ps命令查看本地的docker 进程

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   10 hours ago        Up 10 hours         0.0.0.0:8000->8080/tcp   bb

使用docker inspect <NAME|ID>查看容器的信息,返回数据格式是json

"docker inspect" requires at least 1 argument.
See 'docker inspect --help'.Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]Return low-level information on Docker objects
# docker inspect 654a3c5ec3d1
[{"Id": "654a3c5ec3d12af094cb8a685805fa651bcaa2e1c22c1d957807c667aceaf991","Created": "2020-06-25T05:44:32.169640597Z","Path": "docker-entrypoint.sh","Args": ["npm","start"],"State": {...}}
]

docker export导出本地上的某个容器
docker import导入容器快照
docker rm删除一个处于终止状态的容器。如果要删除一个运行中的容器,可以添加-f参数。Docker 会发送 SIGKILL 信号给容器

1.2.4 数据卷Volumes

  1. 数据卷
    数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS(unix file system),可以提供很多有用的特性:
  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

*数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

  1. 创建一个数据卷
    在用 docker run命令的时候,使用-v标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
    *注意:也可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器。

  2. 挂载一个主机目录作为数据卷
    使用 -v标记也可以指定挂载一个本地主机的目录到容器中去。
    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro指定为只读。

  3. 挂载一个本地主机文件作为数据卷(不推荐!)
    -v标记也可以从主机挂载单个文件到容器中
    *注意:如果直接挂载一个文件,很多文件编辑工具,包括vi或者 sed --in-place,可能会造成文件 inode的改变,从 Docker 1.1 .0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

  4. 数据卷容器
    如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
    数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
    首先,创建一个命名的数据卷容器 dbdata:

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

还可以使用多个--volumes-from参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。

$ sudo docker run -d --name db3 --volumes-from db1 training/postgres

*注意:使用 --volumes-from参数所挂载数据卷的容器自己并不需要保持在运行状态。

如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。具体的操作将在下一节中进行讲解。

  1. 利用数据卷容器来备份、恢复、迁移数据卷
    可以利用数据卷对其中的数据进行进行备份、恢复和迁移。

  2. 备份
    首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录。

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar

8.恢复
如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后创建另一个容器,挂载 dbdata2 的容器,并使用 untar解压备份文件到挂载的容器卷中。

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar

1.2.5 使用网络

  1. 外部访问容器
    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 −P-P−P 或−p-p−p 参数来指定端口映射。
    当使用 −P-P−P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
    -p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  2. 映射所有接口地址
    使用 hostPort:containerPort格式本地的 5000 端口映射到容器的 5000 端口,可以执行

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  1. 映射到指定地址的任意端口
    使用 ip::containerPort绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用 udp 标记来指定 udp 端口

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
  1. 查看映射端口配置
    使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ docker port nostalgic_morse 5000
127.0.0.1:49155.

注意:

容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
-p 标记可以多次使用来绑定多个端口
例如

$ sudo docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py
  1. 容器互联
    容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。
    该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

  2. 自定义容器命名
    连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
    虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:
    自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web
    当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器
    使用 --name标记可以为容器自定义命名。

$ sudo docker run -d -P --name web training/webapp python app.py

使用 docker ps来验证设定的命名。

$ sudo docker ps -l
CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

也可以使用 docker inspect来查看容器的名字

$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web

注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用docker rm 来删除之前创建的同名容器。
在执行 docker run的时候如果添加 --rm标记,则容器在终止后会立刻删除。注意,--rm-d参数不能同时使用。

  1. 使用 --link参数可以让容器之间安全的进行交互。
    下面先创建一个新的数据库容器。
$ sudo docker run -d --name db training/postgres

删除之前创建的 web 容器

$ docker rm -f web

然后创建一个新的 web 容器,并将它连接到 db 容器

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

此时,db 容器和 web 容器建立互联关系。

--link参数的格式为 --link name:alias,其中 name是要链接的容器的名称,alias是这个连接的别名。
使用 docker ps来查看容器的连接

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db, web/db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  web

可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。

Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。

Docker 通过 2 种方式为容器公开连接信息:

  • 环境变量
  • 更新 /etc/hosts 文件

使用 env 命令来查看 web 容器的环境变量

$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .

其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。

除了环境变量,Docker 还添加 host 信息到父容器的/etc/hosts的文件。下面是父容器 web 的 hosts 文件

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

这里有 2 个 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。 可以在 web 容器中安装 ping 命令来测试跟db容器的连通。

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

用 ping 来测试db容器,它会解析成 172.17.0.5。 *注意:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。

用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。

docker network

docker network create --driver=bridge --subnet=172.20.0.0/16 wkcrm_network

--driver:设置网络类型为桥接(bridge)网络
--subnet:设置子网网段

资料:
docker设置固定ip地址
https://www.cnblogs.com/xuezhigu/p/8257129.html

https://docs.docker.com/engine/reference/commandline/network_create/

docker network create
https://blog.csdn.net/zhizhuodewo6/article/details/87706638

二、使用

命令

  1. 设置docker开机自启
systemctl enable docker.service
  1. docker ps // 查看所有正在运行容器

  2. docker stop containerId // containerId 是容器的ID

  3. docker ps -a // 查看所有容器

  4. docker ps -a -q // 查看所有容器ID

  5. docker stop $(docker ps -a -q) // stop停止所有容器

  6. docker rm $(docker ps -a -q) // remove删除所有容器

关于docker run -it -rm XXX中的-rm选项

使用-rm标志运行容器对于那些用于非常短暂而只是为了完成某些事情的容器是有好处的,例如,在容器内编译应用程序,或者只测试它工作的东西,然后你知道它是一个短暂的容器并告诉你的Docker守护进程一旦运行完毕,擦除与之相关的所有内容并保存磁盘空间

在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置–rm选项,这样在容器退出时就能够自动清理容器内部的文件系统。
https://blog.csdn.net/taiyangdao/article/details/73076770

2.1 VMware Workstation 15 与 Docker兼容问题(Windows)

解决方法:解决VMware Workstation 15 与Device/Credential Guard不兼容的问题

2.2 CentOS 7 手动安装Docker

  1. 存在就删除旧版本docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
已加载插件:fastestmirror, langpacks
参数 docker 没有匹配
参数 docker-client 没有匹配
参数 docker-client-latest 没有匹配
参数 docker-common 没有匹配
参数 docker-latest 没有匹配
参数 docker-latest-logrotate 没有匹配
参数 docker-logrotate 没有匹配
参数 docker-engine 没有匹配
不删除任何软件包
  1. 首次安装Docker Engine-Community之前,需要指定Docker仓库。之后可以从仓库安装和更新Docker
    设置仓库,首先安装依赖
sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile* base: mirrors.huaweicloud.com* centos-sclo-rh: mirror.bit.edu.cn* centos-sclo-sclo: mirror.bit.edu.cn* epel: mirrors.yun-idc.com* extras: mirror.bit.edu.cn* updates: mirror.bit.edu.cn
软件包 yum-utils-1.1.31-54.el7_8.noarch 已安装并且是最新版本
软件包 device-mapper-persistent-data-0.8.5-2.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.186-7.el7_8.2.x86_64 已安装并且是最新版本
无须任何处理

使用阿里源地址设置稳定的仓库

sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
  1. 安装 Docker Engine-Community
    安装最新版本
 sudo yum install docker-ce docker-ce-cli containerd.io
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...
更新完毕:docker-ce.x86_64 3:19.03.12-3.el7    docker-ce-cli.x86_64 1:19.03.12-3.el7完毕!
  1. 安装指定版本Docker
    首先查看仓库内可用版本有哪些
 yum list docker-ce --showduplicates | sort -r已加载插件:fastestmirror, langpacks
已安装的软件包
可安装的软件包* updates: mirror.bit.edu.cn
Loading mirror speeds from cached hostfile* extras: mirror.bit.edu.cn* epel: mirrors.yun-idc.com
docker-ce.x86_64            3:19.03.9-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.8-3.el7                    docker-ce-stable
docker-ce.x86_64            3:19.03.7-3.el7                    docker-ce-stable
...
docker-ce.x86_64            17.03.2.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable* centos-sclo-sclo: mirror.bit.edu.cn* centos-sclo-rh: mirror.bit.edu.cn* base: mirrors.huaweicloud.com

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

 sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  1. 启动Docker
sudo systemctl start docker
  1. 运行 hello-world 镜像验证是否正确安装了 Docker Engine-Community 。

出现docker.io: net/http: TLS handshake timeout.问题的解决方法

vim /etc/docker/daemon.json

加入以下内容:

{"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"]
}

重启dockersystemctl restart docker,使用docker info看配置是否生效

参考资料:https://zhuanlan.zhihu.com/p/164920268

sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/
  1. 运行docker image ls列出下载到计算机上的镜像
  2. 列出hello-world显示消息后退出的容器(由图像生成)。如果它仍在运行,则不需要以下--all选项

安装docker-compose

pip install docker-compose

资料:
https://blog.csdn.net/q0717168/article/details/109361349

2.3 制作Docker镜像

  1. 通过Git下载一个示例项目
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
  1. 为一个容器定义Dockerfile
    Dockerfile描述了如何为一个容器安装专有的文件系统,同时也可以包含一些元数据(metadata)来描述如何基于此镜像运行一个容器。
    Dockerfile示例
# 使用官方镜像作为父镜像
FROM node:current-slim# 设置工作目录
WORKDIR /usr/src/app# 将文件从主机复制到当前位置
COPY package.json .# 在镜像文件系统中运行该命令
RUN npm install# 通知Docker容器在运行时监听指定的端口
EXPOSE 8080# 在容器中运行指定的命令
CMD [ "npm", "start" ]# 将应用程序的其余源代码从主机复制到镜像文件系统
COPY . .
  1. 使用docker build命令通过Dockerfile文件构建镜像
    首先确保当前路径位于项目执行目录下。
docker build --tag bulletinboard:1.0 .
Sending build context to Docker daemon  45.57kB
Step 1/7 : FROM node:current-slim
current-slim: Pulling from library/node
7d2977b12acb: Pull complete
23e9a36a6e2d: Pull complete
831103f0eed4: Pull complete
f172d5646bed: Pull complete
9f1d0c9b6ec5: Pull complete
Digest: sha256:4f837156a4bc43b6c8af7195dd7dbfc0b46e6f3515f777e2cb53139dc4faee33
Status: Downloaded newer image for node:current-slim---> 0e2e78467169
...
Step 6/7 : CMD [ "npm", "start" ]---> Running in 5fb8e209296e
Removing intermediate container 5fb8e209296e---> 609ae5029141
Step 7/7 : COPY . .---> 2cfe87792e72
Successfully built 2cfe87792e72
Successfully tagged bulletinboard:1.0

Successfully tagged bulletinboard:1.0看到这个说明镜像构建成功

  1. 基于镜像来启动容器
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

–publish 要求Docker将主机端口8000上传入的流量转发到容器的端口8080。容器具有自己的专用端口集,因此,如果要从网络访问某个端口,则必须以这种方式将流量转发到该端口。否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达您的容器。
–detach 要求Docker在后台运行此容器。
–name 指定一个名称,在后续命令中,您可以使用该名称来引用您的容器bb

  1. 删除容器
docker rm --force bb

2.4 在Docker Hub上共享镜像

2.4.1 创建Docker Hub账户

  1. 访问Docker注册页面
  2. 创建Docker ID
  3. 使用docker login登录Docker Hub
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

2.4.2 创建Docker Hub仓库并推送镜像到仓库中

  1. 在Docker Hub仓库界面下搜索或创建仓库
  2. 镜像命名格式必须正确<Your Docker ID>/<Repository Name>:<tag>
    修改镜像名称
docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0
  1. 将镜像推送到Docker Hub
docker push <Your Docker ID>/bulletinboard:1.0

2.5 Docker部署自定义mysql

在官方仓库的mysql镜像页面也有较为详细的描述。传送门

  1. 这里采取重新构建镜像的方式,设置监听端口后再重新外挂配置文件,构建时需要两个文件Dockerfile和docker-entrypoint.sh获取地址
  1. 本地新建配置文件/home/mysql_config_volume/my.cnf
    直接外挂配置文件修改端口的方式是不行的,因为镜像在构建时设置的监听端口是3306或33060,外挂的配置文件修改端口为别的会出现错误,mysql无法启动,在XXX路径下确实套接字文件
  1. 在docker hub上搜索mysql,选择版本进行下载docker pull mysql:5.7.30
  2. 拉取镜像到本地docker pull mysql:5.7.30
  3. 运行docker run --name mysqldef -e MYSQL_ROOT_PASSWORD=123456 -p 8060:8060 -d mysql:5.7.30
  4. docker ps查看运行状态和id
  5. 进入docker查看配置文件位置,拉取配置文件到本地
docker cp 95e2bc0c1955:/etc/mysql/my.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/cnf.d /home
docker cp 95e2bc0c1955:/etc/mysql/conf.d /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.conf.d /home

挨个查看后mysql.cnf内有如下内容:

# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
#...
#...
#...
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

说明该文件是引用/etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/打开后查看,发现有[mysql]字段

[mysql]

mysqld.cnf内有如下字段,so,这个就可以作为配置文件

# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

在复制到本地的mysqld.cnf内加入以下内容:

#[mysqld]下追加
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
port=8060#新增
[client]
default-character-set=utf8#新增
[mysql]
default-character-set=utf8
  1. 根据使用的镜像mysql:5.7.30的DockerFile文件,进行修改后重新构建镜像
    我使用的镜像的dockerfile文件链接:传送门
    修改内容:
EXPOSE 3306 33060    改为    EXPOSE 8060文件最下方的
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
改为
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh \&& ln -s /usr/local/bin/docker-entrypoint.sh /
  1. 运行命令docker build --tag tutumysqldef:1.0 .开始构建镜像

如果Get:5 http://deb.debian.org/debian XXX XXX Packages [XXX kB]速度过慢,可以考虑换源
在dockerfile同级路径下创建source.list,在里面添加如下内容

deb https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib

在dockerfile文件下追加mv /etc/apt/sources.list /etc/apt/sources.list.bak \ mv sources.list /etc/apt/这两行代码

FROM debian:buster-slim# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysqlRUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/* \mv /etc/apt/sources.list /etc/apt/sources.list.bak \mv sources.list /etc/apt/

重新执行构建命令

ps:构建过程挺费时间的

Docker快速入门与使用相关推荐

  1. Docker快速入门实践-纯干货文章

    Docker快速入门实践-老男孩高级架构师课程内容,如果细看还能发现讲解视频呦!小伙伴们赶紧猛戳吧! 老男孩高级架构师内部学员实践文档分享! Docker快速入门实践-纯干货文章 老男孩教育2016启 ...

  2. docker快速入门_Docker标签快速入门

    docker快速入门 by Shubheksha 通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you've w ...

  3. MinIO Docker 快速入门 ​​​​​​​

    MinIO Docker 快速入门 前提条件 您的机器已经安装docker. 从 这里下载相关软件. 在Docker中运行MinIO单点模式. MinIO 需要一个持久卷来存储配置和应用数据.不过, ...

  4. MinIO Docker 快速入门

    MinIO Docker 快速入门 前提条件 您的机器已经安装docker. 从 这里下载相关软件. 在Docker中运行MinIO单点模式. MinIO 需要一个持久卷来存储配置和应用数据.不过, ...

  5. Kubernetes CKA认证运维工程师笔记-Docker快速入门

    Kubernetes CKA认证运维工程师笔记-Docker快速入门 1. Docker 概念与安装 1.1 Docker 是什么 1.2 Docker 基本组成 1.3 版本与支持平台 1.4 Do ...

  6. Docker快速入门,看这个就够了

    Docker快速入门 一.Docker介绍 1.1 Docker背景 1.2 Docker概念 1.3 Docker的优势 1.4 Docker的三个基本概念 二.Docker的安装和使用 2.1 安 ...

  7. Docker快速入门

    Docker快速入门 ​ 学习资料: [狂神说Java]Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili 文章目录 Docker快速入门 1.Docker概述 1.1 Docker 为 ...

  8. Docker 快速入门(一文上手 Docker)

    通过本篇文章,就可以达到在 Window 或 Linux 上手 Docker(有点长,可以根据目录选择你需要的内容看) 文章图片没有带过来,涉及的图片较多,就不一一挪了,大家可以直接看我 GitCha ...

  9. Docker快速入门总结笔记

    文章目录 1. Docker概述 2. 虚拟化技术和容器化技术 3. Docker的基本组成 4. Docker的安装 5. Docker的卸载 6. 配置阿里云镜像加速 8. Docker容器运行流 ...

  10. Docker快速入门总结

    目录 Docker快速入门总结 1.Docker概述 2.虚拟化技术和容器化技术 3.Docker的基本组成 4.Docker的安装 5.Docker的卸载 6.配置阿里云镜像加速 7.Docker容 ...

最新文章

  1. 如何用JavaScript操作form表单组件?
  2. tensorflow中的命令行参数介绍
  3. android 手机监听屏幕锁屏,用户解锁
  4. 5.16 12周第二课
  5. 网关和路由器的区别_5G工业路由器与5G DTU的区别介绍详解
  6. Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at
  7. request.getContextPath()取不到值
  8. php上传大文件500错误,PHP fastcgi模式大文件上传500错误
  9. 又推亲儿子,苹果与国际权威机构推出 Swift 资格认证
  10. Linux下Nginx+Tomcat整合的安装与配置
  11. jsf面试题_JSF面试问答
  12. 基于SWT的Sash和FormLayout的自定义分隔窗体
  13. 【论文笔记】From Facial Parts Responses to Face Detection: A Deep Learning Approach
  14. 【小工具】仿站小工具的使用及下载
  15. 【仿美团点餐App】—— 首页(二)
  16. linux网卡时断时续,网卡不稳定的罪魁祸首
  17. Python教你一键获得【王者荣耀全皮肤】~~~
  18. 《逆袭大学:传给IT学子的正能量》
  19. 使用URLEncoder、URLDecoder进行URL参数的转码与解码
  20. 电脑开机显示rpc服务器不可用是什么意思,请问RPC服务器不可用是什么意思?

热门文章

  1. Red Hat6 Linux镜像文件,红帽 Red Hat Linux 系统镜像iso下载(汇总.百度云)
  2. 炫酷,纯Python开发LOL英雄信息查询平台
  3. 计算机基础知识图谱,基于知识图谱的大学计算机基础习题推荐方法技术
  4. SparkSQL之UDF、UDAF、UDTF
  5. fenix3 hr 中文说明书_fenix3 中英文对照说明书.pdf
  6. 介绍汽车美容预约小程序app开发
  7. 计算机开始菜单打不开是什么原因,win10开始菜单打不开怎么办啊
  8. python中wb什么意思,使用Python,“ wb”在此代码中是什么意思?
  9. html 自动填表,Delphi WEB网页自动填表
  10. 易语言微凉模块oracle,穿透框架全智能填表微凉网页填表模块及源码