Docker 动手实战

前言

本文首先介绍 Docker 的整体概念,接着讲述 Docker 的基础用法,网上已经有很多好文章了,本文只是作学习记录使用。

Docker 引擎

Docker 引擎是一个客户端-服务端组件,包括:

  • server:守护进程的后台运行的程序(dockerd命令)
  • REST API:定义客户端与守护进程交互的接口
  • CLI:命令行界面(docker命令)

CLI 使用 Docker REST API 来控制 Docker 守护进程。Docker 守护进程管理 Docker 的对象,包括:

  • images(镜像)
  • containers(容器)
  • networks(网络)
  • volumes(数据卷)

Docker 架构

Docker使用客户端-服务器架构。Docker 客户端与守护进程交互,是操作容器的主要部件。Docker 客户端与守护进程可以运行在同一台机器上,你也可以通过客户端连接到远程的 Docker 守护进程。

Docker 对象

在你使用 Docker 时,你主要的工作就是创建和使用镜像容器网络数据卷插件和其它对象。

IMAGES(镜像)

包含创建Docker容器的只读模板。一个镜像经常会基于其它镜像。创建自己的镜像时,你可以使用Dockerfile。Dockerfile的语法很简洁,能够定义创建和运行容器的必要步骤。Dockerfile中的每一条指令,都会在生成的镜像中创建一个layer

CONTAINERS(容器)

镜像的运行实例。你可以通过 Docker API和CLI,来create, run, stop, move, or delete一个容器。

底层技术

Docker是使用Go语言编写,并利用了Linux内核的几个功能。

Namespaces

Docker通过一项名为namespaces的技术,来为容器提供隔离的工作环境。当你运行一个容器,Docker会为该容器创建一系列的namespaces。

Docker Engine uses namespaces such as the following on Linux:

  • The pid namespace: Process isolation (PID: Process ID).
  • The net namespace: Managing network interfaces (NET: Networking).
  • The ipc namespace: Managing access to IPC resources (IPC: InterProcess Communication).
  • The mnt namespace: Managing filesystem mount points (MNT: Mount).
  • The uts namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).

Control groups

cgroups限制应用程序所使用的资源。

Union file systems

UnionFS容器的物理界限。

Container format

Docker Engine combines the namespaces, control groups, and UnionFS into a wrapper called a container format. The default container format is libcontainer.

基本操作

安装Docker请查看官方文档,写得最详细!

启动Docker守护进程

service docker start

后台进程:

[root@localhost ~]# ps -ef | grep docker
root      89967      1  0 07:07 ?        00:00:00 /usr/bin/dockerd
root      89970  89967  0 07:07 ?        00:00:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

关闭Docker守护进程

service docker stop

搜索镜像

docker search ubuntu

其中:

  • REPOSITORY:仓库名称
  • TAG:标签名,一个仓库可以有若干个标签对应不同的镜像,默认都是latest
  • IMAGE ID:镜像ID
  • CREATED:创建时间,注意不是本地的pull时间
  • SIZE:镜像大小

获取镜像

docker pull ubuntu

查看镜像

docker images

结果:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ebcd9d4fca80        5 days ago          118 MB

创建镜像

在某个目录常见Dockerfile文件,并加入以下内容:

from ubuntu:latest
ENV HOSTNAME=yano

这个 Dockerfile 中只有两行,第一行表示基于哪个镜像创建新的镜像,类似于程序开发中的 import 或 include,我们这里以 ubuntu:latest 镜像为基础创建新的镜像。第二行是在新的镜像中我们要对基础镜像 ubuntu:latest 做的改变。这句是设置一个环境变量HOSTNAME等于yano。

使用 docker build 命令进行构建:

docker build -t yano .

这个命令中第一个参数 -t yano 指定创建的新镜像的名字,第二个参数是一个点 . 指定从当前目录查找 Dockerfile 文件。

结果:

Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu:latest
 ---> ebcd9d4fca80
Step 2/2 : ENV HOSTNAME yano
 ---> Running in b12cfea16a9f
 ---> 5263b155fb36
Removing intermediate container b12cfea16a9f
Successfully built 5263b155fb36

查看镜像:

查看 Docker 容器或镜像的一些内部信息

docker inspect ubuntu

创建容器

docker run -t -i --name ubuntu ubuntu /bin/bash

我们看到,第一行还是本机的centos,下一行已经进入了Docker的运行环境,已经是Ubuntu了。

上面命令的说明:

  • -t:分配一个 pseudo-TTY
  • -i:--interactive参数缩写,表示交互模式,如果没有 attach 保持 STDIN 打开状态
  • ubuntu:运行的镜像名称,默认为latest 标签
  • /bin/bash:容器中运行的应用

如何退出这个bash?有两种方法,两种方法的效果完全不同:

  • 直接 exit,这时候 bash 程序终止,容器进入到停止状态
  • 使用组合键退出,仍然保持容器运行,我们可以随时回来到这个bash中来,组合键是 Ctrl-p Ctrl-q,你没有看错,是两组组合键,先同时按下Ctrl和p,再按Ctrl和q。就可以退出到我们的宿主机了。

查看正在运行的容器

docker ps

结果:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ef767fad251c        ubuntu              "/bin/bash"         3 minutes ago       Up 3 minutes                            ubuntu

几个最常用的参数:

  • -a:查看所有容器,含停止运行的
  • -l:查看刚启动的容器
  • -q:只显示容器ID

停止容器

docker stop ef

注:CONTAINER ID只要写到能够标识出是哪个容器即可,不用写出全名。

启动容器

docker start ef

查看容器中运行的进程信息

docker top ubuntu

查看容器中运行的进程信息,显示容器中进程的PID,UID,PPID,时间,tty等信息。结果:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                90338               90326               0                   07:35               pts/1               00:00:00            /bin/bash

删除容器

docker rm -f ubuntu

其中ubuntu是容器的名字,不是镜像的名字。

删除镜像

docker rmi yano

连接到容器中

docker attach ubuntu

容器导出

docker export 3b > ./ubuntu.tar

当容器导出后,容器仍然在Docker环境中运行,只是拷贝了一份内容到tar包。

容器导入

将该文件加载到docker系统中,文件加载后会成为镜像,命令执行时需要制定导入后生成的镜像的名字:

cat ubuntu.tar | docker import - ubuntu:2.0

结语

对于数据卷等内容,稍后再介绍,本文只是简单记录下Docker最基本的用法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喵了个咪的博客空间

Dockerfile构建镜像

1894
来自专栏搜云库

Docker Hub 仓库使用,及搭建 Docker Registry

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中...

40410
来自专栏搜云库

Docker Hub 仓库使用,及搭建 Docker Registry

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中...

4035
来自专栏猿说1024

Docker 常用命令

2013
来自专栏搜云库

Docker Compose 1.18.0 之服务编排详解

一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过serv...

2787
来自专栏运维前线

使用容器部署静态(HTML)网站

使用容器部署静态(HTML)网站 学习如何使用Nginx来创建一个用于运行静态HTML网站的Docker镜像,会解释如何构建一个运行Nginx与HTML网站的...

2348
来自专栏搜云库

Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo

Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo

27511
来自专栏喵了个咪的博客空间

Docker使用命令和技巧

1455
来自专栏大数据架构师专家

运行第一个docker容器

之前我们已经介绍过如何在centos7下快速安装docker,关于docker安装参考链接:

1781
来自专栏应兆康的专栏

Docker 简介与安装

Github:https://github.com/yingzk/MyDocker 1. Docker 简介 Docker是一个开源(Github地址: htt...

33712

扫码关注云+社区