docker的基本使用

Docker - 从入门到实践:https://docker_practice.gitee.io/zh-cn/

Docker的安装

1. 安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本:

1
2
3
4
## 获取脚本
$ curl -fsSL get.docker.com -o get-docker.sh
## 安装(需要sudo)
$ sudo sh get-docker.sh --mirror Aliyun

2. 验证

验证安装是否成功。

查看版本

验证docker是否安装成功:

1
2
$ docker --version
Docker version 19.03.12, build 48a66213fe

查看服务

查看docker服务是否开启:

1
2
3
4
5
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: ...
Active: inactive (dead)
Docs: https://docs.docker.com

启动docker服务:

1
$ sudo systemctl start docker

查看容器

打印当前活动的容器列表:

1
2
$docker ps
Got permission denied while trying to connect to the Docker daemon socket at ...

报错,提示权限不够。这是因为默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组:

  1. 查看 docker 用户组是否存在:

    1
    2
    $ grep docker /etc/group
    docker:x:992:
  2. 如果不存在 docker 用户组,则新建 docker 用户组:

    1
    $ sudo groupadd docker
  3. 将需要使用docker的用户加入 docker 用户组:

    1
    $ sudo usermod -aG docker $USER
    • sudo:只有管理员才能管理用户
    • usermod:管理用户角色,包括所属用户组
    • -a:append,添加
    • -G GROUPS:将用户添加进新的一个或多个用户组
    • docker:-G的参数,将用户添加进 docker 用户组
    • $USER: 当前用户,也可以显式指定用户名
  4. 重新登陆,或者刷新 docker 用户组:

    1
    $ newgrp docker

运行实例

运行一个简单的实例镜像hello-world检查docker是否可用:

1
2
3
4
5
6
7
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
1
$ docker run hello-world
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hello 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 the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share 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
2
3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 6 months ago 13.3kB

3. 加速

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如:

由于镜像服务可能出现宕机,建议同时配置多个镜像。各个镜像站测试结果请到 docker-practice/docker-registry-cn-mirror-test 查看。

国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务,具体请参考官方文档。

具体步骤为:

  1. 编辑 /etc/docker/daemon.json 文件

    1
    $ sudo vim /etc/docker/daemon.json

    填写其内容为

    1
    2
    3
    4
    5
    6
    {
    "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
    ]
    }
  2. 刷新配置文件

    1
    $ sudo systemctl daemon-reload
  3. 重启docker服务

    1
    $ sudo systemctl restart docker
  4. 检查加速器是否生效

    1
    2
    3
    $ docker info
    Registry Mirrors:
    https://dockerhub.azk8s.cn/

Docker的基本概念

Docker涉及到三个基本概念:

  • 镜像 Image:镜像是一个静态文件,它定义了一个系统运行环境,例如Ubuntu系统本身就是一个系统环境。在这个环境中我们可以运行自己的程序。
  • 容器 Container:镜像是静态定义的,它需要在我们实际操作的系统中运行才有意义。我们运行一次镜像就相当于创建了一个程序实体,这个实体包含了一个或者一组程序,容器可以被创建、启动、停止、删除、暂停等。
  • 仓库 Repository:我们可以制作自己的镜像,也可以下载别人的镜像,仓库就是存放镜像的地方。我们可以从web仓库中pull别人的镜像,也可以将本地仓库中的自定义镜像push到公共仓库中。

总结一下:镜像 是定义环境的静态文件,仓库 是存放镜像文件的地方,容器 是镜像在具体操作环境中的实例化。

最大的公共仓库:Docker Hub

下面详细介绍操作三者的指令:

1. 镜像

唯一标识

一个镜像通过 NAME[:TAG] 唯一进行标识,TAG一般说明镜像的版本信息,缺省则表示使用最新的版本,即latest。下面是两个例子:

  • ubuntu:等价于ubuntu:latest,最新的ubuntu镜像
  • python:3.6.9:版本为3.6.9的Python镜像

总结一下,这里我们定义:镜像标识 = 镜像名字:镜像版本

本地仓库

使用 docker images 可以查看本地的所有镜像,结果如下:

1
2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu latest adafef2e596e 11 hours ago 73.9MB

这里每个镜像的对应了5个字段描述:

  • REPOSITORY:镜像在仓库中的镜像名称
  • TAG:镜像的版本描述,缺省为latest
  • IMAGE ID:镜像的唯一ID
  • CREATED:镜像的创建时间
  • SIZE:镜像大小

新建副本

1
docker tag <镜像ID> <新的镜像标识>

例如:

1
docker tag 860c279d2fec runoob/centos:dev

结果如下:

1
2
3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
runoob/centos 6.7 860c279d2fec 5 hours ago 190.6 MB
runoob/centos dev 860c279d2fec 5 hours ago 190.6 MB

下载镜像

当我们创建一个容器时需要指定需要的镜像,如果这个镜像不存在于本地仓库中,将会自动从远程仓库中拉取并保存至本地;如果远程仓库中不存在对应镜像,则容器创建失败。

因此一般较好的习惯是,先下载别人制作的镜像:

1
2
docker pull <镜像标识>
# 这里ubuntu即为镜像标识,等价于ubuntu:latest

删除镜像

确保该镜像没有被任何容器使用时才能从本地仓库中移除:

1
docker rmi <镜像标识>

搜索镜像

如果我们不知道镜像在仓库中的具体标识,可以使用 docker search xxx 进行搜索,搜索结果中每个镜像通过5个字段描述:

  • NAME:仓库中镜像的名称
  • DESCRIPTION:镜像的描述
  • STARS:类似于Github里的星星数
  • OFFICIAL:是否是docker官方发布
  • AUTOMATED:……

制作镜像

如果公共仓库中的镜像不能满足我们的需求,我们可以

修改已有镜像

修改已有的镜像,我们需要进入镜像创建的容器环境里手动完成修改。

实例化一个容器(例如ID为 e218edb10161),进入交互式的bash环境:

1
2
3
docker run -it <镜像标识> /bin/bash
# 然后提示符会变成类似于
# root@e218edb10161:/#

在容器中手动修改环境后输入 exit 命令退出容器。

此时我们已对ID为 e218edb10161 的容器进行了修改,然后保存容器副本即可:

1
2
3
docker commit -m="<描述信息>" -a="<作者名>" <容器ID> <镜像标识>
# 提交成功后会显示校验码,例如
# sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

保存副本后我们可以通过docker images看到结果。

从头制作镜像

从头构建镜像需要先定义一个 Dockerfile 文件。

然后运行:

1
docker build -t <镜像标识> <Dockerfile文件所在的目录或者绝对路径>

从容器快照导入镜像

容器可以快速保存为 .tar 文件,这个压缩文件可以转移到其它宿主机上进行导入。

导入的容器快照自动添加到本地仓库的镜像中:

1
$ docker import CONTAINER.tar IMAGE

2. 容器

容器需要以镜像为基础进行实例化,容器是一个动态的实时过程,它可以被创建、启动、停止、删除、暂停等。

查看容器 ps

当前被创建的容器,包含正在运行的、被暂停的、被终止的所有容器。

查看当前处于活动状态的容器

1
docker ps
1
2
3
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
8188835eadf8 ubuntu "/bin/bash" 7 hours ago Up 7 hours bbb
ed5eb06c9484 training/webapp "python app.py" 7 hours ago Up 7 hours 0.0.0.0:32770->5000/tcp aaa

容器处于活动状态,即 STATUS = Up

如果使用docker stop xxx停止容器,此时STATUS = Exited

查看所有状态的容器

1
docker ps -a

查看最后一次创建的容器

1
docker ps -l

启动容器 run

run: 启动一个bash交互式容器

1
docker run -it <镜像标识> /bin/bash

交互式启动需要两个关键参数:

  • -i: 交互式操作
  • -t: 启用终端

输入 exit 退出交互式终端。

run: 启动一个后台容器

-d选项:–detach, Run container in background and print container ID,在后台启动docker。

所以-dit选项会在后台开启一个交互式容器,并且启动时不会进入这个容器。进入容器需要额外的指令(exec, attach)。

start: 重新启动已停止的容器

1
2
3
docker start <容器ID/NAME>
# 或者
docker restart <容器ID/NAME>

restart: 重新启动容器

不管是停止状态的还是活动状态的容器都可以通过 docker restart CONTAINER 进行重启。

端口映射

端口映射:某些容器需要和宿主机或者其它容器进行通讯,需要进行端口映射,选项是-p或者-P:

  • -p: 手动指定端口
    • docker -d -p 宿主端口:容器端口 IMAGE COMMAND
  • -P: 使用随机的端口:docker -d -P IMAGE COMMAND

使用docker port xxx查看指定容器的端口映射情况,例如:

1
2
$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000

表示当前容器的TCP5000端口映射到了宿主机的0.0.0.0:5000端口。

停止容器 stop

1
docker stop <容器ID/NAME>

停止的容器可以用docker start/restart xxx重新启动。

进入容器 exec

exec/attach命令用于进入一个已经处于Up状态的容器。

推荐使用exec命令,因为通过exec进入的容器在关闭时会在后台继续运行,而attach不行。

进入一个交互式容器:docker exec -it <容器ID/NAME> /bin/bash

删除容器 rm

如果指定容器处于结束状态,可以使用docker rm xxx安全移除该容器

如果指定容器尚处于活动状态,可以使用docker rm -f xxx强制移除该容器

使用docker container prune移除所有处于停止状态的容器

导出容器 export

将容器保存为一个快照:docker export <容器ID/NAME> > xxxx.tar

上面的指令将指定容器保存到xxxx.tar文件中,这实际上就是一个 镜像

导入容器 import

将容器快照(镜像)导入到本地仓库中:docker import xxxx.tar NEW_IMAGE

也可以从远程导入镜像:docker import http://path/xxx.tar new_image

察看日志 logs

1
docker logs CONTAINER_ID|CONTAINER_NAME

检查容器 inspect

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


3. 仓库

在终端登陆Docker Hub账号:docker login

退出登陆:docker logout

制作并推送镜像 barwe/ubuntu:20.20docker push barwe/ubuntu:20.20


参考

docker快速入门:https://www.runoob.com/docker/docker-repository.html

----- For reprint please indicate the source -----
0%