开发者社区> yangbingdong> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Docker入门笔记

简介: 原文链接: http://yangbingdong.com/2017/docker-learning/ Preface 为什么选择Docker?网上已经给出了很多说法,总结而言就是,趋势(这不是废话吗) 哈哈,词穷 作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势,这里也不详细列举了 Docker对于持续交付和部署的DevOps人员来说也有着重要的意义... 本篇主要记录Docker的基础学习(安装、简单使用) Concept 以下是Docker的三个基本概念。
+关注继续查看

原文链接: http://yangbingdong.com/2017/docker-learning/

Preface

为什么选择Docker?网上已经给出了很多说法,总结而言就是,趋势(这不是废话吗) 哈哈,词穷
作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势,这里也不详细列举了
Docker对于持续交付和部署的DevOps人员来说也有着重要的意义...
本篇主要记录Docker的基础学习(安装、简单使用)

Concept

以下是Docker的三个基本概念。

Image(镜像)

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

但它的存储结构类似Git,一层一层地网上盖,删除一个文件并不会真的删除,只是在那个文件上面做了一个标记为已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

Container(容器)

通俗来说,如果镜像是类,那么容器就是这个类的实例了,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器也有其特性,例如存储,不指定数据卷(Volume)的话,容器消亡数据也就跟着没了...
跟多特性请自行百度~

Repository(仓库)

仓库没啥好说的了,以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest

Install

这里以Ubuntu为例(当然是因为博主用的是Ubuntu= =),版本的话Docker目前支持的Ubuntu版本最低为12.04LTS,但从稳定性上考虑,推荐使用14.04LTS或更高的版本。

使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 安装在系统中

使用 APT 镜像源 安装

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

鉴于国内网络问题,强烈建议使用国内源

国内源

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

以上命令会添加 稳定 版本的 Docker CE APT 镜像源,如果需要最新版本的 Docker CE 请将 stable 改为 edge 或者 test 。从 Docker 17.06 开始,edge test 版本的 APT 镜像源也会包含稳定版本的 Docker

官方源

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装 Docker CE

sudo apt-get update
sudo apt-get install docker-ce

启动 Docker CE

sudo systemctl enable docker
sudo systemctl start docker

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组(貌似执行了自动安装脚本会自动建一个docker的用户组):

sudo groupadd docker

将当前用户加入 docker 组:

sudo usermod -aG docker $USER

加入docker 组之后要重启才能生效哦...

Mirror Acceleration

没有代理的话国内访问Docker Hub的速度实在感人,但Docker官方和国内很多云服务商都提供了加速器服务:

如阿里,注册并申请后会得到加速域名如https://vioqnt8w.mirror.aliyuncs.com,然后正如官方说的一样,通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://vioqnt8w.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

查看生效:

sudo docker info|grep "Registry Mirrors" -A 1

输出如下:

Registry Mirrors:
 https://vioqnt8w.mirror.aliyuncs.com/

Use Image

获取

Docker Hub 上有大量的高质量的镜像可以用,我们可以通过以下的方式获取镜像:

docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

选项可以通过docker pull --help查看。
eg,从Docker Hub下载REPOSITORYjava的所有镜像:

docker pull -a java

列出

使用docker images [OPTIONS] [REPOSITORY[:TAG]]列出已下载的镜像


列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间

OPTIONS说明:

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。

eg:

# 看到在 mongo:3.2 之后建立的镜像,想查看某个位置之前的镜像也可以,只需要把 since 换成 before 即可
docker images -f since=mongo:3.2

虚悬镜像(dangling image)

举个例子:原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:

docker images -f dangling=true

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:

docker rmi $(docker images -q -f dangling=true)

Commit

从容器创建一个新的镜像:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

eg:

docker commit -a "ybd" -m "my apache" a404c6c174a2  mymysql:v1 

当我们修改了镜像文件提交时候,可以使用docker diff [OPTIONS] CONTAINER查看修改了什么东西。
一般地,不推荐使用commit来构建镜像,之前也提过,镜像是特殊的文件系统,改了东西之后原来的基础之上叠加,使之变得越来越臃肿。此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。一般我们会使用Dockerfile定制镜像。

删除

删除镜像可以使用:

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:

-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;

一般会组合使用:

docker rmi $(docker images -q -f dangling=true)

docker rmi $(docker images -q redis)

docker rmi $(docker images -q -f before=mongo:3.2)

查看元数据

docker inspect : 获取容器/镜像的元数据。

docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]

OPTIONS说明:

-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。

实例

获取镜像mysql:5.6的元信息。

~: docker inspect mysql:5.6
[
    {
        "Id": "sha256:2c0964ec182ae9a045f866bbc2553087f6e42bfc16074a74fb820af235f070ec",
        "RepoTags": [
            "mysql:5.6"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "2016-05-24T04:01:41.168371815Z",
        "Container": "e0924bc460ff97787f34610115e9363e6363b30b8efa406e28eb495ab199ca54",
        "ContainerConfig": {
            "Hostname": "b0cf605c7757",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "3306/tcp": {}
            },
...

获取正在运行的容器mymysql的 IP。

~: docker inspect -f '' mymysql
172.17.0.3

Operating Container

开启

docker run :创建一个新的容器并运行一个命令 docker create :创建一个新的容器但不启动它

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-v: 挂载数据卷

--name="nginx-lb": 为容器指定一个名称;

--restart=always: docker启动容器也跟着启动

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;  <b>实例</b>

例如,启动一个 bash 终端,允许用户进行交互:

docker run -t -i ubuntu:14.04 /bin/bash

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

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

停止

docker stop :停止一个运行中的容器:

docker stop [OPTIONS] CONTAINER [CONTAINER...]

进入容器

使用docker exec :

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

-d :分离模式: 在后台运行

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端

例如进入ubuntu容器交互式模式:

docker exec -it ubuntu /bin/sh

导出和导入容器

导出容器快照

docker export [OPTIONS] CONTAINER

例如:

docker export 7691a814370e > ubuntu.tar

导入容器快照

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS说明:

-c :应用docker 指令创建镜像;

-m :提交时的说明文字;

例如:

docker import  ubuntu.tar ybd/ubuntu:v1

删除

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

-f :通过SIGKILL信号强制删除一个运行中的容器

-l :移除容器间的网络连接,而非容器本身

-v :-v 删除与容器关联的卷

删除所有容器:

docker rm $(docker ps -a -q)

但这并不会删除运行中的容器

列出容器

docker ps [OPTIONS]

OPTIONS说明:

-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。

例如列出最近创建的5个容器信息:

docker ps -n 5

列出所有创建的容器ID:

docker ps -a -q

Dev Env In Docker

mysql:

docker run -p 6033:3306 --name mysql-master --restart=always -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/var/log/mysql -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -idt mysql:5.7.19

redis:

docker run -p 6380:6379 --name redis-master --restart=always -v /home/ybd/docker/redis:/data -v /etc/redis/redis.conf:/usr/local/etc/redis/redis.conf -d redis:4.0.1 redis-server --appendonly yes

Last

参考:
Docker — 从入门到实践
Docker命令大全

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
docker入门安装与简单使用
快速了解 (一) Docker 是什么 官方给出的定义是:Docker是一个集开发,打包,运行应用于一体的开放式平台。Docker可以用来快速交付应用。使用Docker,你可以将应用程序从你的基础设施中分离出来,并将基础设施当做一个管理平台。
1258 0
Docker入门及centOS7下安装
Docker入门及centOS7下安装 简介:利用go语言实现的应用容器引擎 docker引擎基础是linux容器(Linux Containsers, LXC)技术 它可以使开发和运维结合的更容易 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
1345 0
Docker入门-介绍和安装
Docker容器 Docker是什么 Docker最初是dotCloud公司创建人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache2.0授权协议开源,主要项目代码在Github上进行维护。
1972 0
Docker 入门及安装[Docker 系列-1]
docker 如日中天,这不是单纯的炒概念,docker 确确实实解决了开发与运维的痛点,因此在企业开发中得到了非常广泛的使用,本文对于 docker 的这些基本知识点再做一些简单回顾。
0 0
什么,容器太多操作不过来?我选择Docker Compose梭哈(下)
什么,容器太多操作不过来?我选择Docker Compose梭哈(下)
0 0
Docker入门(3)-- docker安装
docker入门操作 hello world 示例
0 0
【云原生Docker篇】Docker的容器管理操作(上)
1、创建容器 容器创建:就是将镜像加载到容器的过程。 创建容器时如果没有指定容器名称,系统会自动创建一个名称。 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
0 0
【云原生Docker篇】Docker的容器管理操作(下)
1、创建容器 容器创建:就是将镜像加载到容器的过程。 创建容器时如果没有指定容器名称,系统会自动创建一个名称。 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
0 0
【云原生Docker篇】Docker的数据管理(数据卷、容器互联)
用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作。 容器中管理数据主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volume Dontainers)
0 0
+关注
yangbingdong
菜鸟程序员,喜欢各种折腾,浏览各种开源社区
文章
问答
文章排行榜
最热
最新
相关电子书
更多
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
立即下载
玩转Docker社区–“码头工人”的技术进阶心得
立即下载
Docker 镜像原理和最佳实践
立即下载