Docker入门学习

Docker入门学习

Docker安装

Docker Hello World

docker run ubuntu:15.10 /bin/echo "Hello world"

解释:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo “Hello world”: 在启动的容器里执行的命令
运行交互式的容器
docker run -i -t ubuntu:15.10 /bin/bash
  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

在这里插入图片描述

运行 exit 命令或者使用 CTRL+D 来退出容器。

后台启动容器
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

在这里插入图片描述

返回的长串代表的是容器ID“adfe9755…”

docker ps用来查看容器

在这里插入图片描述

  • CONTAINER ID: 容器 ID。

  • IMAGE: 使用的镜像。

  • COMMAND: 启动容器时运行的命令。

  • CREATED: 容器的创建时间。

  • STATUS: 容器状态。

    状态有7种:

    • created(已创建)
    • restarting(重启中)
    • running 或 Up(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

  • NAMES: 自动分配的容器名称。

宿主主机内使用 docker logs 命令,查看容器内的标准输出:

在这里插入图片描述

停止容器

docker stop "容器id"

在这里插入图片描述

Docker 容器使用

获取镜像

如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:

docker pull ubuntu
启动已停止运行的容器

查看所有的容器命令如下:

 docker ps -a

使用 docker start 启动一个已停止的容器:

 docker start 

在这里插入图片描述

进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

  • docker attach
  • docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
导出和导入容器
导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

docker export a9dd521 > ubuntu.tar

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

cat ubuntu.tar | docker import - test/ubuntu:v1

在这里插入图片描述

删除容器

docker container prune 命令可以清理掉所有处于终止状态的容器。

在这里插入图片描述

docker rm

在这里插入图片描述

运行 web 应用

尝试使用 docker 构建一个 web 应用程序。

在docker容器中运行一个 Python Flask 应用来运行一个web应用。

docker pull training/webapp  # 载入镜像
docker run -d -P training/webapp python app.py
  • **-d:**让容器在后台运行。
  • **-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。

在运行docker pull training/webapp出现错误“Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: TLS handshake timeout”

解决办法参考:https://blog.csdn.net/qq_40893942/article/details/127011382

在这里插入图片描述

可以看到多了端口信息

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49153 上。

这时我们可以通过浏览器访问WEB应用

在这里插入图片描述

通过 -p 参数来设置不一样的端口:

docker run -d -p 5000:5000 training/webapp python app.py

容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

网络端口的快捷方式

通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

上面我们创建的 web 应用容器 ID 为 85dbbbfdf937 名字为 distracted_bell

我可以使用 docker port 85dbbbfdf937docker port distracted_bell 来查看容器端口的映射情况。

查看 WEB 应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

检查 WEB 应用程序

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。

docker ps -l 查询最后一次创建的容器:

  docker ps -l 

正在运行的容器,我们可以使用 docker restart 命令来重启。

移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

删除容器时,容器必须是停止状态,否则会报错

Docker 镜像使用

docker images:列出镜像

docker pull xxx:当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

docker search xxx:查找镜像

docker rmi hello-world:删除镜像

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 Dockerfile 指令来创建一个新的镜像
更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

[root@VM-4-4-centos ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@b6c6dd942ccb:/# apt-get update

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 b6c6dd942ccb的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

[root@VM-4-4-centos ~]# docker commit -m="has update,but failed." -a="qingchen" b6c6dd942ccb qingchen/ubuntu:v2
sha256:f19c33de62bdd0d04e9cb1f261a4b5748ee818e9eddc310f4996554abc8081ac

参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • **b6c6dd942ccb:**容器 ID
  • qingchen/ubuntu:v2: 指定要创建的目标镜像名

docker images 命令查看qingchen/ubuntu:v2

构建镜像

命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

[root@VM-4-4-centos ~]# vim Dockerfile 

FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"

RUN /bin/echo 'root:123456' |chpasswd
RUN useradd qingchen
RUN /bin/echo 'qingchen:123456' |chpasswd
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D

使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

[root@VM-4-4-centos ~]# docker build -t qingchen/centos:6.7 .
Sending build context to Docker daemon  26.11kB
Step 1/8 : FROM centos:6.7
 ---> 9f1de3c6ad53
Step 2/8 : MAINTAINER Fisher "fisher@sudops.com"
......
Successfully built bdd2ecffec26
Successfully tagged qingchen/centos:6.7

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签

docker tag bdd2ecffec26 qingchen/centos:dev

docker tag 镜像ID,这里是 bdd2ecffec26 ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

Docker容器连接

网络端口映射

前面的 web 应用时使用了运行python应用命令

docker run -d -P training/webapp python app.py

我们使用 -P、-p 绑定端口号

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

另外,还可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

docker port 命令可以让我们快捷地查看端口的绑定情况。

Docker 容器互联

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,也可以使用 –name 标识来命名容器,例如:

docker run -d -P --name 周杰伦 training/webapp python app.py

PS:命名规则不能是中文 ,only [a-zA-Z0-9][a-zA-Z0-9_.-]

新建网络

下面先创建一个新的 Docker 网络。

docker network create -d bridge test-net

在这里插入图片描述

-d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode。

连接容器

运行一个容器并连接到新建的 test-net 网络:

docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

docker run -itd --name test2 --network test-net ubuntu /bin/bash

通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

apt-get update
apt install iputils-ping

如果多个容器之间需要互相连接,推荐使用 Docker Compose。

配置 DNS

在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

配置完,需要重启 docker 才能生效。

重启docker服务:
systemctl restart docker / service docker restart

查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf
手动指定容器的配置

如果只想在指定的容器设置 DNS,则可以使用以下命令:

docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

–rm:容器退出时自动清理容器内部的文件系统。

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

如果在容器启动时没有指定 –dns–dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

FROM nginx
RUN echo '从本地构建的nginx镜像' > /usr/share/nginx/html/index.html

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN **yum** -y **install** **wget**
RUN **wget** -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN **tar** -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN **yum** -y **install** **wget** \
  **&&** **wget** -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  **&&** **tar** -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

docker build -t nginx:v1 .

最后的 . 代表本次执行的上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

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

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

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

Dockerfile指令
  • FROM:构建镜像基于哪个镜像

  • MAINTAINER:镜像维护者姓名或邮箱地址

  • RUN:构建镜像执行的命令,每一次RUN都会构建一层

  • CMD:容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数

  • VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器

  • USER:为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户

  • WORKDIR:为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录

  • HEALTHCHECH:健康检查

  • ARG:构建时指定的一些参数

  • EXPOSE:声明容器的服务端口(仅仅是声明)

  • ENV:设置容器环境变量

  • ADD:拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压

  • COPY:拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能

  • ENTRYPOINT:运行容器时执行的shell命令

Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
Compose 安装
  • 下载二进制包
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • 可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
  • 创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

[root@VM-4-4-centos ~]# docker-compose version
Docker Compose version v2.4.1

Compose 使用
准备

创建测试目录

$ mkdir composetest
$ cd composetest

创建一个名为 app.py 的文件

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

创建另一个名为 requirements.txt 的文件,内容如下:

flask
redis
2、创建 Dockerfile 文件

创建一个名为 Dockerfile 的文件,内容如下:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
  • FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。

  • WORKDIR /code: 将工作目录设置为 /code。

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0
    

    设置 flask 命令使用的环境变量。

  • RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。

  • COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    

    复制 requirements.txt 并安装 Python 依赖项。

  • COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。

  • CMD [“flask”, “run”]: 容器提供默认的执行命令为:flask run。

3.创建 docker-compose.yml

创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

该 Compose 文件定义了两个服务:web 和 redis。

  • web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
4、使用 Compose 命令构建和运行
docker-compose up -d
yml 配置指令参考

Swarm 集群管理

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

原理

swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

img

参考链接:https://www.runoob.com/docker/docker-tutorial.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清尘丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值