Docker学习笔记(一)-容器、镜像和客户端与守护进程

0x00 前言

一直使用过docker,但并不是太了解,于是开始学习了解一下

0x01 docker简介

1、什么是容器?

  • 一种虚拟化的方案
  • 操作系统级别的虚拟化
  • 只能运行相同或相似内核的操作系统
  • 依赖于Linux内核特性: Namespace和Cgroups (Control Group)

2、容器技术有哪些优点?
在这里插入图片描述

  • 磁盘占用空间少
  • 提供更多的服务能力和服务更多的用户

3、什么是Docker?
Docker是能将应用程序自动部署到容器的开源引擎。
使用Go语言编写(Go语言开源引擎) 项目地址
基于Apache2.0开源授权协议发行

docker的特别之处:
docker在虚拟化的容器执行环境中增加了一个应用部署引擎。该引擎目标提供一个轻量、快速的环境。
方便从开发者环境->测试环境->生产环境
4、Docker有哪些特点?(Docker的目标)

  • 提供简单轻量的建模方式
  • 职责的逻辑分离
  • 快速高效的开发生命周期
  • 鼓励使用面向服务的架构

5、Docker的使用场景

  1. 使用Docker容器开发、测试、部署服务
  2. 创建隔离的运行环境
  3. 搭建测试环境
  4. 构建多用户的平台即服务(PaaS)基础设施
  5. 提供软件即服务(SaaS)应用程序
  6. 高性能、超大规模的宿主机部署

6、Docker的基本组成

Docker Client 客户端
Docker Daemon 守护进程
Docker Image 镜像
Docker Container 容器
Docker Registry 仓库

1.Docker客户端/守护进程:
(1)C/S架构
(2)本地/远程
2.Docker Image 镜像:
(1)容器的基石
(2)层叠的只读文件系统
(3)联合加载(union mount)
在这里插入图片描述
3.Docker Container 容器:
(1)通过镜像启动
(2)启动和执行阶段
启动时,在镜像的最顶层加载一个读写文件系统(可写层)
(3)写时复制
4.Docker Registry 仓库:
(1)公有:Docker Hub
(2)私有:可自己架设

0x02 安装docker

1、验证是否安装curl

验证是否安装了curl

which curl

如果没有安装则进行安装

sudo apt-get update
sudo apt-get install curl

2、使用官方脚本自动安装docker

curl -fsSL https://get.docker.com/ubuntu/|sudo sh
或curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

3、通过版本库安装docker

1.在Ubuntu中建立ce存储库
(1)更新apt资源包

sudo apt-get update

(2)安装软件包以允许apt通过HTTPS使用存储库

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

(3)添加Docker的官方GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

可使用以下命令进行验证秘钥指纹 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

sudo apt-key fingerprint 0EBFCD88

(4)可选设定稳定存储库,可不设置,则自动使用(deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable)

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  xenial  stable"

2.安装docker-ce并配置docker
(1)更新apt资源包,并进行安装docker-ce

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

:如果需要安装特定版本,则使用以下命令获取可用的版本号,使用要安装的版本号进行安装

apt-cache madison docker-ce
sudo apt-get install -y docker-ce=<VERSION>
例如:docker-ce=18.03.0~ce-0~ubuntu

(2)基础安装完成,可以先进行测试一下是否可用

sudo docker version
sudo docker run hello-world

4、配置与卸载docker

1.配置docker
(1)省略sudo命令(感觉sudo麻烦的,可以执行这一步)
如果执行时不想使用sudo命令,可以进行设置用户组,并将当前用户增加到该组中

sudo groupadd docker
sudo usermod -aG docker $USER
注销一下,再执行以下命令
docker run hello-world

(2)添加阿里云docker加速器和ip修改(不是必须的)

{
    "registry-mirrors": ["https://(yourid).mirror.aliyuncs.com"],
    "bip":"192.168.1.1/24"
}

2.卸载docker
(1)卸载docker-ce

sudo apt-get purge docker-ce

(2)删除镜像、容器、卷

sudo rm -rf /var/lib/docker

0x03 docker容器

1、容器的基本操作

1.启动容器

docker run IMAGE [COMMAND][ARG..]
#IMAGE启动容器所用镜像
#COMMAND和ARG容器启动后运行的命令和参数
如:输出Hello World
root@qwzf:~# docker run ubuntu echo 'Hello World'
Hello World

2.启动交互式容器

docker run -i -t IMAGE /bin/bash
#-i 始终打开标准输入 --interactive=true|false 默认false
#-t 为创建的容器分配一个伪tty终端 --tty=true|false 默认是false
如:
root@qwzf:~# docker run -i -t ubuntu /bin/bash
root@c12aa40c4376:/# 

3.查看容器

docker ps [-a][-l]
#没有参数时,列出正在运行的容器
#-a 列出所有容器
#-l 列出最新创建的容器
查看已经建立起的容器
docker inspect id/容器名

4.自定义容器名

docker run --name=自定义名 -i -t IMAGE /bin/bash

5.重新启动停止的容器

docker start [-i] id/容器名
#-i可以以交互的方式来重新启动

6.删除停止的容器

docker rm id/容器名

2、守护式容器

1.什么是守护式容器

  • 长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务

2.以守护形式运行容器

运行:
docker run -i -t IMAGE /bin/bash
退出交互式bash(这样容器就会在后台运行):
Ctrl+P Ctrl+Q

3.附加到运行中的容器(再次进入容器)

docker attach id/容器名

4.启动守护式容器

docker run -d IMAGE [COMMAND][ARG..]
#-d 启用容器时使用后台的方式执行命令

5.查看容器日志

docker logs [-f][-t][--tail] 容器名
#-f 一直跟踪logs变化并返回结果 --folloes=true|false 默认false
#-t 在返回的结果上加上时间戳 --timestamps=true|false 默认false
#--tail 返回结尾处多少数量的日志 默认--tail="all"
如:显示最新的日志
root@qwzf:~# docker logs -tf --tail 0 容器名

6.查看容器内进程

docker top 容器名

7.在运行中的容器内启动新进程

docker exec [-d][-i][-t] 容器名 [COMMAND][ARG..]
如:
docker exec -i -t c12aa40c4376 /bin/bash
退出:Ctrl+P Ctrl+Q
查看:docker top c12aa40c4376

8.停止守护式容器

docker stop 容器名
#发送一个信号给容器,等待容器的停止
docker kill 容器名
#直接停止容器

0x04 docker镜像

存储位置:/var/lib/docker
查看存储驱动和存储位置:docker info

1、查看和删除镜像

1.列出镜像

docker images [选项] [REPOSITORY]
#-a 显示所有镜像,默认不显示中间层镜像,--all=false 
#-f 显示时的过滤条件,--filter=[]
#--no-trunc 不使用截断的方式显示数据
#-q 只显示镜像的唯一d,--quiet=false

在这里插入图片描述
2.镜像标签和仓库
(1)镜像的仓库 REPOSITORY
REPOSITORY 仓库:一系列镜像的集合
REGISTRY 仓库:docker镜像的存储服务
(2)镜像标签 TAG
不同镜像以标签进行区分
仓库名+标签名->镜像名 对应一个镜像的id

ubuntu:14.04
ubuntu:latest 默认

3.查看镜像

docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
#-f,--format=""
如:docker inspet ubuntu:14.04

4.删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
#-f 强制删除镜像
#--no-prune 保留被打标签的父镜像
如:
删除单个:docker rmi 镜像id
删除多个:docker ubuntu:12.04 ubuntu:14.04
删除对应的所有镜像:
docker rmi $(docker images -q ubuntu)

2、获取和推送镜像

1.查找镜像
(1)Docker Hub
(2)docker search [OPTIONS] TERM

–automated 自动化,只会显示自动化构建的镜像
–no-trunc 不使用截断的方式显示数据
-s,–stars=0 限制显示的最低星级

docker search -s 3 ubuntu

2.拉取镜像

docker pull [OPTIONS] NAME [:TAG]
#-a 匹配并下载所有标记的镜像
如:docker pull ubuntu:14.04

3.推送镜像

docker push NAME[:TAG]

3、构建镜像

  • 保存对容器的修改,并再次使用
  • 自定义镜像的能力
  • 以软件的形式打包并分发服务及其运行环境
docker commit 通过容器构建
docker build 通过Dockerfile文件构建

1.使用commit构建镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
#-a 指定镜像作者
#-m 记录镜像构建信息
#-p 不暂停正在运行的容器
如:
docker commit -a 'qwzf' -m 'nginx' 容器名 qwzf/test1(qwzf/test1 可以随便填)

2.使用Dockerfile构建镜像
Dockerfile文件:包含一切命令的文本文件
(1)创建Dockerfile

#First Dockerfile
FROM ubuntu:14.04
MAINTAINER qwzf "注册邮箱"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

(2)适用docker build 命令

docker build [OPTIONS] PATH |URL|-
#--force-rm
#--no-cache
#--pull
#-q
#--rm=true
#-t,tags="" 指定构建出镜像的名字
如:docker build -t='qwzf/test2'

每执行一步返回唯一id,即中间层镜像

0x05 docker其他操作

1、docker客户端与守护进程

在这里插入图片描述
1.docker与守护进程的通信方式
Remote API(某些情况下支持STDIN、STDOUT、STDERR)
在这里插入图片描述
2.docker与守护进程的连接方式
通过socket进行连接,docker提供的三种模式:

unix:///var/run/docker.sock #默认
tcp://host:port
fd://socketfd

在这里插入图片描述
使用docker命令行操作,就是在客户端进行操作的。
3.查看是否运行docker守护进程

ps -ef | grep docker

在这里插入图片描述
4.测试Remote API

nc -U /var/run/docker.sock #连接socket
#发出指令,查看Remote API的一个接口。执行产生docker通过Remote API返回的结果
GET /info HTTP/1.0

5.使用service命令管理

service docker start
service docker stop
service docker restart

6.启动配置文件:docker1.12版本以前/etc/default/docker,现在是/etc/docker/daemon.json
7.docker的远程访问
docker的远程访问:docker客户端和守护进程配置到不同的机器上
(1)准备:
1)两台安装docker的服务器
2)修改docker守护进程启动选项,区别服务器
docker1.12之后docker建议在/etc/docker/daemon.json文件中修改docker启动参数,而不再是
修改vim /etc/default/docker的DOCKER_OPTS参数

vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://(阿里加速器id).mirror.aliyuncs.com"],
    "labels": ["name=docker_server_1"]
}


重启docker
service docker restart
查看是否修改成功
docker info

在这里插入图片描述
参考:使用本地的docker客户端连接远程docker的守护进程

#1.12版之前
#vim /etc/default/docker
#服务端:DOCKER_OPTS="--label name=docker_server_1"
#客户端:DOCKER_OPTS="--label name=docker_server_2"

3)保证Client API和Server API版本一致
(2)修改服务器端配置
同理,docker1.12之后的修改配置/etc/docker/daemon.json文件即可

设置客户端与守护进程的连接方式为:tcp://host:port

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://kf0vxqi6.mirror.aliyuncs.com"],
  "labels": ["name=docker_server_1"],
  "hosts": ["tcp://0.0.0.0:2375"]
}

#1.12版本前
#DOCKER_OPTS="--label name=docker_server_1 -H tcp://0.0.0.0:2375"
重启docker
service docker restart
查看是否运行docker守护进程
ps -ef | grep docker

测试服务器端docker客户端连接本机守护进程
本机直接docker info连接守护进程测试,会显示不支持本地连接(一般使用方法二解决)

方法一:可使用配置环境变量或使用-H选项进行连接,参考下面客户端机器连接本机的守护进程的方式

方法二:也可以在启动选项上添加默认连接方式unix:///var/run/docker.sock
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://kf0vxqi6.mirror.aliyuncs.com"],
  "labels": ["name=docker_server_1"],
  "hosts": [
        "tcp://0.0.0.0:2375",
        "unix:///var/run/docker.sock"
    ]
}

#1.12版之前
#DOCKER_OPTS="--label name=docker_server_1 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
然后重启docker即可

(3)在客户端操作与修改客户端配置
1)在客户端操作实现远程访问

测试能否成功访问到
curl http://192.168.201.128:2375/info
实现客户端的远程访问
docker -H tcp://192.168.201.128:2375 info

2)修改客户端配置实现远程访问
使用环境变量 DOCKER_HOST,不用重复使用-H选项实现远程访问

export DOCKER_HOST="tcp://192.168.201.128:2375"
运行docker info命令测试

调回连接本机的docker守护进程,只需将环境变量置空
export DOCKER_HOST=""
#这样docker又会使用默认的连接方式:unix:///var/run/docker.sock

具体实现过程可参考:
使用本地的docker客户端连接远程docker的守护进程
Docker远程访问

0x06 后记

暂时就先学这么多吧!本次学习Docker我学习了docker的安装、docker容器和docker镜像的一些操作,docker客户端与守护进程。总的来说,收获很大,继续努力!!!


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏